Files
lingxi/e2e
Stev_Wang 4825626bdf test(e2e): A6 任务中心端到端用例与本地 Playwright 通道
背景:A6-QA-01 要求验证幂等 / 取消 / 重试 / 断线续推 / 权限三态;同时本地无 ~/Library/Caches 写权限,需要可复现的浏览器安装方式。
改动:
- 新增 e2e/a6-tasks.spec.ts(A6_E2E=1 门控):6 条用例覆盖提交 → 列表 → 详情 SSE → 部分失败 → 仅重试失败项、立即取消、同 Idempotency-Key 复用与 40902、Last-Event-ID 断点续推、只读不渲染写操作、无 material:read → 403;beforeAll 用 Prisma 建临时超管 / 只读 / 无权限账号与角色,afterAll 清理任务、幂等键、outbox 与账号角色(审计 append-only 保留)。
- playwright.config.ts 支持 PLAYWRIGHT_CHANNEL:未设置时本地用系统 Chrome,显式空串(CI)用 Playwright 自带 Chromium。
- eslint.config.mjs 忽略本地 .dev(Playwright 浏览器与临时脚本)。
- e2e/README.md 补充 A6 用例与运行方式。
影响面:默认(无 A6_E2E=1)仍 skip,CI pnpm test:e2e 行为不变;仅本地 e2e 配置增加环境变量支持。
回滚:撤销提交,删除 spec 与 channel 逻辑即可。
验证:A6_E2E=1 pnpm exec playwright test e2e/a6-tasks.spec.ts 6/6(约 39s,连跑多次稳定);pnpm test:e2e 默认套件不受影响。
2026-11-05 11:41:14 +08:00
..

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,产生的记录不删除(预期留痕)。

运行

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 行为不变。