@qq33357486/oh-my-task 1.4.0 → 1.4.2

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 (255) 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 +342 -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 +85 -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 +106 -20
  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 +52 -117
  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 +11 -34
  164. package/dist/services/user.service.d.ts.map +1 -1
  165. package/dist/services/user.service.js +54 -113
  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/dist/utils/email.d.ts +6 -0
  174. package/dist/utils/email.d.ts.map +1 -0
  175. package/dist/utils/email.js +28 -0
  176. package/dist/utils/email.js.map +1 -0
  177. package/package.json +6 -13
  178. package/src/db/schema.sql +113 -70
  179. package/dist/api/routes/sops.d.ts.map +0 -1
  180. package/dist/api/routes/sops.js +0 -155
  181. package/dist/api/routes/sops.js.map +0 -1
  182. package/dist/mcp/tools/add-task-note.d.ts +0 -10
  183. package/dist/mcp/tools/add-task-note.d.ts.map +0 -1
  184. package/dist/mcp/tools/add-task-note.js +0 -46
  185. package/dist/mcp/tools/add-task-note.js.map +0 -1
  186. package/dist/mcp/tools/approve-task.d.ts +0 -10
  187. package/dist/mcp/tools/approve-task.d.ts.map +0 -1
  188. package/dist/mcp/tools/approve-task.js +0 -59
  189. package/dist/mcp/tools/approve-task.js.map +0 -1
  190. package/dist/mcp/tools/archive-version.d.ts +0 -10
  191. package/dist/mcp/tools/archive-version.d.ts.map +0 -1
  192. package/dist/mcp/tools/archive-version.js +0 -57
  193. package/dist/mcp/tools/archive-version.js.map +0 -1
  194. package/dist/mcp/tools/assign-task.d.ts +0 -10
  195. package/dist/mcp/tools/assign-task.d.ts.map +0 -1
  196. package/dist/mcp/tools/assign-task.js +0 -53
  197. package/dist/mcp/tools/assign-task.js.map +0 -1
  198. package/dist/mcp/tools/create-sop.d.ts +0 -10
  199. package/dist/mcp/tools/create-sop.d.ts.map +0 -1
  200. package/dist/mcp/tools/create-sop.js +0 -90
  201. package/dist/mcp/tools/create-sop.js.map +0 -1
  202. package/dist/mcp/tools/get-my-tasks.d.ts +0 -10
  203. package/dist/mcp/tools/get-my-tasks.d.ts.map +0 -1
  204. package/dist/mcp/tools/get-my-tasks.js +0 -88
  205. package/dist/mcp/tools/get-my-tasks.js.map +0 -1
  206. package/dist/mcp/tools/get-next-task.d.ts.map +0 -1
  207. package/dist/mcp/tools/get-next-task.js +0 -84
  208. package/dist/mcp/tools/get-next-task.js.map +0 -1
  209. package/dist/mcp/tools/get-sop.d.ts +0 -10
  210. package/dist/mcp/tools/get-sop.d.ts.map +0 -1
  211. package/dist/mcp/tools/get-sop.js +0 -67
  212. package/dist/mcp/tools/get-sop.js.map +0 -1
  213. package/dist/mcp/tools/get-task-context.d.ts.map +0 -1
  214. package/dist/mcp/tools/get-task-context.js +0 -114
  215. package/dist/mcp/tools/get-task-context.js.map +0 -1
  216. package/dist/mcp/tools/helpers.d.ts +0 -10
  217. package/dist/mcp/tools/helpers.d.ts.map +0 -1
  218. package/dist/mcp/tools/helpers.js +0 -17
  219. package/dist/mcp/tools/helpers.js.map +0 -1
  220. package/dist/mcp/tools/list-sops.d.ts +0 -10
  221. package/dist/mcp/tools/list-sops.d.ts.map +0 -1
  222. package/dist/mcp/tools/list-sops.js +0 -57
  223. package/dist/mcp/tools/list-sops.js.map +0 -1
  224. package/dist/mcp/tools/reject-task.d.ts +0 -10
  225. package/dist/mcp/tools/reject-task.d.ts.map +0 -1
  226. package/dist/mcp/tools/reject-task.js +0 -63
  227. package/dist/mcp/tools/reject-task.js.map +0 -1
  228. package/dist/mcp/tools/reschedule.d.ts +0 -17
  229. package/dist/mcp/tools/reschedule.d.ts.map +0 -1
  230. package/dist/mcp/tools/reschedule.js +0 -107
  231. package/dist/mcp/tools/reschedule.js.map +0 -1
  232. package/dist/mcp/tools/start-task.d.ts +0 -10
  233. package/dist/mcp/tools/start-task.d.ts.map +0 -1
  234. package/dist/mcp/tools/start-task.js +0 -42
  235. package/dist/mcp/tools/start-task.js.map +0 -1
  236. package/dist/mcp/tools/submit-for-review.d.ts +0 -10
  237. package/dist/mcp/tools/submit-for-review.d.ts.map +0 -1
  238. package/dist/mcp/tools/submit-for-review.js +0 -64
  239. package/dist/mcp/tools/submit-for-review.js.map +0 -1
  240. package/dist/mcp/tools/update-sop.d.ts +0 -10
  241. package/dist/mcp/tools/update-sop.d.ts.map +0 -1
  242. package/dist/mcp/tools/update-sop.js +0 -113
  243. package/dist/mcp/tools/update-sop.js.map +0 -1
  244. package/dist/mcp/tools/update-task-doc.d.ts +0 -10
  245. package/dist/mcp/tools/update-task-doc.d.ts.map +0 -1
  246. package/dist/mcp/tools/update-task-doc.js +0 -70
  247. package/dist/mcp/tools/update-task-doc.js.map +0 -1
  248. package/dist/mcp/tools/update-task.d.ts +0 -10
  249. package/dist/mcp/tools/update-task.d.ts.map +0 -1
  250. package/dist/mcp/tools/update-task.js +0 -106
  251. package/dist/mcp/tools/update-task.js.map +0 -1
  252. package/dist/services/sop.service.d.ts +0 -53
  253. package/dist/services/sop.service.d.ts.map +0 -1
  254. package/dist/services/sop.service.js +0 -275
  255. package/dist/services/sop.service.js.map +0 -1
@@ -0,0 +1,440 @@
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
+ // 测试用的用户凭据
12
+ const ADMIN_USER = {
13
+ name: 'AdminUser',
14
+ email: 'admin@example.com',
15
+ password: 'AdminPass123'
16
+ };
17
+ const MEMBER_USER = {
18
+ name: 'MemberUser',
19
+ email: 'member@example.com',
20
+ password: 'MemberPass123'
21
+ };
22
+ const MEMBER_USER2 = {
23
+ name: 'MemberUser2',
24
+ email: 'member2@example.com',
25
+ password: 'MemberPass456'
26
+ };
27
+ let adminCookie;
28
+ let memberCookie;
29
+ let member2Cookie;
30
+ let adminId = 'admin-user-001';
31
+ let memberId = 'member-user-001';
32
+ let member2Id = 'member-user-002';
33
+ beforeAll(async () => {
34
+ TEST_DIR = join(tmpdir(), `omt-auth-admin-test-${Date.now()}`);
35
+ TEST_DB_PATH = join(TEST_DIR, 'data', 'data.db');
36
+ mkdirSync(join(TEST_DIR, 'data'), { recursive: true });
37
+ process.env.DB_PATH = TEST_DB_PATH;
38
+ // 初始化数据库
39
+ const db = new Database(TEST_DB_PATH);
40
+ db.pragma('journal_mode = WAL');
41
+ db.pragma('foreign_keys = ON');
42
+ const schemaSql = readFileSync(join(process.cwd(), 'src', 'db', 'schema.sql'), 'utf-8');
43
+ db.exec(schemaSql);
44
+ db.close();
45
+ // 动态导入 app(需要在数据库初始化后)
46
+ const serverModule = await import('../api/server.js');
47
+ app = serverModule.default;
48
+ });
49
+ afterAll(() => {
50
+ try {
51
+ if (existsSync(TEST_DIR)) {
52
+ rmSync(TEST_DIR, { recursive: true, force: true });
53
+ }
54
+ }
55
+ catch {
56
+ // Windows 可能因文件锁定无法立即删除
57
+ }
58
+ delete process.env.DB_PATH;
59
+ });
60
+ /**
61
+ * 辅助函数:创建测试用户并登录
62
+ */
63
+ async function setupUserAndLogin(user, userId, role = 'member') {
64
+ const db = new Database(TEST_DB_PATH);
65
+ const bcrypt = await import('bcrypt');
66
+ const hash = await bcrypt.default.hash(user.password, 12);
67
+ db.prepare(`
68
+ INSERT OR REPLACE INTO users (id, name, email, password_hash, role)
69
+ VALUES (?, ?, ?, ?, ?)
70
+ `).run(userId, user.name, user.email, hash, role);
71
+ db.close();
72
+ const loginRes = await request(app)
73
+ .post('/api/auth/login')
74
+ .send({ email: user.email, password: user.password });
75
+ const setCookie = loginRes.headers['set-cookie'];
76
+ if (Array.isArray(setCookie)) {
77
+ return setCookie[0].split(';')[0];
78
+ }
79
+ return setCookie.split(';')[0];
80
+ }
81
+ /**
82
+ * 辅助函数:在数据库中创建项目
83
+ */
84
+ function createProjectInDb(ownerId, projectId, name) {
85
+ const db = new Database(TEST_DB_PATH);
86
+ db.prepare(`
87
+ INSERT INTO projects (id, name, owner_id) VALUES (?, ?, ?)
88
+ `).run(projectId, name, ownerId);
89
+ db.close();
90
+ }
91
+ /**
92
+ * 辅助函数:在数据库中创建版本
93
+ */
94
+ function createVersionInDb(projectId, versionId, name) {
95
+ const db = new Database(TEST_DB_PATH);
96
+ db.prepare(`
97
+ INSERT INTO versions (id, project_id, name) VALUES (?, ?, ?)
98
+ `).run(versionId, projectId, name);
99
+ db.close();
100
+ }
101
+ /**
102
+ * 辅助函数:在数据库中创建任务
103
+ */
104
+ function createTaskInDb(projectId, taskId, title, versionId) {
105
+ const db = new Database(TEST_DB_PATH);
106
+ db.prepare(`
107
+ INSERT INTO tasks (id, project_id, title, version_id) VALUES (?, ?, ?, ?)
108
+ `).run(taskId, projectId, title, versionId || null);
109
+ db.close();
110
+ }
111
+ /**
112
+ * 辅助函数:记录用户活动
113
+ */
114
+ function recordActivity(userId, action, createdAt) {
115
+ const db = new Database(TEST_DB_PATH);
116
+ db.prepare(`
117
+ INSERT INTO user_activity (id, user_id, action, created_at) VALUES (?, ?, ?, ?)
118
+ `).run(`activity-${Date.now()}-${Math.random().toString(36).slice(2)}`, userId, action, createdAt || new Date().toISOString());
119
+ db.close();
120
+ }
121
+ // ============================================
122
+ // GET /api/users — 管理员查看用户列表
123
+ // ============================================
124
+ describe('GET /api/users', () => {
125
+ beforeEach(async () => {
126
+ // 清理并重建测试数据
127
+ const db = new Database(TEST_DB_PATH);
128
+ db.prepare('DELETE FROM user_activity');
129
+ db.prepare('DELETE FROM tasks');
130
+ db.prepare('DELETE FROM versions');
131
+ db.prepare('DELETE FROM projects');
132
+ db.prepare('DELETE FROM users');
133
+ db.close();
134
+ adminCookie = await setupUserAndLogin(ADMIN_USER, adminId, 'admin');
135
+ memberCookie = await setupUserAndLogin(MEMBER_USER, memberId, 'member');
136
+ member2Cookie = await setupUserAndLogin(MEMBER_USER2, member2Id, 'member');
137
+ });
138
+ it('VAL-AUTH-025: 管理员获取分页用户列表', async () => {
139
+ const res = await request(app)
140
+ .get('/api/users')
141
+ .set('Cookie', adminCookie);
142
+ expect(res.status).toBe(200);
143
+ expect(res.body.success).toBe(true);
144
+ expect(res.body.data.users).toBeDefined();
145
+ expect(res.body.data.users.length).toBe(3); // admin + 2 members
146
+ expect(res.body.data.pagination).toBeDefined();
147
+ expect(res.body.data.pagination.total).toBe(3);
148
+ expect(res.body.data.pagination.page).toBe(1);
149
+ expect(res.body.data.pagination.total_pages).toBe(1);
150
+ // 确认返回的用户包含必要字段
151
+ const user = res.body.data.users[0];
152
+ expect(user.id).toBeDefined();
153
+ expect(user.name).toBeDefined();
154
+ expect(user.email).toBeDefined();
155
+ expect(user.role).toBeDefined();
156
+ expect(user.created_at).toBeDefined();
157
+ // 不包含密码
158
+ expect(user.password_hash).toBeUndefined();
159
+ });
160
+ it('分页参数生效', async () => {
161
+ const res = await request(app)
162
+ .get('/api/users?page=1&page_size=2')
163
+ .set('Cookie', adminCookie);
164
+ expect(res.status).toBe(200);
165
+ expect(res.body.data.users.length).toBe(2);
166
+ expect(res.body.data.pagination.page_size).toBe(2);
167
+ expect(res.body.data.pagination.total).toBe(3);
168
+ expect(res.body.data.pagination.total_pages).toBe(2);
169
+ });
170
+ it('VAL-AUTH-027: 非管理员访问 GET /api/users 返回 403', async () => {
171
+ const res = await request(app)
172
+ .get('/api/users')
173
+ .set('Cookie', memberCookie);
174
+ expect(res.status).toBe(403);
175
+ expect(res.body.success).toBe(false);
176
+ });
177
+ it('未认证访问 GET /api/users 返回 401', async () => {
178
+ const res = await request(app)
179
+ .get('/api/users');
180
+ expect(res.status).toBe(401);
181
+ expect(res.body.success).toBe(false);
182
+ });
183
+ });
184
+ // ============================================
185
+ // DELETE /api/users/:id — 管理员删除用户
186
+ // ============================================
187
+ describe('DELETE /api/users/:id', () => {
188
+ beforeEach(async () => {
189
+ const db = new Database(TEST_DB_PATH);
190
+ db.prepare('DELETE FROM user_activity');
191
+ db.prepare('DELETE FROM tasks');
192
+ db.prepare('DELETE FROM versions');
193
+ db.prepare('DELETE FROM projects');
194
+ db.prepare('DELETE FROM users');
195
+ db.close();
196
+ adminCookie = await setupUserAndLogin(ADMIN_USER, adminId, 'admin');
197
+ memberCookie = await setupUserAndLogin(MEMBER_USER, memberId, 'member');
198
+ member2Cookie = await setupUserAndLogin(MEMBER_USER2, member2Id, 'member');
199
+ });
200
+ it('VAL-AUTH-026: 管理员删除他人返回 200', async () => {
201
+ const res = await request(app)
202
+ .delete(`/api/users/${memberId}`)
203
+ .set('Cookie', adminCookie);
204
+ expect(res.status).toBe(200);
205
+ expect(res.body.success).toBe(true);
206
+ expect(res.body.message).toBeDefined();
207
+ // 验证用户已被删除
208
+ const db = new Database(TEST_DB_PATH);
209
+ const user = db.prepare('SELECT * FROM users WHERE id = ?').get(memberId);
210
+ db.close();
211
+ expect(user).toBeUndefined();
212
+ });
213
+ it('VAL-AUTH-026: 管理员删除自己返回 403', async () => {
214
+ const res = await request(app)
215
+ .delete(`/api/users/${adminId}`)
216
+ .set('Cookie', adminCookie);
217
+ expect(res.status).toBe(403);
218
+ expect(res.body.success).toBe(false);
219
+ });
220
+ it('VAL-AUTH-027: 非管理员删除用户返回 403', async () => {
221
+ const res = await request(app)
222
+ .delete(`/api/users/${member2Id}`)
223
+ .set('Cookie', memberCookie);
224
+ expect(res.status).toBe(403);
225
+ expect(res.body.success).toBe(false);
226
+ });
227
+ it('删除不存在的用户返回 404', async () => {
228
+ const res = await request(app)
229
+ .delete('/api/users/nonexistent-id')
230
+ .set('Cookie', adminCookie);
231
+ expect(res.status).toBe(404);
232
+ expect(res.body.success).toBe(false);
233
+ });
234
+ it('VAL-CROSS-009: 删除用户后其项目/版本/任务被级联删除', async () => {
235
+ // 为 member 用户创建项目、版本、任务
236
+ createProjectInDb(memberId, 'proj-member-1', 'Member Project');
237
+ createVersionInDb('proj-member-1', 'ver-member-1', 'v1');
238
+ createTaskInDb('proj-member-1', 'task-member-1', 'Member Task', 'ver-member-1');
239
+ // 确认数据存在
240
+ const dbBefore = new Database(TEST_DB_PATH);
241
+ const projBefore = dbBefore.prepare('SELECT * FROM projects WHERE owner_id = ?').all(memberId);
242
+ expect(projBefore.length).toBe(1);
243
+ dbBefore.close();
244
+ // 管理员删除用户
245
+ const res = await request(app)
246
+ .delete(`/api/users/${memberId}`)
247
+ .set('Cookie', adminCookie);
248
+ expect(res.status).toBe(200);
249
+ // 验证级联删除
250
+ const dbAfter = new Database(TEST_DB_PATH);
251
+ const projects = dbAfter.prepare('SELECT * FROM projects WHERE owner_id = ?').all(memberId);
252
+ const versions = dbAfter.prepare('SELECT * FROM versions WHERE project_id = ?').all('proj-member-1');
253
+ const tasks = dbAfter.prepare('SELECT * FROM tasks WHERE project_id = ?').all('proj-member-1');
254
+ dbAfter.close();
255
+ expect(projects.length).toBe(0);
256
+ expect(versions.length).toBe(0);
257
+ expect(tasks.length).toBe(0);
258
+ });
259
+ it('删除用户不影响其他用户的数据', async () => {
260
+ // 为两个 member 用户创建项目
261
+ createProjectInDb(memberId, 'proj-member-1', 'Member1 Project');
262
+ createProjectInDb(member2Id, 'proj-member-2', 'Member2 Project');
263
+ // 管理员删除 member
264
+ await request(app)
265
+ .delete(`/api/users/${memberId}`)
266
+ .set('Cookie', adminCookie);
267
+ // member2 的项目应该还在
268
+ const db = new Database(TEST_DB_PATH);
269
+ const proj = db.prepare('SELECT * FROM projects WHERE owner_id = ?').all(member2Id);
270
+ db.close();
271
+ expect(proj.length).toBe(1);
272
+ expect(proj[0].name).toBe('Member2 Project');
273
+ });
274
+ });
275
+ // ============================================
276
+ // GET /api/config — 系统配置
277
+ // ============================================
278
+ describe('GET /api/config', () => {
279
+ beforeEach(async () => {
280
+ const db = new Database(TEST_DB_PATH);
281
+ db.prepare('DELETE FROM users');
282
+ db.close();
283
+ adminCookie = await setupUserAndLogin(ADMIN_USER, adminId, 'admin');
284
+ memberCookie = await setupUserAndLogin(MEMBER_USER, memberId, 'member');
285
+ });
286
+ it('VAL-AUTH-028: 管理员获取系统配置', async () => {
287
+ const res = await request(app)
288
+ .get('/api/config')
289
+ .set('Cookie', adminCookie);
290
+ expect(res.status).toBe(200);
291
+ expect(res.body.success).toBe(true);
292
+ expect(res.body.data).toBeDefined();
293
+ expect(res.body.data.server_url).toBeDefined();
294
+ expect(res.body.data.registration_enabled).toBeDefined();
295
+ expect(res.body.data.smtp_host).toBeDefined();
296
+ });
297
+ it('VAL-AUTH-027: 非管理员访问 GET /api/config 返回 403', async () => {
298
+ const res = await request(app)
299
+ .get('/api/config')
300
+ .set('Cookie', memberCookie);
301
+ expect(res.status).toBe(403);
302
+ expect(res.body.success).toBe(false);
303
+ });
304
+ });
305
+ // ============================================
306
+ // PUT /api/config — 更新系统配置
307
+ // ============================================
308
+ describe('PUT /api/config', () => {
309
+ beforeEach(async () => {
310
+ const db = new Database(TEST_DB_PATH);
311
+ db.prepare('DELETE FROM users');
312
+ db.close();
313
+ adminCookie = await setupUserAndLogin(ADMIN_USER, adminId, 'admin');
314
+ memberCookie = await setupUserAndLogin(MEMBER_USER, memberId, 'member');
315
+ });
316
+ it('VAL-AUTH-028: 管理员更新配置成功', async () => {
317
+ const res = await request(app)
318
+ .put('/api/config')
319
+ .set('Cookie', adminCookie)
320
+ .send({
321
+ registration_enabled: '0',
322
+ smtp_host: 'smtp.example.com'
323
+ });
324
+ expect(res.status).toBe(200);
325
+ expect(res.body.success).toBe(true);
326
+ expect(res.body.data.registration_enabled).toBe('0');
327
+ expect(res.body.data.smtp_host).toBe('smtp.example.com');
328
+ });
329
+ it('VAL-AUTH-028: 更新后 GET 确认值已变更', async () => {
330
+ // 更新配置
331
+ await request(app)
332
+ .put('/api/config')
333
+ .set('Cookie', adminCookie)
334
+ .send({
335
+ registration_enabled: '0',
336
+ smtp_host: 'smtp.updated.com',
337
+ smtp_port: '465'
338
+ });
339
+ // GET 确认
340
+ const getRes = await request(app)
341
+ .get('/api/config')
342
+ .set('Cookie', adminCookie);
343
+ expect(getRes.status).toBe(200);
344
+ expect(getRes.body.data.registration_enabled).toBe('0');
345
+ expect(getRes.body.data.smtp_host).toBe('smtp.updated.com');
346
+ expect(getRes.body.data.smtp_port).toBe('465');
347
+ });
348
+ it('VAL-AUTH-027: 非管理员 PUT /api/config 返回 403', async () => {
349
+ const res = await request(app)
350
+ .put('/api/config')
351
+ .set('Cookie', memberCookie)
352
+ .send({ registration_enabled: '0' });
353
+ expect(res.status).toBe(403);
354
+ expect(res.body.success).toBe(false);
355
+ });
356
+ });
357
+ // ============================================
358
+ // GET /api/admin/stats — 用户统计
359
+ // ============================================
360
+ describe('GET /api/admin/stats', () => {
361
+ beforeEach(async () => {
362
+ const db = new Database(TEST_DB_PATH);
363
+ db.prepare('DELETE FROM user_activity');
364
+ db.prepare('DELETE FROM tasks');
365
+ db.prepare('DELETE FROM versions');
366
+ db.prepare('DELETE FROM projects');
367
+ db.prepare('DELETE FROM users');
368
+ db.close();
369
+ adminCookie = await setupUserAndLogin(ADMIN_USER, adminId, 'admin');
370
+ memberCookie = await setupUserAndLogin(MEMBER_USER, memberId, 'member');
371
+ });
372
+ it('VAL-AUTH-032: 管理员获取用户统计', async () => {
373
+ const res = await request(app)
374
+ .get('/api/admin/stats')
375
+ .set('Cookie', adminCookie);
376
+ expect(res.status).toBe(200);
377
+ expect(res.body.success).toBe(true);
378
+ expect(res.body.data).toBeDefined();
379
+ // newUsers: 日/周/月新增用户数
380
+ expect(res.body.data.newUsers).toBeDefined();
381
+ expect(res.body.data.newUsers.daily).toBeDefined();
382
+ expect(res.body.data.newUsers.weekly).toBeDefined();
383
+ expect(res.body.data.newUsers.monthly).toBeDefined();
384
+ // dau: 日活用户
385
+ expect(res.body.data.dau).toBeDefined();
386
+ expect(Array.isArray(res.body.data.dau)).toBe(true);
387
+ // retention: 留存率
388
+ expect(res.body.data.retention).toBeDefined();
389
+ });
390
+ it('VAL-AUTH-032: 新增用户数统计准确', async () => {
391
+ const res = await request(app)
392
+ .get('/api/admin/stats')
393
+ .set('Cookie', adminCookie);
394
+ expect(res.status).toBe(200);
395
+ // 今天创建了 2 个用户(admin + member),所以 daily 至少为 2
396
+ const daily = res.body.data.newUsers.daily;
397
+ expect(typeof daily).toBe('number');
398
+ expect(daily).toBeGreaterThanOrEqual(2);
399
+ });
400
+ it('VAL-AUTH-032: DAU 统计返回近 7 天数据', async () => {
401
+ // 为 member 用户记录一些活动
402
+ recordActivity(memberId, 'login');
403
+ recordActivity(adminId, 'login');
404
+ const res = await request(app)
405
+ .get('/api/admin/stats')
406
+ .set('Cookie', adminCookie);
407
+ expect(res.status).toBe(200);
408
+ const dau = res.body.data.dau;
409
+ expect(dau.length).toBe(7);
410
+ // 每天至少有日期和数量
411
+ for (const day of dau) {
412
+ expect(day.date).toBeDefined();
413
+ expect(day.count).toBeDefined();
414
+ }
415
+ });
416
+ it('VAL-AUTH-032: 留存率返回数据', async () => {
417
+ const res = await request(app)
418
+ .get('/api/admin/stats')
419
+ .set('Cookie', adminCookie);
420
+ expect(res.status).toBe(200);
421
+ const retention = res.body.data.retention;
422
+ expect(retention).toBeDefined();
423
+ // 留存率应包含 day1, day7 等字段
424
+ expect(typeof retention).toBe('object');
425
+ });
426
+ it('VAL-AUTH-027: 非管理员访问 GET /api/admin/stats 返回 403', async () => {
427
+ const res = await request(app)
428
+ .get('/api/admin/stats')
429
+ .set('Cookie', memberCookie);
430
+ expect(res.status).toBe(403);
431
+ expect(res.body.success).toBe(false);
432
+ });
433
+ it('未认证访问 GET /api/admin/stats 返回 401', async () => {
434
+ const res = await request(app)
435
+ .get('/api/admin/stats');
436
+ expect(res.status).toBe(401);
437
+ expect(res.body.success).toBe(false);
438
+ });
439
+ });
440
+ //# sourceMappingURL=auth-admin.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-admin.test.js","sourceRoot":"","sources":["../../src/__tests__/auth-admin.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=auth-login-logout.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-login-logout.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/auth-login-logout.test.ts"],"names":[],"mappings":""}