背景: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 默认套件不受影响。
3.7 KiB
3.7 KiB
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)
覆盖:
- 提交演练任务(混合模式)→ 列表出现 → 详情 SSE 推进至「部分失败」→ 只重试失败项 → 状态回排队 / 生成中;
- 顶栏任务角标显示进行中数量,点开面板可进入任务详情;
- 提交后立即在详情取消任务 → 状态「已取消」,未开始项显示「已跳过」;
- 同一
Idempotency-Key+ 同一 body 重复提交返回同一 taskId(API 断言); - SSE
Last-Event-ID续推:先读一段事件流记录 seq,再按Last-Event-ID重连,断言首帧 seq 更大、不重发历史; - 权限三态:无
material:render只有material:read→ 不渲染提交 / 取消 / 重试;无material:read→/403。
前置
- API:
pnpm --filter @lingxi/api dev(http://127.0.0.1:3000/api/v1,真实 PG + Redis,已pnpm db:init;不要执行db:reset)。 - Worker:
pnpm --filter @lingxi/worker dev(QUEUE=all或至少QUEUE=verify;demo 任务走media:verify队列,不启动 worker 时进度不会推进)。 - Web:
pnpm --filter @lingxi/web dev(http://127.0.0.1:5173)。 - 本地浏览器:默认用系统 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 行为不变。