playwright_smoke.log 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  1. Running 58 tests using 1 worker
  2. [1/58] [desktop] › e2e\api\api-smoke.spec.js:18:3 › API级冒烟(远程后端) › 自注册链路可用(拿到有效 token)
  3. [2/58] [desktop] › e2e\api\api-smoke.spec.js:24:3 › API级冒烟(远程后端) › 家庭成员列表接口可调用 (code=200)
  4. [3/58] [desktop] › e2e\api\api-smoke.spec.js:30:3 › API级冒烟(远程后端) › 能量概览接口可调用 (code=200)
  5. [4/58] [desktop] › e2e\api\api-smoke.spec.js:36:3 › API级冒烟(远程后端) › 成员列表参数校验生效(越权家庭 → 403)
  6. [5/58] [desktop] › e2e\api\article-api.spec.js:26:3 › 【API级】文章管理全流程 › [场景1] 查看文章列表 - 期望返回文章列表
  7. [6/58] [desktop] › e2e\api\article-api.spec.js:35:3 › 【API级】文章管理全流程 › [场景2] 文章分类 - 期望分类列表可用
  8. [7/58] [desktop] › e2e\api\article-api.spec.js:43:3 › 【API级】文章管理全流程 › [场景3] 查看文章详情 - 期望返回文章内容
  9. [8/58] [desktop] › e2e\api\article-api.spec.js:59:3 › 【API级】文章管理全流程 › [场景4] 我的文章 - 期望返回登录用户发布记录
  10. [9/58] [desktop] › e2e\api\article-api.spec.js:67:3 › 【API级】文章管理全流程 › [场景5] 发布文章缺少标题 - 期望返回错误提示
  11. [10/58] [desktop] › e2e\api\article-api.spec.js:73:3 › 【API级】文章管理全流程 › [场景5b] 精选文章 - 期望可获取
  12. [11/58] [desktop] › e2e\api\article-api.spec.js:81:3 › 【API级】文章管理全流程 › [场景6] 家长角色发布文章 - 期望受权限/审核流程约束
  13. [12/58] [desktop] › e2e\api\contact-api.spec.js:41:3 › 【API级】联系人管理全流程 › [场景1] 创建联系人 - 期望创建成功
  14. [13/58] [desktop] › e2e\api\contact-api.spec.js:51:3 › 【API级】联系人管理全流程 › [场景2] 通讯录导入 - 期望导入成功
  15. [14/58] [desktop] › e2e\api\contact-api.spec.js:64:3 › 【API级】联系人管理全流程 › [场景3] 记录互动 - 期望记录成功
  16. [15/58] [desktop] › e2e\api\contact-api.spec.js:77:3 › 【API级】联系人管理全流程 › [场景4] 编辑联系人 - 期望更新成功
  17. [16/58] [desktop] › e2e\api\contact-api.spec.js:88:3 › 【API级】联系人管理全流程 › [场景4b] 删除联系人 - 期望从列表中移除
  18. [17/58] [desktop] › e2e\api\contact-api.spec.js:103:3 › 【API级】联系人管理全流程 › [场景5b] 越权操作他人联系人 - 期望被拒绝
  19. [18/58] [desktop] › e2e\api\energy-api.spec.js:34:3 › 【API级】能量系统收支全流程 › [场景1] 获取家庭能量沙盘 - 期望返回五维能量数据
  20. [19/58] [desktop] › e2e\api\energy-api.spec.js:41:3 › 【API级】能量系统收支全流程 › [场景1b] 未加入家庭/越权访问 - 期望返回错误提示
  21. [20/58] [desktop] › e2e\api\energy-api.spec.js:55:3 › 【API级】能量系统收支全流程 › [场景2] 任务完成能量发放 - 期望能量增加且流水记录
  22. [21/58] [desktop] › e2e\api\energy-api.spec.js:77:3 › 【API级】能量系统收支全流程 › [场景2c] 已知缺陷复现 - 期望当前返回 500 服务器内部错误
  23. [22/58] [desktop] › e2e\api\energy-api.spec.js:89:3 › 【API级】能量系统收支全流程 › [场景2b] 能量发放缺参 - 期望返回错误提示
  24. [23/58] [desktop] › e2e\api\energy-api.spec.js:97:3 › 【API级】能量系统收支全流程 › [场景3] 能量兑换心愿 - 期望参数校验生效且未扣减能量
  25. [24/58] [desktop] › e2e\api\energy-api.spec.js:121:3 › 【API级】能量系统收支全流程 › [场景4] 查询能量流水 - 期望返回分页记录
  26. [25/58] [desktop] › e2e\api\energy-api.spec.js:131:3 › 【API级】能量系统收支全流程 › [场景5] 获取五维能量概览 - 期望返回五维汇总数据
  27. [26/58] [desktop] › e2e\api\energy-api.spec.js:146:3 › 【API级】能量系统收支全流程 › [场景6] 完整能量收支流程 - 期望全流程成功
  28. [27/58] [desktop] › e2e\api\family-member-api.spec.js:39:3 › 【API级】家庭成员管理全流程 › [场景1] 获取成员列表 - 期望返回成员数据
  29. [28/58] [desktop] › e2e\api\family-member-api.spec.js:46:3 › 【API级】家庭成员管理全流程 › [场景1b] 越权访问他人家庭 - 期望 403 拒绝
  30. [29/58] [desktop] › e2e\api\family-member-api.spec.js:54:3 › 【API级】家庭成员管理全流程 › [场景2] 添加新家庭成员 - 期望添加成功并返回完整信息
  31. 1) [desktop] › e2e\api\family-member-api.spec.js:54:3 › 【API级】家庭成员管理全流程 › [场景2] 添加新家庭成员 - 期望添加成功并返回完整信息
  32. TimeoutError: apiRequestContext.post: Timeout 60000ms exceeded.
  33. Call log:
  34. - → POST http://cfc.iwintrue.com/api/family/member/add
  35. - user-agent: Playwright/1.61.1 (x64; windows 10.0) node/22.22
  36. - accept: */*
  37. - accept-encoding: gzip,deflate,br
  38. - Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoicGFyZW50Iiwicm9sZXMiOlsicGFyZW50Il0sInVzZXJJZCI6ODE4NDIsInN1YiI6IjgxODQyIiwiaWF0IjoxNzkzNDY1NTA4LCJleHAiOjE3OTYwNTc1MDh9.KnqWLd_BBn-uRrUl8M7FCyowtmjdT6-60OlAyE-cZAM
  39. - content-type: application/json
  40. - content-length: 96
  41. at helpers\api.js:57
  42. 55 | const headers = {};
  43. 56 | if (token) headers.Authorization = 'Bearer ' + token;
  44. > 57 | const res = await request.post(path, { data: body || {}, headers, timeout: API_TIMEOUT_MS });
  45. | ^
  46. 58 | const raw = await res.text();
  47. 59 | let json = null;
  48. 60 | try {
  49. at apiPost (D:\cfc\tests\e2e\helpers\api.js:57:29)
  50. at createManualChild (D:\cfc\tests\e2e\api\family-member-api.spec.js:26:21)
  51. at D:\cfc\tests\e2e\api\family-member-api.spec.js:55:21
  52. Error Context: .api-artifacts\api-family-member-api-【API-a369c-场景2-添加新家庭成员---期望添加成功并返回完整信息-desktop\error-context.md
  53. [30/58] [desktop] › e2e\api\family-member-api.spec.js:63:3 › 【API级】家庭成员管理全流程 › [场景2b] 添加成员时昵称为空 - 期望返回错误提示
  54. 2) [desktop] › e2e\api\family-member-api.spec.js:63:3 › 【API级】家庭成员管理全流程 › [场景2b] 添加成员时昵称为空 - 期望返回错误提示
  55. Error: direct-register 应当成功(code=200)
  56. expect(received).toBe(expected) // Object.is equality
  57. Expected: 200
  58. Received: undefined
  59. at helpers\api.js:32
  60. 30 | });
  61. 31 | const body = await res.json().catch(() => ({}));
  62. > 32 | expect(body.code, 'direct-register 应当成功(code=200)').toBe(200);
  63. | ^
  64. 33 | const d = body.data || {};
  65. 34 | expect(typeof d.token, '响应应包含 token').toBe('string');
  66. 35 | return {
  67. at registerRole (D:\cfc\tests\e2e\helpers\api.js:32:55)
  68. at D:\cfc\tests\e2e\api\family-member-api.spec.js:20:11
  69. Error Context: .api-artifacts\api-family-member-api-【API-f34f8-程-场景2b-添加成员时昵称为空---期望返回错误提示-desktop\error-context.md
  70. [31/58] [desktop] › e2e\api\family-member-api.spec.js:74:3 › 【API级】家庭成员管理全流程 › [场景2c] 添加成员时辈分等级为空 - 期望返回错误提示
  71. [32/58] [desktop] › e2e\api\family-member-api.spec.js:85:3 › 【API级】家庭成员管理全流程 › [场景2d] 添加成员时辈分等级非法 - 期望返回错误提示
  72. [33/58] [desktop] › e2e\api\family-member-api.spec.js:98:3 › 【API级】家庭成员管理全流程 › [场景3] 查看家庭成员列表 - 期望返回所有成员及关系信息
  73. [34/58] [desktop] › e2e\api\family-member-api.spec.js:120:3 › 【API级】家庭成员管理全流程 › [场景4] 更新成员关系/昵称 - 期望更新成功并返回新信息
  74. [35/58] [desktop] › e2e\api\family-member-api.spec.js:138:3 › 【API级】家庭成员管理全流程 › [场景4c] 已知缺陷复现 - nickname 未生效但 gender/birthday 生效
  75. [36/58] [desktop] › e2e\api\family-member-api.spec.js:158:3 › 【API级】家庭成员管理全流程 › [场景5] 切换到成员视角 - 期望返回切换凭证
  76. [37/58] [desktop] › e2e\api\family-member-api.spec.js:167:3 › 【API级】家庭成员管理全流程 › [场景5b] 切换到本人视角 - 期望返回错误提示
  77. [38/58] [desktop] › e2e\api\family-member-api.spec.js:179:3 › 【API级】家庭成员管理全流程 › [场景6] 移除家庭成员 - 期望成员从家庭中移除
  78. [39/58] [desktop] › e2e\api\family-member-api.spec.js:192:3 › 【API级】家庭成员管理全流程 › [场景6b] 非管理员尝试踢人 - 期望权限不足拒绝
  79. [40/58] [desktop] › e2e\api\family-member-api.spec.js:202:3 › 【API级】家庭成员管理全流程 › [场景7] 完整家庭成员管理流程 - 期望全流程成功
  80. [41/58] [desktop] › e2e\api\nonfunc-perf-compat.spec.js:56:1 › [TC-G-N03] 非微信H5兜底登录:手机号注册登录路径 UA 无关
  81. 3) [desktop] › e2e\api\nonfunc-perf-compat.spec.js:56:1 › [TC-G-N03] 非微信H5兜底登录:手机号注册登录路径 UA 无关 ───
  82. Error: register(parent) 失败: {}
  83. 43 | await new Promise((r) => setTimeout(r, 500));
  84. 44 | }
  85. > 45 | throw new Error(`register(${role}) 失败: ${JSON.stringify(lastErr)}`);
  86. | ^
  87. 46 | }
  88. 47 |
  89. 48 | // 4 类客户端 UA
  90. at register (D:\cfc\tests\e2e\api\nonfunc-perf-compat.spec.js:45:9)
  91. at D:\cfc\tests\e2e\api\nonfunc-perf-compat.spec.js:57:17
  92. Error Context: .api-artifacts\api-nonfunc-perf-compat--TC-G-N03-非微信H5兜底登录:手机号注册登录路径-UA-无关-desktop\error-context.md
  93. [42/58] [desktop] › e2e\api\nonfunc-perf-compat.spec.js:63:1 › [TC-G-N02/P-N06/C-N03/T-N04/S-N03/X-N07] 多端 UA 兼容:同请求不同客户端返回一致
  94. 4) [desktop] › e2e\api\nonfunc-perf-compat.spec.js:63:1 › [TC-G-N02/P-N06/C-N03/T-N04/S-N03/X-N07] 多端 UA 兼容:同请求不同客户端返回一致
  95. Error: register(parent) 失败: {}
  96. 43 | await new Promise((r) => setTimeout(r, 500));
  97. 44 | }
  98. > 45 | throw new Error(`register(${role}) 失败: ${JSON.stringify(lastErr)}`);
  99. | ^
  100. 46 | }
  101. 47 |
  102. 48 | // 4 类客户端 UA
  103. at register (D:\cfc\tests\e2e\api\nonfunc-perf-compat.spec.js:45:9)
  104. at D:\cfc\tests\e2e\api\nonfunc-perf-compat.spec.js:64:17
  105. Error Context: .api-artifacts\api-nonfunc-perf-compat--T-ade8e-X-N07-多端-UA-兼容:同请求不同客户端返回一致-desktop\error-context.md
  106. [43/58] [desktop] › e2e\api\nonfunc-perf-compat.spec.js:79:1 › [TC-A-N04/X-N02] 限流熔断稳定性:爆发请求下系统不死(不出现 5xx 雪崩)
  107. 5) [desktop] › e2e\api\nonfunc-perf-compat.spec.js:79:1 › [TC-A-N04/X-N02] 限流熔断稳定性:爆发请求下系统不死(不出现 5xx 雪崩)
  108. Error: register(parent) 失败: {}
  109. 43 | await new Promise((r) => setTimeout(r, 500));
  110. 44 | }
  111. > 45 | throw new Error(`register(${role}) 失败: ${JSON.stringify(lastErr)}`);
  112. | ^
  113. 46 | }
  114. 47 |
  115. 48 | // 4 类客户端 UA
  116. at register (D:\cfc\tests\e2e\api\nonfunc-perf-compat.spec.js:45:9)
  117. at D:\cfc\tests\e2e\api\nonfunc-perf-compat.spec.js:80:17
  118. Error Context: .api-artifacts\api-nonfunc-perf-compat--T-4e03c-熔断稳定性:爆发请求下系统不死(不出现-5xx-雪崩)-desktop\error-context.md
  119. [44/58] [desktop] › e2e\api\nonfunc-perf-compat.spec.js:92:1 › [TC-P-N02/X-N01] 并发不串数据:并行 AI 请求各自独立响应
  120. 6) [desktop] › e2e\api\nonfunc-perf-compat.spec.js:92:1 › [TC-P-N02/X-N01] 并发不串数据:并行 AI 请求各自独立响应 ─
  121. Error: register(parent) 失败: {}
  122. 43 | await new Promise((r) => setTimeout(r, 500));
  123. 44 | }
  124. > 45 | throw new Error(`register(${role}) 失败: ${JSON.stringify(lastErr)}`);
  125. | ^
  126. 46 | }
  127. 47 |
  128. 48 | // 4 类客户端 UA
  129. at register (D:\cfc\tests\e2e\api\nonfunc-perf-compat.spec.js:45:9)
  130. at D:\cfc\tests\e2e\api\nonfunc-perf-compat.spec.js:93:17
  131. Error Context: .api-artifacts\api-nonfunc-perf-compat--T-9a7ce-X-N01-并发不串数据:并行-AI-请求各自独立响应-desktop\error-context.md
  132. [45/58] [desktop] › e2e\api\nonfunc-perf-compat.spec.js:106:1 › [响应时间基线] 已登录家庭列表单请求耗时冒烟 ≤ 8s
  133. 7) [desktop] › e2e\api\nonfunc-perf-compat.spec.js:106:1 › [响应时间基线] 已登录家庭列表单请求耗时冒烟 ≤ 8s ──────────
  134. Error: register(parent) 失败: {}
  135. 43 | await new Promise((r) => setTimeout(r, 500));
  136. 44 | }
  137. > 45 | throw new Error(`register(${role}) 失败: ${JSON.stringify(lastErr)}`);
  138. | ^
  139. 46 | }
  140. 47 |
  141. 48 | // 4 类客户端 UA
  142. at register (D:\cfc\tests\e2e\api\nonfunc-perf-compat.spec.js:45:9)
  143. at D:\cfc\tests\e2e\api\nonfunc-perf-compat.spec.js:107:17
  144. Error Context: .api-artifacts\api-nonfunc-perf-compat--响应时间基线-已登录家庭列表单请求耗时冒烟-≤-8s-desktop\error-context.md
  145. [46/58] [desktop] › e2e\api\nonfunc-perf-compat.spec.js:117:6 › [TC-C-N01/X-N04] 任务打卡幂等:重复提交不重复计分(需任务流夹具)
  146. [47/58] [desktop] › e2e\api\nonfunc-perf-compat.spec.js:122:6 › [TC-X-N03] 活动名额并发不超卖:100 名额 / 瞬时 500 请求(需活动夹具 + 压测授权)
  147. [48/58] [desktop] › e2e\api\nonfunc-security.spec.js:50:3 › 非功能/安全接口冒烟 › [TC-G-N04] 未授权访问能量概览被拒(401/403)
  148. 8) [desktop] › e2e\api\nonfunc-security.spec.js:50:3 › 非功能/安全接口冒烟 › [TC-G-N04] 未授权访问能量概览被拒(401/403)
  149. Error: 能量概览未授权应 401/403,实际 code=502 msg=NON_JSON_RESPONSE
  150. expect(received).toBeTruthy()
  151. Received: false
  152. 50 | test('[TC-G-N04] 未授权访问能量概览被拒(401/403)', async ({ request }) => {
  153. 51 | const r = await apiPost(request, '/api/energy/overview', {}, null);
  154. > 52 | expect([401, 403].includes(r.code), `能量概览未授权应 401/403,实际 code=${r.code} msg=${r.message}`).toBeTruthy();
  155. | ^
  156. 53 | });
  157. 54 |
  158. 55 | test('[TC-G-N04] 未授权访问家庭成员列表被拒(401/403)', async ({ request }) => {
  159. at D:\cfc\tests\e2e\api\nonfunc-security.spec.js:52:96
  160. Error Context: .api-artifacts\api-nonfunc-security-非功能-安-bdecd--G-N04-未授权访问能量概览被拒-401-403--desktop\error-context.md
  161. [49/58] [desktop] › e2e\api\nonfunc-security.spec.js:55:3 › 非功能/安全接口冒烟 › [TC-G-N04] 未授权访问家庭成员列表被拒(401/403)
  162. 9) [desktop] › e2e\api\nonfunc-security.spec.js:55:3 › 非功能/安全接口冒烟 › [TC-G-N04] 未授权访问家庭成员列表被拒(401/403)
  163. Error: 成员列表未授权应 401/403,实际 code=502 msg=NON_JSON_RESPONSE
  164. expect(received).toBeTruthy()
  165. Received: false
  166. 55 | test('[TC-G-N04] 未授权访问家庭成员列表被拒(401/403)', async ({ request }) => {
  167. 56 | const r = await apiPost(request, '/api/family/member/list', {}, null);
  168. > 57 | expect([401, 403].includes(r.code), `成员列表未授权应 401/403,实际 code=${r.code} msg=${r.message}`).toBeTruthy();
  169. | ^
  170. 58 | });
  171. 59 |
  172. 60 | test('[TC-G-N04] 未授权调用 AI 健康教练被拒(401/403)', async ({ request }) => {
  173. at D:\cfc\tests\e2e\api\nonfunc-security.spec.js:57:96
  174. Error Context: .api-artifacts\api-nonfunc-security-非功能-安-ab6c7--N04-未授权访问家庭成员列表被拒-401-403--desktop\error-context.md
  175. [50/58] [desktop] › e2e\api\nonfunc-security.spec.js:60:3 › 非功能/安全接口冒烟 › [TC-G-N04] 未授权调用 AI 健康教练被拒(401/403)
  176. 10) [desktop] › e2e\api\nonfunc-security.spec.js:60:3 › 非功能/安全接口冒烟 › [TC-G-N04] 未授权调用 AI 健康教练被拒(401/403)
  177. Error: AI 教练未授权应 401/403,实际 code=502 msg=NON_JSON_RESPONSE
  178. expect(received).toBeTruthy()
  179. Received: false
  180. 60 | test('[TC-G-N04] 未授权调用 AI 健康教练被拒(401/403)', async ({ request }) => {
  181. 61 | const r = await apiPost(request, '/api/ai/health-coach/send', { query: '你好' }, null);
  182. > 62 | expect([401, 403].includes(r.code), `AI 教练未授权应 401/403,实际 code=${r.code} msg=${r.message}`).toBeTruthy();
  183. | ^
  184. 63 | });
  185. 64 |
  186. 65 | // —— IDOR 横向越权(TC-P-N09 / TC-X-N05):携带本人 token 越权访问他人 familyId → 403 ——
  187. at D:\cfc\tests\e2e\api\nonfunc-security.spec.js:62:97
  188. Error Context: .api-artifacts\api-nonfunc-security-非功能-安-d1d5f-04-未授权调用-AI-健康教练被拒-401-403--desktop\error-context.md
  189. [51/58] [desktop] › e2e\api\nonfunc-security.spec.js:66:3 › 非功能/安全接口冒烟 › [TC-P-N09] IDOR:越权访问他人家庭成员列表 → 403
  190. 11) [desktop] › e2e\api\nonfunc-security.spec.js:66:3 › 非功能/安全接口冒烟 › [TC-P-N09] IDOR:越权访问他人家庭成员列表 → 403
  191. TimeoutError: apiRequestContext.post: Timeout 15000ms exceeded.
  192. Call log:
  193. - → POST http://cfc.iwintrue.com/api/auth/direct-register
  194. - user-agent: Playwright/1.61.1 (x64; windows 10.0) node/22.22
  195. - accept: */*
  196. - accept-encoding: gzip,deflate,br
  197. - content-type: application/json
  198. - content-length: 59
  199. at helpers\api.js:28
  200. 26 | */
  201. 27 | async function registerRole(request, role, nickname) {
  202. > 28 | const res = await request.post('/api/auth/direct-register', {
  203. | ^
  204. 29 | data: { phone: randPhone(), role, nickname: nickname || 'QA-' + role },
  205. 30 | });
  206. 31 | const body = await res.json().catch(() => ({}));
  207. at registerRole (D:\cfc\tests\e2e\helpers\api.js:28:29)
  208. at getParent (D:\cfc\tests\e2e\api\nonfunc-security.spec.js:38:25)
  209. at D:\cfc\tests\e2e\api\nonfunc-security.spec.js:67:17
  210. Error Context: .api-artifacts\api-nonfunc-security-非功能-安-31e4e-N09-IDOR:越权访问他人家庭成员列表-→-403-desktop\error-context.md
  211. [52/58] [desktop] › e2e\api\nonfunc-security.spec.js:75:3 › 非功能/安全接口冒烟 › [TC-A-N05] 非管理员访问后台接口被拒(401/403)
  212. 12) [desktop] › e2e\api\nonfunc-security.spec.js:75:3 › 非功能/安全接口冒烟 › [TC-A-N05] 非管理员访问后台接口被拒(401/403)
  213. Error: 后台接口未授权应 401/403,实际 code=500 msg=手机号和验证码不能为空
  214. expect(received).toBeTruthy()
  215. Received: false
  216. 75 | test('[TC-A-N05] 非管理员访问后台接口被拒(401/403)', async ({ request }) => {
  217. 76 | const r = await apiPost(request, '/api/admin-auth/login', {}, null);
  218. > 77 | expect([401, 403].includes(r.code), `后台接口未授权应 401/403,实际 code=${r.code} msg=${r.message}`).toBeTruthy();
  219. | ^
  220. 78 | });
  221. 79 |
  222. 80 | // —— 双角色铁律 / 权限提升防护(TC-C-N07)——
  223. at D:\cfc\tests\e2e\api\nonfunc-security.spec.js:77:96
  224. Error Context: .api-artifacts\api-nonfunc-security-非功能-安-1d575-A-N05-非管理员访问后台接口被拒-401-403--desktop\error-context.md
  225. [53/58] [desktop] › e2e\api\nonfunc-security.spec.js:81:3 › 非功能/安全接口冒烟 › [TC-C-N07] 角色切换接口未授权被拒(401/403)
  226. 13) [desktop] › e2e\api\nonfunc-security.spec.js:81:3 › 非功能/安全接口冒烟 › [TC-C-N07] 角色切换接口未授权被拒(401/403)
  227. Error: 切换角色未授权应 401/403,实际 code=500 msg=用户不存在
  228. expect(received).toBeTruthy()
  229. Received: false
  230. 81 | test('[TC-C-N07] 角色切换接口未授权被拒(401/403)', async ({ request }) => {
  231. 82 | const r = await apiPost(request, '/api/auth/switch-role', { role: 'parent' }, null);
  232. > 83 | expect([401, 403].includes(r.code), `切换角色未授权应 401/403,实际 code=${r.code} msg=${r.message}`).toBeTruthy();
  233. | ^
  234. 84 | });
  235. 85 |
  236. 86 | test('[TC-C-N07] 权限提升防护:家长不可切换为未持有角色', async ({ request }) => {
  237. at D:\cfc\tests\e2e\api\nonfunc-security.spec.js:83:96
  238. Error Context: .api-artifacts\api-nonfunc-security-非功能-安-7e22b--C-N07-角色切换接口未授权被拒-401-403--desktop\error-context.md
  239. [54/58] [desktop] › e2e\api\nonfunc-security.spec.js:86:3 › 非功能/安全接口冒烟 › [TC-C-N07] 权限提升防护:家长不可切换为未持有角色
  240. 14) [desktop] › e2e\api\nonfunc-security.spec.js:86:3 › 非功能/安全接口冒烟 › [TC-C-N07] 权限提升防护:家长不可切换为未持有角色
  241. Error: 家长不应越权切到 admin(实际 data={"token":"eyJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoiYWRtaW4iLCJyb2xlcyI6WyJhZG1pbiJdLCJ1c2VySWQiOjgxODQ2LCJzdWIiOiI4MTg0NiIsImlhdCI6MTc5MzQ2NTY2MSwiZXhwIjoxNzk2MDU3NjYxfQ.vr6Gtig0-5c8D82bkEETxmeFkWCA-QNEOBMpJFI-pW4","userId":81846,"role":"admin","roles":null,"familyId":3093,"nickname":"QA-SEC","phone":"13191822207","currentMemberId":null,"isNewUser":false,"openid":null,"needsRoleSelect":null,"needsFamily":false,"teacherStatus":"pending","teacherRejectReason":null,"hasTeacherRole":false,"vendorType":null,"activityProviderStatus":null})
  242. expect(received).toBeFalsy()
  243. Received: "eyJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoiYWRtaW4iLCJyb2xlcyI6WyJhZG1pbiJdLCJ1c2VySWQiOjgxODQ2LCJzdWIiOiI4MTg0NiIsImlhdCI6MTc5MzQ2NTY2MSwiZXhwIjoxNzk2MDU3NjYxfQ.vr6Gtig0-5c8D82bkEETxmeFkWCA-QNEOBMpJFI-pW4"
  244. 88 | const ctx = await getParent(request);
  245. 89 | const r = await apiPost(request, '/api/auth/switch-role', { role: 'admin' }, ctx.token);
  246. > 90 | expect(r.data && r.data.token, `家长不应越权切到 admin(实际 data=${JSON.stringify(r.data)})`).toBeFalsy();
  247. | ^
  248. 91 | });
  249. 92 |
  250. 93 | test('[TC-C-N07] 角色切换自身合法角色正常(基线)', async ({ request }) => {
  251. at D:\cfc\tests\e2e\api\nonfunc-security.spec.js:90:89
  252. Error Context: .api-artifacts\api-nonfunc-security-非功能-安全接口冒烟-TC-C-N07-权限提升防护:家长不可切换为未持有角色-desktop\error-context.md
  253. [55/58] [desktop] › e2e\api\nonfunc-security.spec.js:93:3 › 非功能/安全接口冒烟 › [TC-C-N07] 角色切换自身合法角色正常(基线)
  254. [56/58] [desktop] › e2e\api\nonfunc-security.spec.js:101:3 › 非功能/安全接口冒烟 › [TC-P-N10] AI 健康教练 XSS:query 注入脚本不回显原始脚本且不错 500
  255. [57/58] [desktop] › e2e\api\nonfunc-security.spec.js:109:3 › 非功能/安全接口冒烟 › [TC-A-N06] 活动反馈存储型 XSS:提交含脚本 comment,列表不回显原始脚本
  256. [58/58] [desktop] › e2e\api\nonfunc-security.spec.js:121:3 › 非功能/安全接口冒烟 › [TC-P-N11] 报告上传非 PDF/恶意内容被拒(非 200)
  257. 15) [desktop] › e2e\api\nonfunc-security.spec.js:121:3 › 非功能/安全接口冒烟 › [TC-P-N11] 报告上传非 PDF/恶意内容被拒(非 200)
  258. Error: expect(received).toBeTruthy()
  259. Received: false
  260. 129 | // 安全合规行为:拒绝为 4xx(400/401/403/405/413/415/422)。非 200 即视为未成功落库。
  261. 130 | expect(status, `报告上传非 PDF 应被拒(4xx),实际 HTTP ${status}`).not.toBe(200);
  262. > 131 | expect([400, 401, 403, 405, 413, 415, 422].includes(status)).toBeTruthy();
  263. | ^
  264. 132 | });
  265. 133 | });
  266. 134 |
  267. at D:\cfc\tests\e2e\api\nonfunc-security.spec.js:131:66
  268. Error Context: .api-artifacts\api-nonfunc-security-非功能-安-18c8a-N11-报告上传非-PDF-恶意内容被拒-非-200--desktop\error-context.md
  269. 15 failed
  270. [desktop] › e2e\api\family-member-api.spec.js:54:3 › 【API级】家庭成员管理全流程 › [场景2] 添加新家庭成员 - 期望添加成功并返回完整信息
  271. [desktop] › e2e\api\family-member-api.spec.js:63:3 › 【API级】家庭成员管理全流程 › [场景2b] 添加成员时昵称为空 - 期望返回错误提示
  272. [desktop] › e2e\api\nonfunc-perf-compat.spec.js:56:1 › [TC-G-N03] 非微信H5兜底登录:手机号注册登录路径 UA 无关 ────
  273. [desktop] › e2e\api\nonfunc-perf-compat.spec.js:63:1 › [TC-G-N02/P-N06/C-N03/T-N04/S-N03/X-N07] 多端 UA 兼容:同请求不同客户端返回一致
  274. [desktop] › e2e\api\nonfunc-perf-compat.spec.js:79:1 › [TC-A-N04/X-N02] 限流熔断稳定性:爆发请求下系统不死(不出现 5xx 雪崩)
  275. [desktop] › e2e\api\nonfunc-perf-compat.spec.js:92:1 › [TC-P-N02/X-N01] 并发不串数据:并行 AI 请求各自独立响应 ──
  276. [desktop] › e2e\api\nonfunc-perf-compat.spec.js:106:1 › [响应时间基线] 已登录家庭列表单请求耗时冒烟 ≤ 8s ───────────
  277. [desktop] › e2e\api\nonfunc-security.spec.js:50:3 › 非功能/安全接口冒烟 › [TC-G-N04] 未授权访问能量概览被拒(401/403)
  278. [desktop] › e2e\api\nonfunc-security.spec.js:55:3 › 非功能/安全接口冒烟 › [TC-G-N04] 未授权访问家庭成员列表被拒(401/403)
  279. [desktop] › e2e\api\nonfunc-security.spec.js:60:3 › 非功能/安全接口冒烟 › [TC-G-N04] 未授权调用 AI 健康教练被拒(401/403)
  280. [desktop] › e2e\api\nonfunc-security.spec.js:66:3 › 非功能/安全接口冒烟 › [TC-P-N09] IDOR:越权访问他人家庭成员列表 → 403
  281. [desktop] › e2e\api\nonfunc-security.spec.js:75:3 › 非功能/安全接口冒烟 › [TC-A-N05] 非管理员访问后台接口被拒(401/403)
  282. [desktop] › e2e\api\nonfunc-security.spec.js:81:3 › 非功能/安全接口冒烟 › [TC-C-N07] 角色切换接口未授权被拒(401/403)
  283. [desktop] › e2e\api\nonfunc-security.spec.js:86:3 › 非功能/安全接口冒烟 › [TC-C-N07] 权限提升防护:家长不可切换为未持有角色
  284. [desktop] › e2e\api\nonfunc-security.spec.js:121:3 › 非功能/安全接口冒烟 › [TC-P-N11] 报告上传非 PDF/恶意内容被拒(非 200)
  285. 4 skipped
  286. 10 did not run
  287. 29 passed (3.3m)