背景: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 默认套件不受影响。
55 lines
3.7 KiB
Markdown
55 lines
3.7 KiB
Markdown
# 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 行为不变。
|