返回 AiToEarn
task.e2e-spec.ts
根目录 / project / aitoearn-electron / server / test / task / task.e2e-spec.ts
1 import { Agent } from '../agent';
2 import supertest from 'supertest';
3 import { Model } from 'mongoose';
4 import { getModelToken } from '@nestjs/mongoose';
5 import { Task, TaskType } from '../../src/db/schema/task.schema';
6 import { UserTask, UserTaskStatus } from '../../src/db/schema/user-task.schema';
7 import { task, user } from '../mockData';
8
9 describe('TaskController (e2e)', () => {
10 let agent: supertest.Agent;
11 let taskModel: Model<Task>;
12 let userTaskModel: Model<UserTask>;
13
14 beforeAll(async () => {
15 agent = Agent.get();
16
17 taskModel = Agent.app().get(getModelToken(Task.name));
18 userTaskModel = Agent.app().get(getModelToken(UserTask.name));
19 });
20
21 beforeEach(async () => {
22 // 清理测试数据
23 await taskModel.deleteMany({});
24 await userTaskModel.deleteMany({});
25 });
26
27 describe('任务相关接口', () => {
28 it('应该能获取任务列表', async () => {
29 // 创建两个测试任务
30 await taskModel.create([task, { ...task, title: '测试任务2' }]);
31
32 const response = await agent
33 .get('/tasks/list')
34 .query({ page: 1, pageSize: 10 })
35 .expect(200);
36
37 expect(response.body.data.items).toHaveLength(2);
38 expect(response.body.data.meta.totalItems).toBe(2);
39 expect(response.body.data.meta.currentPage).toBe(1);
40 expect(response.body.data.meta.itemsPerPage).toBe(10);
41 });
42
43 it('应该能按条件筛选任务列表', async () => {
44 // 创建两个测试任务,一个满足条件,一个不满足
45 await taskModel.create([
46 task,
47 {
48 ...task,
49 type: TaskType.ARTICLE,
50 requiresShoppingCart: false,
51 },
52 ]);
53
54 const response = await agent
55 .get('/tasks/list')
56 .query({
57 type: TaskType.PRODUCT,
58 requiresShoppingCart: true,
59 })
60 .expect(200);
61
62 expect(response.body.data.items).toHaveLength(1);
63 expect(response.body.data.items[0].type).toBe(TaskType.PRODUCT);
64 expect(response.body.data.items[0].requiresShoppingCart).toBe(true);
65 });
66
67 it('应该能获取任务详情', async () => {
68 const createdTask = await taskModel.create(task);
69
70 const response = await agent
71 .get(`/tasks/info/${createdTask._id}`)
72 .expect(200);
73
74 const { data } = response.body;
75 expect(data.title).toBe(task.title);
76 expect(data.type).toBe(task.type);
77 expect(data.price).toBe(task.price);
78 expect(data.commission).toBe(task.commission);
79 expect(data.maxRecruits).toBe(task.maxRecruits);
80 expect(data.deadline).toBe(task.deadline.toISOString());
81 expect(data.firstTimeBonus).toBe(task.firstTimeBonus);
82 expect(data.reward).toBe(task.reward);
83 });
84
85 it('应该能申请任务', async () => {
86 const createdTask = await taskModel.create(task);
87
88 // 申请任务
89 await agent.post(`/tasks/apply/${createdTask._id}`).expect(201);
90
91 // 验证用户任务记录
92 const userTask = await userTaskModel.findOne({
93 taskId: createdTask._id.toString(),
94 userId: user._id.toString(),
95 });
96 expect(userTask).toBeDefined();
97 expect(userTask.status).toBe(UserTaskStatus.PENDING);
98
99 // 验证任务申请人数更新
100 const updatedTask = await taskModel.findById(createdTask._id);
101 expect(updatedTask.currentRecruits).toBe(1);
102 });
103
104 it('不能重复申请同一个任务', async () => {
105 const createdTask = await taskModel.create(task);
106
107 // 第一次申请成功
108 await agent.post(`/tasks/apply/${createdTask._id}`).expect(201);
109
110 // 第二次申请应该失败
111 await agent.post(`/tasks/apply/${createdTask._id}`).expect(400);
112 });
113
114 it('任务招募人数达到上限时不能申请', async () => {
115 // 创建一个已达到招募上限的任务
116 const createdTask = await taskModel.create({
117 ...task,
118 currentRecruits: task.maxRecruits,
119 });
120
121 // 尝试申请任务,应该返回400错误
122 await agent.post(`/tasks/apply/${createdTask._id}`).expect(400);
123 });
124 });
125 });
126
126 lines TYPESCRIPT