diff --git a/docs/superpowers/reviews/2026-06-01-FE-03-verify.md b/docs/superpowers/reviews/2026-06-01-FE-03-verify.md new file mode 100644 index 0000000..aa2df9d --- /dev/null +++ b/docs/superpowers/reviews/2026-06-01-FE-03-verify.md @@ -0,0 +1,106 @@ +# FE-03 用户列表与查询 — 证据验证报告(round=0) + +> 阶段:前端(frontend)。验证对象:`FE-03`(关联 `REQ-USR-003`,scope=usr)。 +> 上游 spec:`docs/superpowers/specs/2026-06-01-FE-03.md`;上游 plan:`docs/superpowers/plans/2026-06-01-FE-03.md`。 +> 验证时间:2026-06-01。本报告由 fe-feature-verify 渲染,主会话不自由编写测试,仅按测试命令的结构化结果落盘。 + +--- + +## 一、验证结论 + +**全部通过(PASS)**。单测与 E2E 两个门禁目标 `exit_code` 均为 0,`failed=0`,可进入 review。 + +| 目标 | 命令 | exit_code | passed | failed | 结论 | +|---|---|---|---|---|---| +| 单元测试(jsdom / Vitest) | `npm run test:unit`(= `vitest run`) | 0 | 138(32 文件) | 0 | ✅ PASS | +| 端到端(Playwright) | `npm run test:e2e`(= `playwright test`) | 0 | 15 | 0 | ✅ PASS | + +> 命令来源:`docs/04-技术规范.md § 零 命令清单`(前端 unit=`npm run test:unit`、e2e=`npm run test:e2e`)。本验证执行全量套件(覆盖 plan T1–T9 全部新增 jsdom 单测 + `userlist.spec.ts` E2E,并校验 FE-01/FE-02 既有 unit/E2E 不回归,对齐 plan T9「全量验证」门禁)。 + +--- + +## 二、单元测试(jsdom / Vitest) + +- 命令:`cd frontend && npm run test:unit` +- exit_code:`0` +- 结果:`Test Files 32 passed (32)` / `Tests 138 passed (138)` +- failed_list:(空) +- 覆盖 FE-03 新增的 7 个单测文件均通过: + - `tests/unit/usrApi.userlist.test.ts`(listUsers 透传 query → GET /usr/users,返回 PageResult;3 用例) + - `tests/unit/exportUtils.test.ts`(CSV/常量/默认值断言) + - `tests/unit/useUserList.test.tsx`(状态机 6 态:initialLoading/loading/success/empty/error/exporting) + - `tests/unit/UserFilterBar.test.tsx`(BR2/BR3/BR4/BR7/BR10 默认值/枚举/回车搜索/清空) + - `tests/unit/UserTable.test.tsx`(BR1/BR6/BR11/BR12/BR14 序号/作废只读/行双击导航/受控分页/空态) + - `tests/unit/UserToolbar.test.tsx`(BR8/BR9/BR13/D7 刷新/新增导航/导出中禁用/齿轮占位) + - `tests/unit/UserListPage.test.tsx`(8 用例:挂载默认查询/搜索/翻页 BR8/错误重试/空态/BR15 pageNum 回显) +- FE-01/FE-02 既有单测(authSlice / request / LoginPage* / AppLayout* / router / RequireAuth / RedirectIfAuthed / Home / Kpi / Nav 等)一并绿,无回归。 + +### stdout 摘录(≤30 行) + +``` + ✓ tests/unit/UserListPage.test.tsx (8 tests) 1509ms + ✓ UserListPage 集成 > initial load renders rows from listUsers (default query) (BR2) 393ms + ✓ tests/unit/usrApi.userlist.test.ts (3 tests) 2ms + ✓ tests/unit/usrApi.test.ts (2 tests) 2ms + ✓ tests/unit/RequireAuth.test.tsx (3 tests) 71ms + ✓ tests/unit/RedirectIfAuthed.test.tsx (3 tests) 57ms + ✓ tests/unit/AppLayout.unauthorized.test.tsx (1 test) 81ms + ✓ tests/unit/LoginPage.error.test.tsx (6 tests) 1752ms + + Test Files 32 passed (32) + Tests 138 passed (138) + Start at 17:48:22 + Duration 4.43s (transform 532ms, setup 2.36s, collect 37.88s, tests 13.58s, environment 8.09s, prepare 1.44s) +``` + +> 说明:日志中 `window.getComputedStyle(elt, pseudoElt) Not implemented`(来自 rc-table measureScrollbarSize)与 React Router v7 future flag / `localStorage --localstorage-file` 等为 jsdom/依赖侧的非致命 stderr 警告,不影响断言,全部用例仍判定通过(`exit_code=0`,`138 passed`)。 + +--- + +## 三、端到端测试(Playwright) + +- 命令:`cd frontend && npm run test:e2e` +- exit_code:`0` +- 结果:`Running 15 tests using 9 workers` → `15 passed (2.5s)` +- failed_list:(空) +- FE-03 `tests/e2e/userlist.spec.ts` 6 用例全过:进入用户列表渲染行 / 空结果显示「暂无匹配的用户」/ 按值搜索触发查询 / 翻页 pageNum=2 重取 / 行双击进用户单据 / 错误响应重试后恢复。 +- FE-01 `login.spec.ts`(4 用例)+ FE-02 `shell.spec.ts`(5 用例)一并绿,无回归。 + +### stdout 摘录(≤30 行) + +``` +Running 15 tests using 9 workers + ✓ 7 [chromium] › tests/e2e/login.spec.ts:22:3 › loads /login and shows version options (501ms) + ✓ 3 [chromium] › tests/e2e/login.spec.ts:32:3 › blocks submit with validation when empty (582ms) + ✓ 6 [chromium] › tests/e2e/shell.spec.ts:95:3 › visiting / unauthenticated redirects to /login (625ms) + ✓ 4 [chromium] › tests/e2e/shell.spec.ts:61:3 › open and close 全部导航 overlay (677ms) + ✓ 9 [chromium] › tests/e2e/shell.spec.ts:53:3 › login then lands on home with topbar and KPI title (674ms) + ✓ 1 [chromium] › tests/e2e/shell.spec.ts:73:3 › open 用户列表 tab from common ops then close back to home (764ms) + ✓ 2 [chromium] › tests/e2e/login.spec.ts:50:3 › successful login navigates away from /login (1.0s) + ✓ 10 [chromium] › tests/e2e/userlist.spec.ts:73:3 › enter user list renders rows (486ms) + ✓ 8 [chromium] › tests/e2e/login.spec.ts:77:3 › failed login stays on /login with error (1.0s) + ✓ 11 [chromium] › tests/e2e/userlist.spec.ts:88:3 › empty result shows 暂无匹配的用户 (471ms) + ✓ 5 [chromium] › tests/e2e/shell.spec.ts:86:3 › logout returns to /login (1.1s) + ✓ 12 [chromium] › tests/e2e/userlist.spec.ts:102:3 › search by value triggers query (523ms) + ✓ 14 [chromium] › tests/e2e/userlist.spec.ts:146:3 › double click row navigates to user detail (492ms) + ✓ 13 [chromium] › tests/e2e/userlist.spec.ts:124:3 › pagination next page refetches with pageNum=2 (528ms) + ✓ 15 [chromium] › tests/e2e/userlist.spec.ts:161:3 › error response shows retry then recovers (478ms) + + 15 passed (2.5s) +``` + +--- + +## 四、作用域校验 + +- 验证仅运行 `frontend/` 下的测试套件;未触碰 `backend/` / `sql/` / `scripts/`,作用域校验通过。 +- 本报告落盘于 `docs/superpowers/reviews/`(与 review 报告同目录),round=0 → 文件名后缀 `-verify.md`,符合命名约定。 + +--- + +## 五、自主决策记录(decisions) + +| # | 问题 | 选择 | 依据 | 置信度 | +|---|---|---|---|---| +| V1 | 测试命令默认值取 `pnpm test:ci`/`pnpm e2e:ci` 还是 docs/04 锁定值 | 取 `docs/04-技术规范.md § 零` 锁定的 `npm run test:unit` / `npm run test:e2e`(package.json scripts 实测存在且对应 `vitest run` / `playwright test`) | flow 明确「命令从 docs/04 § 零取,缺失才用默认」;本仓 docs/04 § 零命令清单已锁定前端命令,且 `frontend/package.json` 中两脚本均存在;默认值仅在缺失时兜底,此处不缺失 | high | +| V2 | 仅跑 plan 列出的 FE-03 新增测试文件,还是跑全量套件 | 跑全量 `test:unit` + `test:e2e` | plan T9 门禁要求「`npm run test:unit && npm run test:e2e` 全绿」且需校验 FE-01/FE-02 不回归(router.test/shell.spec);全量执行同时覆盖 FE-03 新增用例与回归面,过滤模式仅为子任务级验证手段 | high |