@qq33357486/oh-my-task 1.4.0 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/README.md +121 -236
  2. package/dist/__tests__/auth-admin.test.d.ts +2 -0
  3. package/dist/__tests__/auth-admin.test.d.ts.map +1 -0
  4. package/dist/__tests__/auth-admin.test.js +440 -0
  5. package/dist/__tests__/auth-admin.test.js.map +1 -0
  6. package/dist/__tests__/auth-login-logout.test.d.ts +2 -0
  7. package/dist/__tests__/auth-login-logout.test.d.ts.map +1 -0
  8. package/dist/__tests__/auth-login-logout.test.js +400 -0
  9. package/dist/__tests__/auth-login-logout.test.js.map +1 -0
  10. package/dist/__tests__/auth-password.test.d.ts +2 -0
  11. package/dist/__tests__/auth-password.test.d.ts.map +1 -0
  12. package/dist/__tests__/auth-password.test.js +419 -0
  13. package/dist/__tests__/auth-password.test.js.map +1 -0
  14. package/dist/__tests__/auth-register.test.d.ts +2 -0
  15. package/dist/__tests__/auth-register.test.d.ts.map +1 -0
  16. package/dist/__tests__/auth-register.test.js +379 -0
  17. package/dist/__tests__/auth-register.test.js.map +1 -0
  18. package/dist/__tests__/auth-tokens.test.d.ts +2 -0
  19. package/dist/__tests__/auth-tokens.test.d.ts.map +1 -0
  20. package/dist/__tests__/auth-tokens.test.js +392 -0
  21. package/dist/__tests__/auth-tokens.test.js.map +1 -0
  22. package/dist/__tests__/db-schema.test.d.ts +2 -0
  23. package/dist/__tests__/db-schema.test.d.ts.map +1 -0
  24. package/dist/__tests__/db-schema.test.js +245 -0
  25. package/dist/__tests__/db-schema.test.js.map +1 -0
  26. package/dist/__tests__/express-server.test.d.ts +2 -0
  27. package/dist/__tests__/express-server.test.d.ts.map +1 -0
  28. package/dist/__tests__/express-server.test.js +119 -0
  29. package/dist/__tests__/express-server.test.js.map +1 -0
  30. package/dist/__tests__/fix-hcaptcha-dev-bypass.test.d.ts +2 -0
  31. package/dist/__tests__/fix-hcaptcha-dev-bypass.test.d.ts.map +1 -0
  32. package/dist/__tests__/fix-hcaptcha-dev-bypass.test.js +270 -0
  33. package/dist/__tests__/fix-hcaptcha-dev-bypass.test.js.map +1 -0
  34. package/dist/__tests__/mcp/mcp-tools.test.d.ts +2 -0
  35. package/dist/__tests__/mcp/mcp-tools.test.d.ts.map +1 -0
  36. package/dist/__tests__/mcp/mcp-tools.test.js +547 -0
  37. package/dist/__tests__/mcp/mcp-tools.test.js.map +1 -0
  38. package/dist/__tests__/projects.test.d.ts +2 -0
  39. package/dist/__tests__/projects.test.d.ts.map +1 -0
  40. package/dist/__tests__/projects.test.js +406 -0
  41. package/dist/__tests__/projects.test.js.map +1 -0
  42. package/dist/__tests__/schedule.test.d.ts +2 -0
  43. package/dist/__tests__/schedule.test.d.ts.map +1 -0
  44. package/dist/__tests__/schedule.test.js +587 -0
  45. package/dist/__tests__/schedule.test.js.map +1 -0
  46. package/dist/__tests__/tasks-crud.test.d.ts +2 -0
  47. package/dist/__tests__/tasks-crud.test.d.ts.map +1 -0
  48. package/dist/__tests__/tasks-crud.test.js +606 -0
  49. package/dist/__tests__/tasks-crud.test.js.map +1 -0
  50. package/dist/__tests__/tasks-lifecycle.test.d.ts +2 -0
  51. package/dist/__tests__/tasks-lifecycle.test.d.ts.map +1 -0
  52. package/dist/__tests__/tasks-lifecycle.test.js +712 -0
  53. package/dist/__tests__/tasks-lifecycle.test.js.map +1 -0
  54. package/dist/__tests__/versions.test.d.ts +2 -0
  55. package/dist/__tests__/versions.test.d.ts.map +1 -0
  56. package/dist/__tests__/versions.test.js +613 -0
  57. package/dist/__tests__/versions.test.js.map +1 -0
  58. package/dist/api/middleware/auth.d.ts +1 -2
  59. package/dist/api/middleware/auth.d.ts.map +1 -1
  60. package/dist/api/middleware/auth.js +5 -12
  61. package/dist/api/middleware/auth.js.map +1 -1
  62. package/dist/api/middleware/captcha.d.ts +8 -0
  63. package/dist/api/middleware/captcha.d.ts.map +1 -1
  64. package/dist/api/middleware/captcha.js +29 -4
  65. package/dist/api/middleware/captcha.js.map +1 -1
  66. package/dist/api/middleware/ownerCheck.d.ts +0 -5
  67. package/dist/api/middleware/ownerCheck.d.ts.map +1 -1
  68. package/dist/api/middleware/ownerCheck.js +15 -49
  69. package/dist/api/middleware/ownerCheck.js.map +1 -1
  70. package/dist/api/routes/{sops.d.ts → admin.d.ts} +1 -1
  71. package/dist/api/routes/admin.d.ts.map +1 -0
  72. package/dist/api/routes/admin.js +20 -0
  73. package/dist/api/routes/admin.js.map +1 -0
  74. package/dist/api/routes/auth.d.ts.map +1 -1
  75. package/dist/api/routes/auth.js +65 -14
  76. package/dist/api/routes/auth.js.map +1 -1
  77. package/dist/api/routes/config.d.ts.map +1 -1
  78. package/dist/api/routes/config.js +6 -1
  79. package/dist/api/routes/config.js.map +1 -1
  80. package/dist/api/routes/projects.d.ts.map +1 -1
  81. package/dist/api/routes/projects.js +29 -18
  82. package/dist/api/routes/projects.js.map +1 -1
  83. package/dist/api/routes/tasks.d.ts.map +1 -1
  84. package/dist/api/routes/tasks.js +79 -104
  85. package/dist/api/routes/tasks.js.map +1 -1
  86. package/dist/api/routes/tokens.d.ts.map +1 -1
  87. package/dist/api/routes/tokens.js +11 -8
  88. package/dist/api/routes/tokens.js.map +1 -1
  89. package/dist/api/routes/users.d.ts.map +1 -1
  90. package/dist/api/routes/users.js +7 -59
  91. package/dist/api/routes/users.js.map +1 -1
  92. package/dist/api/routes/versions.d.ts.map +1 -1
  93. package/dist/api/routes/versions.js +63 -34
  94. package/dist/api/routes/versions.js.map +1 -1
  95. package/dist/api/server.d.ts.map +1 -1
  96. package/dist/api/server.js +23 -14
  97. package/dist/api/server.js.map +1 -1
  98. package/dist/db/connection.d.ts.map +1 -1
  99. package/dist/db/connection.js +40 -118
  100. package/dist/db/connection.js.map +1 -1
  101. package/dist/mcp/server.d.ts.map +1 -1
  102. package/dist/mcp/server.js +15 -64
  103. package/dist/mcp/server.js.map +1 -1
  104. package/dist/mcp/tools/activate-task.d.ts.map +1 -1
  105. package/dist/mcp/tools/activate-task.js +3 -17
  106. package/dist/mcp/tools/activate-task.js.map +1 -1
  107. package/dist/mcp/tools/{get-next-task.d.ts → auto-schedule.d.ts} +3 -3
  108. package/dist/mcp/tools/auto-schedule.d.ts.map +1 -0
  109. package/dist/mcp/tools/auto-schedule.js +59 -0
  110. package/dist/mcp/tools/auto-schedule.js.map +1 -0
  111. package/dist/mcp/tools/complete-task.d.ts.map +1 -1
  112. package/dist/mcp/tools/complete-task.js +2 -12
  113. package/dist/mcp/tools/complete-task.js.map +1 -1
  114. package/dist/mcp/tools/create-task.d.ts.map +1 -1
  115. package/dist/mcp/tools/create-task.js +33 -38
  116. package/dist/mcp/tools/create-task.js.map +1 -1
  117. package/dist/mcp/tools/create-version.d.ts.map +1 -1
  118. package/dist/mcp/tools/create-version.js +2 -17
  119. package/dist/mcp/tools/create-version.js.map +1 -1
  120. package/dist/mcp/tools/{get-task-context.d.ts → get-current-task.d.ts} +3 -3
  121. package/dist/mcp/tools/get-current-task.d.ts.map +1 -0
  122. package/dist/mcp/tools/get-current-task.js +85 -0
  123. package/dist/mcp/tools/get-current-task.js.map +1 -0
  124. package/dist/mcp/tools/get-task.d.ts.map +1 -1
  125. package/dist/mcp/tools/get-task.js +7 -12
  126. package/dist/mcp/tools/get-task.js.map +1 -1
  127. package/dist/mcp/tools/init-project.d.ts +0 -2
  128. package/dist/mcp/tools/init-project.d.ts.map +1 -1
  129. package/dist/mcp/tools/init-project.js +39 -75
  130. package/dist/mcp/tools/init-project.js.map +1 -1
  131. package/dist/mcp/tools/list-tasks.d.ts.map +1 -1
  132. package/dist/mcp/tools/list-tasks.js +8 -33
  133. package/dist/mcp/tools/list-tasks.js.map +1 -1
  134. package/dist/mcp/tools/list-versions.d.ts.map +1 -1
  135. package/dist/mcp/tools/list-versions.js +16 -25
  136. package/dist/mcp/tools/list-versions.js.map +1 -1
  137. package/dist/mcp/tools/utils/config.js +1 -1
  138. package/dist/mcp/tools/utils/config.js.map +1 -1
  139. package/dist/services/admin.service.d.ts +27 -0
  140. package/dist/services/admin.service.d.ts.map +1 -0
  141. package/dist/services/admin.service.js +88 -0
  142. package/dist/services/admin.service.js.map +1 -0
  143. package/dist/services/config.service.d.ts +1 -0
  144. package/dist/services/config.service.d.ts.map +1 -1
  145. package/dist/services/config.service.js +7 -0
  146. package/dist/services/config.service.js.map +1 -1
  147. package/dist/services/project.service.d.ts +7 -7
  148. package/dist/services/project.service.d.ts.map +1 -1
  149. package/dist/services/project.service.js +47 -40
  150. package/dist/services/project.service.js.map +1 -1
  151. package/dist/services/schedule.service.d.ts +6 -0
  152. package/dist/services/schedule.service.d.ts.map +1 -1
  153. package/dist/services/schedule.service.js +36 -12
  154. package/dist/services/schedule.service.js.map +1 -1
  155. package/dist/services/task.service.d.ts +6 -18
  156. package/dist/services/task.service.d.ts.map +1 -1
  157. package/dist/services/task.service.js +161 -194
  158. package/dist/services/task.service.js.map +1 -1
  159. package/dist/services/token.service.d.ts +1 -0
  160. package/dist/services/token.service.d.ts.map +1 -1
  161. package/dist/services/token.service.js +5 -2
  162. package/dist/services/token.service.js.map +1 -1
  163. package/dist/services/user.service.d.ts +0 -32
  164. package/dist/services/user.service.d.ts.map +1 -1
  165. package/dist/services/user.service.js +13 -110
  166. package/dist/services/user.service.js.map +1 -1
  167. package/dist/services/version.service.d.ts +26 -8
  168. package/dist/services/version.service.d.ts.map +1 -1
  169. package/dist/services/version.service.js +149 -41
  170. package/dist/services/version.service.js.map +1 -1
  171. package/dist/types/index.d.ts +17 -60
  172. package/dist/types/index.d.ts.map +1 -1
  173. package/package.json +4 -13
  174. package/src/db/schema.sql +113 -70
  175. package/dist/api/routes/sops.d.ts.map +0 -1
  176. package/dist/api/routes/sops.js +0 -155
  177. package/dist/api/routes/sops.js.map +0 -1
  178. package/dist/mcp/tools/add-task-note.d.ts +0 -10
  179. package/dist/mcp/tools/add-task-note.d.ts.map +0 -1
  180. package/dist/mcp/tools/add-task-note.js +0 -46
  181. package/dist/mcp/tools/add-task-note.js.map +0 -1
  182. package/dist/mcp/tools/approve-task.d.ts +0 -10
  183. package/dist/mcp/tools/approve-task.d.ts.map +0 -1
  184. package/dist/mcp/tools/approve-task.js +0 -59
  185. package/dist/mcp/tools/approve-task.js.map +0 -1
  186. package/dist/mcp/tools/archive-version.d.ts +0 -10
  187. package/dist/mcp/tools/archive-version.d.ts.map +0 -1
  188. package/dist/mcp/tools/archive-version.js +0 -57
  189. package/dist/mcp/tools/archive-version.js.map +0 -1
  190. package/dist/mcp/tools/assign-task.d.ts +0 -10
  191. package/dist/mcp/tools/assign-task.d.ts.map +0 -1
  192. package/dist/mcp/tools/assign-task.js +0 -53
  193. package/dist/mcp/tools/assign-task.js.map +0 -1
  194. package/dist/mcp/tools/create-sop.d.ts +0 -10
  195. package/dist/mcp/tools/create-sop.d.ts.map +0 -1
  196. package/dist/mcp/tools/create-sop.js +0 -90
  197. package/dist/mcp/tools/create-sop.js.map +0 -1
  198. package/dist/mcp/tools/get-my-tasks.d.ts +0 -10
  199. package/dist/mcp/tools/get-my-tasks.d.ts.map +0 -1
  200. package/dist/mcp/tools/get-my-tasks.js +0 -88
  201. package/dist/mcp/tools/get-my-tasks.js.map +0 -1
  202. package/dist/mcp/tools/get-next-task.d.ts.map +0 -1
  203. package/dist/mcp/tools/get-next-task.js +0 -84
  204. package/dist/mcp/tools/get-next-task.js.map +0 -1
  205. package/dist/mcp/tools/get-sop.d.ts +0 -10
  206. package/dist/mcp/tools/get-sop.d.ts.map +0 -1
  207. package/dist/mcp/tools/get-sop.js +0 -67
  208. package/dist/mcp/tools/get-sop.js.map +0 -1
  209. package/dist/mcp/tools/get-task-context.d.ts.map +0 -1
  210. package/dist/mcp/tools/get-task-context.js +0 -114
  211. package/dist/mcp/tools/get-task-context.js.map +0 -1
  212. package/dist/mcp/tools/helpers.d.ts +0 -10
  213. package/dist/mcp/tools/helpers.d.ts.map +0 -1
  214. package/dist/mcp/tools/helpers.js +0 -17
  215. package/dist/mcp/tools/helpers.js.map +0 -1
  216. package/dist/mcp/tools/list-sops.d.ts +0 -10
  217. package/dist/mcp/tools/list-sops.d.ts.map +0 -1
  218. package/dist/mcp/tools/list-sops.js +0 -57
  219. package/dist/mcp/tools/list-sops.js.map +0 -1
  220. package/dist/mcp/tools/reject-task.d.ts +0 -10
  221. package/dist/mcp/tools/reject-task.d.ts.map +0 -1
  222. package/dist/mcp/tools/reject-task.js +0 -63
  223. package/dist/mcp/tools/reject-task.js.map +0 -1
  224. package/dist/mcp/tools/reschedule.d.ts +0 -17
  225. package/dist/mcp/tools/reschedule.d.ts.map +0 -1
  226. package/dist/mcp/tools/reschedule.js +0 -107
  227. package/dist/mcp/tools/reschedule.js.map +0 -1
  228. package/dist/mcp/tools/start-task.d.ts +0 -10
  229. package/dist/mcp/tools/start-task.d.ts.map +0 -1
  230. package/dist/mcp/tools/start-task.js +0 -42
  231. package/dist/mcp/tools/start-task.js.map +0 -1
  232. package/dist/mcp/tools/submit-for-review.d.ts +0 -10
  233. package/dist/mcp/tools/submit-for-review.d.ts.map +0 -1
  234. package/dist/mcp/tools/submit-for-review.js +0 -64
  235. package/dist/mcp/tools/submit-for-review.js.map +0 -1
  236. package/dist/mcp/tools/update-sop.d.ts +0 -10
  237. package/dist/mcp/tools/update-sop.d.ts.map +0 -1
  238. package/dist/mcp/tools/update-sop.js +0 -113
  239. package/dist/mcp/tools/update-sop.js.map +0 -1
  240. package/dist/mcp/tools/update-task-doc.d.ts +0 -10
  241. package/dist/mcp/tools/update-task-doc.d.ts.map +0 -1
  242. package/dist/mcp/tools/update-task-doc.js +0 -70
  243. package/dist/mcp/tools/update-task-doc.js.map +0 -1
  244. package/dist/mcp/tools/update-task.d.ts +0 -10
  245. package/dist/mcp/tools/update-task.d.ts.map +0 -1
  246. package/dist/mcp/tools/update-task.js +0 -106
  247. package/dist/mcp/tools/update-task.js.map +0 -1
  248. package/dist/services/sop.service.d.ts +0 -53
  249. package/dist/services/sop.service.d.ts.map +0 -1
  250. package/dist/services/sop.service.js +0 -275
  251. package/dist/services/sop.service.js.map +0 -1
@@ -0,0 +1,406 @@
1
+ import { describe, it, expect, beforeAll, afterAll, beforeEach } from 'vitest';
2
+ import request from 'supertest';
3
+ import Database from 'better-sqlite3';
4
+ import { mkdirSync, rmSync, existsSync, readFileSync } from 'fs';
5
+ import { join } from 'path';
6
+ import { tmpdir } from 'os';
7
+ // 每个测试用唯一的临时目录,避免并行测试冲突
8
+ let TEST_DIR;
9
+ let TEST_DB_PATH;
10
+ let app;
11
+ // 测试用户 cookie
12
+ let user1Cookie;
13
+ let user2Cookie;
14
+ let user1Id;
15
+ let user2Id;
16
+ beforeAll(async () => {
17
+ TEST_DIR = join(tmpdir(), `omt-projects-test-${Date.now()}`);
18
+ TEST_DB_PATH = join(TEST_DIR, 'data', 'data.db');
19
+ mkdirSync(join(TEST_DIR, 'data'), { recursive: true });
20
+ process.env.DB_PATH = TEST_DB_PATH;
21
+ // 初始化数据库
22
+ const db = new Database(TEST_DB_PATH);
23
+ db.pragma('journal_mode = WAL');
24
+ db.pragma('foreign_keys = ON');
25
+ const schemaSql = readFileSync(join(process.cwd(), 'src', 'db', 'schema.sql'), 'utf-8');
26
+ db.exec(schemaSql);
27
+ db.close();
28
+ // 动态导入 app(需要在数据库初始化后)
29
+ const serverModule = await import('../api/server.js');
30
+ app = serverModule.default;
31
+ });
32
+ afterAll(() => {
33
+ try {
34
+ if (existsSync(TEST_DIR)) {
35
+ rmSync(TEST_DIR, { recursive: true, force: true });
36
+ }
37
+ }
38
+ catch {
39
+ // Windows 可能因文件锁定无法立即删除
40
+ }
41
+ delete process.env.DB_PATH;
42
+ });
43
+ beforeEach(async () => {
44
+ // 注册用户1(admin)
45
+ const res1 = await request(app)
46
+ .post('/api/auth/register')
47
+ .send({
48
+ name: 'User1',
49
+ email: `user1-${Date.now()}@test.com`,
50
+ password: 'UserPass123'
51
+ });
52
+ user1Cookie = res1.headers['set-cookie']?.[0] || '';
53
+ user1Id = res1.body.data?.user?.id || '';
54
+ // 注册用户2(member)
55
+ const res2 = await request(app)
56
+ .post('/api/auth/register')
57
+ .send({
58
+ name: 'User2',
59
+ email: `user2-${Date.now()}@test.com`,
60
+ password: 'UserPass123'
61
+ });
62
+ user2Cookie = res2.headers['set-cookie']?.[0] || '';
63
+ user2Id = res2.body.data?.user?.id || '';
64
+ });
65
+ describe('POST /api/projects', () => {
66
+ it('VAL-CORE-001: 创建项目成功,返回 { id, name, owner_id }', async () => {
67
+ const res = await request(app)
68
+ .post('/api/projects')
69
+ .set('Cookie', user1Cookie)
70
+ .send({ name: '测试项目' });
71
+ expect(res.status).toBe(201);
72
+ expect(res.body.success).toBe(true);
73
+ expect(res.body.data).toHaveProperty('id');
74
+ expect(res.body.data.name).toBe('测试项目');
75
+ expect(res.body.data.owner_id).toBe(user1Id);
76
+ });
77
+ it('VAL-CORE-002: 同一用户创建同名项目返回 409', async () => {
78
+ // 先创建一个项目
79
+ await request(app)
80
+ .post('/api/projects')
81
+ .set('Cookie', user1Cookie)
82
+ .send({ name: '同名项目' });
83
+ // 再次创建同名项目
84
+ const res = await request(app)
85
+ .post('/api/projects')
86
+ .set('Cookie', user1Cookie)
87
+ .send({ name: '同名项目' });
88
+ expect(res.status).toBe(409);
89
+ expect(res.body.success).toBe(false);
90
+ expect(res.body.error).toContain('已存在');
91
+ });
92
+ it('不同用户可以创建同名项目', async () => {
93
+ // 用户1创建
94
+ await request(app)
95
+ .post('/api/projects')
96
+ .set('Cookie', user1Cookie)
97
+ .send({ name: '共同项目名' });
98
+ // 用户2创建同名
99
+ const res = await request(app)
100
+ .post('/api/projects')
101
+ .set('Cookie', user2Cookie)
102
+ .send({ name: '共同项目名' });
103
+ expect(res.status).toBe(201);
104
+ expect(res.body.success).toBe(true);
105
+ expect(res.body.data.owner_id).toBe(user2Id);
106
+ });
107
+ it('创建项目时可附带描述', async () => {
108
+ const res = await request(app)
109
+ .post('/api/projects')
110
+ .set('Cookie', user1Cookie)
111
+ .send({ name: '有描述的项目', description: '这是一个测试描述' });
112
+ expect(res.status).toBe(201);
113
+ expect(res.body.data.description).toBe('这是一个测试描述');
114
+ });
115
+ it('名称为空时返回 400', async () => {
116
+ const res = await request(app)
117
+ .post('/api/projects')
118
+ .set('Cookie', user1Cookie)
119
+ .send({ name: '' });
120
+ expect(res.status).toBe(400);
121
+ expect(res.body.success).toBe(false);
122
+ });
123
+ it('缺少名称时返回 400', async () => {
124
+ const res = await request(app)
125
+ .post('/api/projects')
126
+ .set('Cookie', user1Cookie)
127
+ .send({});
128
+ expect(res.status).toBe(400);
129
+ expect(res.body.success).toBe(false);
130
+ });
131
+ it('未认证时返回 401', async () => {
132
+ const res = await request(app)
133
+ .post('/api/projects')
134
+ .send({ name: '未认证项目' });
135
+ expect(res.status).toBe(401);
136
+ });
137
+ });
138
+ describe('GET /api/projects', () => {
139
+ it('VAL-CORE-003: 返回当前用户拥有的所有项目', async () => {
140
+ // 用户1创建两个项目
141
+ await request(app)
142
+ .post('/api/projects')
143
+ .set('Cookie', user1Cookie)
144
+ .send({ name: '项目A' });
145
+ await request(app)
146
+ .post('/api/projects')
147
+ .set('Cookie', user1Cookie)
148
+ .send({ name: '项目B' });
149
+ // 用户2创建一个项目
150
+ await request(app)
151
+ .post('/api/projects')
152
+ .set('Cookie', user2Cookie)
153
+ .send({ name: '项目C' });
154
+ // 获取用户1的项目列表
155
+ const res = await request(app)
156
+ .get('/api/projects')
157
+ .set('Cookie', user1Cookie);
158
+ expect(res.status).toBe(200);
159
+ expect(res.body.success).toBe(true);
160
+ expect(Array.isArray(res.body.data)).toBe(true);
161
+ // 用户1应该有 2 个项目
162
+ expect(res.body.data.length).toBeGreaterThanOrEqual(2);
163
+ // 不应包含用户2的项目
164
+ const projectNames = res.body.data.map((p) => p.name);
165
+ expect(projectNames).toContain('项目A');
166
+ expect(projectNames).toContain('项目B');
167
+ expect(projectNames).not.toContain('项目C');
168
+ });
169
+ it('VAL-CORE-006: 他人项目不可见', async () => {
170
+ // 用户1创建项目
171
+ await request(app)
172
+ .post('/api/projects')
173
+ .set('Cookie', user1Cookie)
174
+ .send({ name: '私有项目' });
175
+ // 用户2查看项目列表
176
+ const res = await request(app)
177
+ .get('/api/projects')
178
+ .set('Cookie', user2Cookie);
179
+ expect(res.status).toBe(200);
180
+ const projectNames = res.body.data.map((p) => p.name);
181
+ expect(projectNames).not.toContain('私有项目');
182
+ });
183
+ it('未认证时返回 401', async () => {
184
+ const res = await request(app)
185
+ .get('/api/projects');
186
+ expect(res.status).toBe(401);
187
+ });
188
+ });
189
+ describe('GET /api/projects/:id', () => {
190
+ it('获取自己的项目详情', async () => {
191
+ const createRes = await request(app)
192
+ .post('/api/projects')
193
+ .set('Cookie', user1Cookie)
194
+ .send({ name: '详情项目' });
195
+ const projectId = createRes.body.data.id;
196
+ const res = await request(app)
197
+ .get(`/api/projects/${projectId}`)
198
+ .set('Cookie', user1Cookie);
199
+ expect(res.status).toBe(200);
200
+ expect(res.body.success).toBe(true);
201
+ expect(res.body.data.id).toBe(projectId);
202
+ expect(res.body.data.name).toBe('详情项目');
203
+ });
204
+ it('VAL-CORE-006: 访问他人项目返回 404', async () => {
205
+ const createRes = await request(app)
206
+ .post('/api/projects')
207
+ .set('Cookie', user1Cookie)
208
+ .send({ name: '他人项目' });
209
+ const projectId = createRes.body.data.id;
210
+ // 用户2尝试访问用户1的项目
211
+ const res = await request(app)
212
+ .get(`/api/projects/${projectId}`)
213
+ .set('Cookie', user2Cookie);
214
+ expect(res.status).toBe(404);
215
+ expect(res.body.success).toBe(false);
216
+ });
217
+ it('访问不存在的项目返回 404', async () => {
218
+ const res = await request(app)
219
+ .get('/api/projects/nonexistent-id')
220
+ .set('Cookie', user1Cookie);
221
+ expect(res.status).toBe(404);
222
+ });
223
+ });
224
+ describe('PUT /api/projects/:id', () => {
225
+ it('VAL-CORE-004: 更新项目名称成功', async () => {
226
+ const createRes = await request(app)
227
+ .post('/api/projects')
228
+ .set('Cookie', user1Cookie)
229
+ .send({ name: '原始名称' });
230
+ const projectId = createRes.body.data.id;
231
+ const res = await request(app)
232
+ .put(`/api/projects/${projectId}`)
233
+ .set('Cookie', user1Cookie)
234
+ .send({ name: '更新后名称' });
235
+ expect(res.status).toBe(200);
236
+ expect(res.body.success).toBe(true);
237
+ expect(res.body.data.name).toBe('更新后名称');
238
+ // 通过 GET 确认更新
239
+ const getRes = await request(app)
240
+ .get(`/api/projects/${projectId}`)
241
+ .set('Cookie', user1Cookie);
242
+ expect(getRes.body.data.name).toBe('更新后名称');
243
+ });
244
+ it('更新项目描述成功', async () => {
245
+ const createRes = await request(app)
246
+ .post('/api/projects')
247
+ .set('Cookie', user1Cookie)
248
+ .send({ name: '描述项目' });
249
+ const projectId = createRes.body.data.id;
250
+ const res = await request(app)
251
+ .put(`/api/projects/${projectId}`)
252
+ .set('Cookie', user1Cookie)
253
+ .send({ description: '新描述' });
254
+ expect(res.status).toBe(200);
255
+ expect(res.body.data.description).toBe('新描述');
256
+ });
257
+ it('同时更新名称和描述', async () => {
258
+ const createRes = await request(app)
259
+ .post('/api/projects')
260
+ .set('Cookie', user1Cookie)
261
+ .send({ name: '旧名称', description: '旧描述' });
262
+ const projectId = createRes.body.data.id;
263
+ const res = await request(app)
264
+ .put(`/api/projects/${projectId}`)
265
+ .set('Cookie', user1Cookie)
266
+ .send({ name: '新名称', description: '新描述' });
267
+ expect(res.status).toBe(200);
268
+ expect(res.body.data.name).toBe('新名称');
269
+ expect(res.body.data.description).toBe('新描述');
270
+ });
271
+ it('VAL-CORE-006: 更新他人项目返回 404', async () => {
272
+ const createRes = await request(app)
273
+ .post('/api/projects')
274
+ .set('Cookie', user1Cookie)
275
+ .send({ name: '不能改' });
276
+ const projectId = createRes.body.data.id;
277
+ const res = await request(app)
278
+ .put(`/api/projects/${projectId}`)
279
+ .set('Cookie', user2Cookie)
280
+ .send({ name: '试图修改' });
281
+ expect(res.status).toBe(404);
282
+ });
283
+ it('更新为同名项目返回 409', async () => {
284
+ // 创建两个项目
285
+ await request(app)
286
+ .post('/api/projects')
287
+ .set('Cookie', user1Cookie)
288
+ .send({ name: '项目X' });
289
+ const createRes2 = await request(app)
290
+ .post('/api/projects')
291
+ .set('Cookie', user1Cookie)
292
+ .send({ name: '项目Y' });
293
+ const projectIdY = createRes2.body.data.id;
294
+ // 将项目Y改名为项目X(同名冲突)
295
+ const res = await request(app)
296
+ .put(`/api/projects/${projectIdY}`)
297
+ .set('Cookie', user1Cookie)
298
+ .send({ name: '项目X' });
299
+ expect(res.status).toBe(409);
300
+ expect(res.body.success).toBe(false);
301
+ });
302
+ it('更新不存在的项目返回 404', async () => {
303
+ const res = await request(app)
304
+ .put('/api/projects/nonexistent-id')
305
+ .set('Cookie', user1Cookie)
306
+ .send({ name: '不存在' });
307
+ expect(res.status).toBe(404);
308
+ });
309
+ });
310
+ describe('DELETE /api/projects/:id', () => {
311
+ it('VAL-CORE-005: 删除项目成功', async () => {
312
+ const createRes = await request(app)
313
+ .post('/api/projects')
314
+ .set('Cookie', user1Cookie)
315
+ .send({ name: '待删除项目' });
316
+ const projectId = createRes.body.data.id;
317
+ const res = await request(app)
318
+ .delete(`/api/projects/${projectId}`)
319
+ .set('Cookie', user1Cookie);
320
+ expect(res.status).toBe(200);
321
+ expect(res.body.success).toBe(true);
322
+ // 确认已删除
323
+ const getRes = await request(app)
324
+ .get(`/api/projects/${projectId}`)
325
+ .set('Cookie', user1Cookie);
326
+ expect(getRes.status).toBe(404);
327
+ });
328
+ it('VAL-CORE-005: 删除项目级联删除版本和任务', async () => {
329
+ // 创建项目
330
+ const createRes = await request(app)
331
+ .post('/api/projects')
332
+ .set('Cookie', user1Cookie)
333
+ .send({ name: '级联删除项目' });
334
+ const projectId = createRes.body.data.id;
335
+ // 创建版本
336
+ await request(app)
337
+ .post('/api/versions')
338
+ .set('Cookie', user1Cookie)
339
+ .send({ project_id: projectId, name: 'v1' });
340
+ // 创建任务
341
+ await request(app)
342
+ .post('/api/tasks')
343
+ .set('Cookie', user1Cookie)
344
+ .send({ project_id: projectId, title: '任务1' });
345
+ // 确认版本存在
346
+ const versionsBefore = await request(app)
347
+ .get(`/api/versions?project_id=${projectId}`)
348
+ .set('Cookie', user1Cookie);
349
+ expect(versionsBefore.body.data.length).toBeGreaterThan(0);
350
+ // 确认任务存在
351
+ const tasksBefore = await request(app)
352
+ .get(`/api/tasks?project_id=${projectId}`)
353
+ .set('Cookie', user1Cookie);
354
+ expect(tasksBefore.body.data.length).toBeGreaterThan(0);
355
+ // 删除项目
356
+ const deleteRes = await request(app)
357
+ .delete(`/api/projects/${projectId}`)
358
+ .set('Cookie', user1Cookie);
359
+ expect(deleteRes.status).toBe(200);
360
+ // 确认项目已删除(访问项目返回 404)
361
+ const projectAfter = await request(app)
362
+ .get(`/api/projects/${projectId}`)
363
+ .set('Cookie', user1Cookie);
364
+ expect(projectAfter.status).toBe(404);
365
+ // 确认版本不再返回(项目不存在,返回 404)
366
+ const versionsAfter = await request(app)
367
+ .get(`/api/versions?project_id=${projectId}`)
368
+ .set('Cookie', user1Cookie);
369
+ expect(versionsAfter.status).toBe(404);
370
+ });
371
+ it('VAL-CORE-006: 删除他人项目返回 404', async () => {
372
+ const createRes = await request(app)
373
+ .post('/api/projects')
374
+ .set('Cookie', user1Cookie)
375
+ .send({ name: '不能删' });
376
+ const projectId = createRes.body.data.id;
377
+ const res = await request(app)
378
+ .delete(`/api/projects/${projectId}`)
379
+ .set('Cookie', user2Cookie);
380
+ expect(res.status).toBe(404);
381
+ });
382
+ it('删除不存在的项目返回 404', async () => {
383
+ const res = await request(app)
384
+ .delete('/api/projects/nonexistent-id')
385
+ .set('Cookie', user1Cookie);
386
+ expect(res.status).toBe(404);
387
+ });
388
+ it('删除后列表不再包含该项目', async () => {
389
+ const createRes = await request(app)
390
+ .post('/api/projects')
391
+ .set('Cookie', user1Cookie)
392
+ .send({ name: '列表删除测试' });
393
+ const projectId = createRes.body.data.id;
394
+ // 删除
395
+ await request(app)
396
+ .delete(`/api/projects/${projectId}`)
397
+ .set('Cookie', user1Cookie);
398
+ // 获取列表
399
+ const listRes = await request(app)
400
+ .get('/api/projects')
401
+ .set('Cookie', user1Cookie);
402
+ const ids = listRes.body.data.map((p) => p.id);
403
+ expect(ids).not.toContain(projectId);
404
+ });
405
+ });
406
+ //# sourceMappingURL=projects.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.test.js","sourceRoot":"","sources":["../../src/__tests__/projects.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=schedule.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/schedule.test.ts"],"names":[],"mappings":""}