Files
gaokao-volunteer-system/reports/LOCAL_BROWSER_E2E_COVERAGE_2026-06-16.md
Hermes Agent 45010f56a7
Some checks failed
CI / pytest (Python 3.10) (push) Has been cancelled
CI / pytest (Python 3.11) (push) Has been cancelled
CI / pytest (Python 3.12) (push) Has been cancelled
docs(reports): expand local e2e coverage matrix
2026-06-16 10:23:24 +08:00

159 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# GAOKAO 本地浏览器 E2E 覆盖矩阵2026-06-16
> 范围:用户端 Web 自助 MVP 全部浏览器可达页面 + 后台审计/管理页。
> 环境:本地 FastAPI 8011 / 临时 SQLite / alipay_sim 支付 / dev 默认密钥。
> 验证方式:真实浏览器 + curl/Python 真实 HTTP。
## 0. 顶层结论
| 项目 | 状态 |
| ------------------------------------------------- | ------------------------------------------------------------------- |
| 公开落地页 / 政策页 / 下单页 | ✅ 浏览器 HTTP 200 |
| 公开下单 → 模拟支付 → portal status | ✅ 浏览器真实走通 |
| portal 5-step 资料填写 → 提交 → status 推进 | ✅ 浏览器真实走通,摘要前后端一致 |
| portal report.html / report.pdf 下载 | ✅ 浏览器/HTTP 200PDF 头正确 |
| portal 删除申请提交 | ✅ HTTP 200admin 审计页可看到 |
| admin 登录 + dashboard + 删除审计页 + 通知审计页 + 运维告警页 | ✅ 浏览器+HTTP 全部 200命中真实数据 |
| 后台 API 兼容别名 `/api/admin/{orders,cases,stats}` | ✅ 已补齐兼容别名,旧路径与新路径并存 |
| 真实支付宝alipayacceptance | ⛔ 阻塞:缺商户凭据 / 备案域名 / 公网 notify_url |
## 1. 覆盖矩阵
### 1.1 公共侧(无需登录)
| 路径 | 真实浏览器 | HTTP | 备注 |
| -------------------- | ---------- | ---- | ---------------------- |
| `/` (landing) | ✅ | 200 | 历史报告 + 本次复核 |
| `/pricing` | ✅ | 200 | |
| `/privacy` | ✅ | 200 | |
| `/service-terms` | ✅ | 200 | |
| `/deletion-policy` | ✅ | 200 | |
| `/checkout/standard` | ✅ | 200 | 本次真实填单并完成支付 |
| `/checkout/audit` | ✅ | 200 | |
| `/checkout/premium` | ✅ | 200 | |
### 1.2 支付 + portal无需登录凭 portal token
| 路径 | 真实浏览器 | HTTP | 备注 |
| --------------------------------------------- | ---------- | ------------ | --------------------------------------------------- |
| `/pay/alipay-sim/{payment_id}` | ✅ | 200 | 模拟收银台页打开 |
| `POST /pay/alipay-sim/{payment_id}/complete` | ✅ | 303 → status | 模拟支付成功跳转 |
| `GET /portal/{token}/status` | ✅ | 200 | 状态推进 `paid``serving``delivered` |
| `GET /portal/{token}/info` | ✅ | 200 | 5-step 表单 + 真实 Step 5 摘要 |
| `POST /portal/{token}/info` (submit) | ✅ | 200 | 返回 `intake_status=submitted, stage=processing` |
| `GET /portal/{token}/report` | ✅ | 200 | HTML 报告内容与上传一致 |
| `GET /portal/{token}/report.pdf` | ✅ | 200 | `Content-Type: application/pdf`、头 `%PDF-1.4` |
| `GET /portal/{token}/notifications` | ✅ | 200 | 已复验,页面含 `通知审计` 与真实订单 |
| `GET /portal/{token}/deletion-request` (页面) | ⏸️ | 200 | 本轮通过 API 提交并验证 admin 端可见 |
| `POST /portal/{token}/deletion-request` | ✅ | 200 | 返回 `request_logged=true` |
### 1.3 后台 API
| 路径 | HTTP | 命中真实数据 |
| ------------------------------------------------ | ---- | -------------------------------------------------------------- |
| `POST /api/auth/login` | 200 | 拿到 JWT5 分钟过期 |
| `GET /api/auth/me` | 200 | `{id:1, role:admin, last_login_at:...}` |
| `GET /api/admin/notifications` | 200 | total=2包含 `report_ready_email`、order_id=GKO-20260615-OVIG |
| `GET /api/admin/notifications/deletion-requests` | 200 | 1 条,含 `张家长/13800138000/浏览器 e2e` |
| `GET /api/admin/notifications/ops-alerts` | 200 | 0 条(正常) |
| `GET /api/admin/users` | 200 | total≥1 |
| `GET /api/admin/users/{user_key}` | 200 | 已复验detail 脱敏字段与 `user_key` hash 对齐 |
| `GET /api/admin/orders` | 200 | 已补兼容别名;与 `/api/orders` 返回同一数据契约 |
| `GET /api/admin/cases` | 200 | 已补兼容别名;与 `/api/cases` 返回同一数据契约 |
| `GET /api/admin/stats/dashboard` | 200 | 已补兼容别名;返回 `summary/by_status/...` |
| `GET /api/admin/stats/orders` | 200 | 已补兼容别名;返回 `total_orders/...` |
| `GET /health` | 200 | |
### 1.4 后台页面(`page_router`
| 路径 | 真实浏览器 | HTTP | 命中真实数据 |
| -------------------------- | ---------- | ---- | --------------------------------------------------------------------------- |
| `/admin/dashboard` | ✅ | 200 | 已补后台兼容入口;内容与 `/dashboard` 一致 |
| `/admin/deletion-requests` | ✅ | 200 | `<h1>删除申请审计`、总数=1、订单、家长、联系方式、原因 |
| `/admin/notifications` | ✅ | 200 | `<h1>通知审计`、order_id、event_type=report_ready_email |
| `/admin/ops-alerts` | ✅ | 200 | `<h1>运维告警审计` |
### 1.4b 用户 / 元数据 / 分享页补充验收
| 路径 | 真实 HTTP | 结果 |
|---|---|---|
| `/api/admin/users` | 200 | `total=4`,列表脱敏正常(姓名/手机) |
| `/api/admin/users/{user_key}` | 200 | 明细脱敏正常,`customer_phone_hash``user_key` hash 段一致 |
| `/api/admin/users` 无 token | 401 | 鉴权正常 |
| `/api/admin/users/unknown-key` | 404 | 业务错误正常 |
| `/api/meta` | 200 | 枚举契约稳定 |
| `/api/auth/me` | 200 | 当前 admin 身份正常 |
| `/s/8udpdr` | 200 | 分享页 comment 权限正常 |
| `/s/oAdGsy` | 200 | 分享页 read 权限正常 |
| `/s/NOPE999` | 404 | 不存在分享链接正常 |
### 1.4c checkout / webhook / 异常分支补充验收
| 路径 | HTTP | 结果 |
|---|---|---|
| `/checkout/audit` | 200 | 页面正常 |
| `/checkout/basic` | 200 | 页面正常 |
| `/checkout/standard` | 200 | 页面正常 |
| `/checkout/premium` | 200 | 页面正常 |
| `/checkout/invalid` | 422 | 非法套餐拒绝正常 |
| `POST /api/public/orders` 缺 contact | 422 | 校验拒绝正常 |
| `POST /api/public/orders` price tamper | 422 | 金额篡改拒绝正常 |
| `POST /api/public/payments/mock/webhook` 缺/错签名 | 400 | 验签拒绝正常 |
| `GET /portal/{token}/report` (pending 单) | 409 | `report not ready` 正常 |
| `GET /portal/{wrong_token}/{status,info,notifications}` | 401 | token 拒绝正常 |
### 1.5 真实支付 acceptance阻塞于外部凭据
| 项 | 状态 |
| ------------------------ | ------- |
| 真实 alipay 商户凭据 | ⛔ 缺失 |
| 公网可访问 notify_url | ⛔ 缺失 |
| 备案域名 | ⛔ 缺失 |
| 真实 alipay-sim 之外链路 | ⛔ 阻塞 |
## 2. 本轮新增的证据(相对 2026-06-15 报告)
1. **portal/report 与 report.pdf 真实下载**
- `curl /portal/.../report` → 200body 首行 `<h1>志愿方案报告</h1><p>浏览器 e2e 自动验收</p>`
- `curl /portal/.../report.pdf` → 200body 前 9 字节 `%PDF-1.4\nlocal-brows`
2. **删除申请 -> admin 审计页整站闭环**
- `POST /portal/.../deletion-request``{order_id, request_logged:true, next_step}`
- `/admin/deletion-requests?order_id=GKO-...` → 命中 `张家长 / 13800138000 / 浏览器 e2e`
3. **admin 通知审计页真实可见**
- `/admin/notifications` 页面 + `/api/admin/notifications` API 都能看到 `report_ready_email / order_id`
4. **JWT 5 分钟过期门禁生效**(符合 P2-4 安全要求)
5. **后台兼容别名已补齐**(实环境 127.0.0.1:8011 + JWT 复验):
- `/admin/dashboard` → 200页面含 `仪表盘``/static/dashboard.js`
- `/api/admin/orders` → 200含 GKO-20260615-OVIG 历史订单)
- `/api/admin/cases` → 200items 列表)
- `/api/admin/stats/dashboard` → 200summary / total_orders 命中)
- `/api/admin/stats/orders` → 200
6. **13 端点同进程同会话一次性 HTTP 200**
- 旧路径 `/api/orders|cases|stats/dashboard` 仍 200无回归
- 新别名路径 `/api/admin/...``/admin/dashboard` 全 200
- 三类审计页deletion-requests / notifications / ops-alerts页+API 仍 200
7. **后台剩余 API 已复验**
- `/api/auth/me``/api/meta``/api/admin/users``/api/admin/users/{user_key}` 全 200
- users 列表/明细脱敏、401/404/422 负向分支正常
8. **公开剩余模块已复验**
- `/s/{code}` comment/read/not-found 正常
- `/checkout/{service_version}` 四套餐正常,非法值 422
- `/portal/{token}/notifications` 已复验
- mock webhook 外部成功路径仍受 secret 不可见限制,但验签失败路径正常,且 `alipay-sim complete` 等价路径已证实 webhook service 正常
## 3. 与 2026-06-15 报告的关系
`reports/LOCAL_BROWSER_VALIDATION_2026-06-15.md` 中提到的:
- ✅ 公共页、checkout、alipay_sim、portal status、portal info、deletion-request 页 — 本轮复验全部仍可用
- ⚠️ Step 5 真实浏览器提交 — 本轮已通过 `submitIntake('submit')` 在浏览器中触发,状态从 `paid` 推进到 `serving`(之前是 paid 状态机就停在 paid前端摘要字段与后端 status 摘要字段完全一致
- 🆕 本轮新增:报告 HTML/PDF 真实下载、admin 三类审计页真实可见、JWT 过期门禁、后台兼容别名与 dashboard 入口补齐
## 4. 当前未覆盖 / 阻塞项
| 项 | 阻断类型 | 关闭路径 |
| ----------------------------------------------------- | -------- | ------------------------------------------------------------------------------------- |
| 真实 alipay acceptance | 外部凭据 | 见 `docs/PAYMENT_PROVIDER_ONBOARDING.md` |
| `/api/public/payments/mock/webhook` 外部成功路径 | 环境秘密 | 8011 进程运行中的 webhook secret 不可见;失败分支已验,成功分支由 `alipay-sim complete` 等价证明 |
| 公开页 SEO / 移动端布局 | 范围 | 与当前 E2E 主链路无关 |