# e2e(Playwright) ## 现有用例 | 文件 | 说明 | 默认是否执行 | | --------------------------- | ------------------------------------------------------------------------------- | ----------------- | | `smoke.spec.ts` | A0 冒烟:登录、模块切换、403 / 404 | 是 | | `a1-identity.spec.ts` | A1-QA-01 账号生命周期(①–⑥) | 否,需 `A1_E2E=1` | | `a2-roles.spec.ts` | A2-QA-01 角色管理 / 权限三态 / SoD / 即时生效 | 否,需 `A2_E2E=1` | | `a3-client.spec.ts` | A3-QA-01 客户与行业六页可访问 / 数据加载 | 否,需 `A3_E2E=1` | | `a4-dicts-settings.spec.ts` | A4-QA-01 数据字典 / 三层合并 / 编码只读 / 系统配置 / 阈值确认 / 变更记录 | 否,需 `A4_E2E=1` | | `a5-audit-logs.spec.ts` | A5-QA-01 操作日志列表 / 筛选 / 详情 diff / 导出闭环 / 权限三态 / 运行日志 | 否,需 `A5_E2E=1` | | `a6-tasks.spec.ts` | A6-QA-01 任务提交 / SSE 进度 / 取消 / 仅重试失败项 / 幂等 / 断点续推 / 权限三态 | 否,需 `A6_E2E=1` | ## A6 任务中心用例(A6-QA-01) 覆盖: 1. 提交演练任务(混合模式)→ 列表出现 → 详情 SSE 推进至「部分失败」→ 只重试失败项 → 状态回排队 / 生成中; 2. 顶栏任务角标显示进行中数量,点开面板可进入任务详情; 3. 提交后立即在详情取消任务 → 状态「已取消」,未开始项显示「已跳过」; 4. 同一 `Idempotency-Key` + 同一 body 重复提交返回同一 taskId(API 断言); 5. SSE `Last-Event-ID` 续推:先读一段事件流记录 seq,再按 `Last-Event-ID` 重连,断言首帧 seq 更大、不重发历史; 6. 权限三态:无 `material:render` 只有 `material:read` → 不渲染提交 / 取消 / 重试;无 `material:read` → `/403`。 ### 前置 1. API:`pnpm --filter @lingxi/api dev`(`http://127.0.0.1:3000/api/v1`,真实 PG + Redis,已 `pnpm db:init`;**不要执行 `db:reset`**)。 2. Worker:`pnpm --filter @lingxi/worker dev`(`QUEUE=all` 或至少 `QUEUE=verify`;demo 任务走 `media:verify` 队列,不启动 worker 时进度不会推进)。 3. Web:`pnpm --filter @lingxi/web dev`(`http://127.0.0.1:5173`)。 4. 本地浏览器:默认用系统 Chrome(`PLAYWRIGHT_CHANNEL` 未设置时);若使用 Playwright 自带 Chromium,先 `PLAYWRIGHT_BROWSERS_PATH=.dev/playwright-browsers pnpm exec playwright install chromium`,再设置 `PLAYWRIGHT_CHANNEL=''`。 ### 数据自建自清 `beforeAll` 直接经 Prisma 创建三个临时账号(密码 `lingxi2026`): - `qa6.tasks.e2e`(`super_admin`):提交 / 取消 / 重试全流程; - `qa6.tasks.ro`(临时角色 `a6e2e_task_viewer`,仅 `material:read` + 全部数据范围):只读三态; - `qa6.tasks.none`(临时角色 `a6e2e_no_material`,仅 `delivery:read`):访问列表 → 403。 `afterAll` 删除临时账号、角色、临时任务的 task_events / media_items / media_tasks、幂等键与 outbox 事件; 审计日志 append-only,产生的记录不删除(预期留痕)。 ### 运行 ```bash A6_E2E=1 pnpm exec playwright test e2e/a6-tasks.spec.ts --reporter=list ``` - 可选覆盖:`A6_E2E_BASE_URL`(缺省 `http://127.0.0.1:5173`)、`A6_E2E_API_BASE_URL`(缺省 `http://127.0.0.1:3000/api/v1`)。 - 截图:`design/a6-ui-v1/shots/impl/e2e/`。 - 门控未开启(无 `A6_E2E=1`)时整文件 `test.skip`,`pnpm test:e2e` 与 CI 行为不变。