| 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 |