Files
hms/docs/qa/role-test-results/T00-system-integration-results.md
iven 6d5a711d2c
Some checks failed
CI / rust-check (push) Has been cancelled
CI / rust-test (push) Has been cancelled
CI / frontend-build (push) Has been cancelled
CI / security-audit (push) Has been cancelled
fix: 修复测试发现的 7 个问题 + 全 workspace clippy 清零
功能修复:
1. 患者创建空名称验证:后端添加 name.trim().is_empty() 检查
2. 仪表盘统计容错:单个查询失败返回零值而非 500
3. FHIR 路由修复:从 /fhir 移到 /api/v1/fhir 保持一致
4. 冻结模块后端中间件:新增 frozen_module_middleware 拦截冻结路径
5. 积分端点权限码:health.health-data.list → health.points.list
6. 角色权限迁移:护士补充 devices.list,运营补充 points.list/manage
7. 测试结果文档:R01-R05 角色测试 + T00/T10 结果归档

Clippy 全 workspace 清零(14→0 errors):
- erp-core: 修复 empty doc line、collapsible if、redundant closure 等 9 处
- erp-health: 修复 too_many_arguments、unused var、unnecessary parens 等 58 处
- erp-ai: 修复 dead_code、unused import 等 11 处
- erp-plugin: 修复 too_many_arguments、wildcard pattern 等 11 处
- erp-server-migration: 修复 enum_variant_names 5 处
- erp-auth/config/workflow/message: 各 1-3 处

工程改进:
- lint-staged 配置迁移到 .lintstagedrc.js(函数式避免文件列表传给 clippy)
- cargo fmt 统一格式化
2026-05-07 23:43:14 +08:00

68 lines
3.8 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.
# T00 系统集成测试结果
> 测试人: AI 辅助 | 测试日期: 2026-05-07 | 环境: Windows 11 / PostgreSQL 16 / 后端 localhost:3000
## 通过项 (20/28)
| # | 测试项 | 结果 | 说明 |
|---|--------|------|------|
| 1.1 | 后端启动 | ✅ | status=ok, 8 模块激活 |
| 1.2 | 健康检查 | ✅ | /api/v1/health 返回 200 |
| 1.3 | 前端启动 | ✅ | Vite 5174 端口正常 |
| 1.5 | 数据库连接 | ✅ | 140 张表 |
| 1.7 | Ollama 可达 | ✅ | qwen3:4b 模型加载 |
| 2.1 | 租户A查询 | ✅ | 所有患者 tenant_id 一致 |
| 2.3 | tenant_id 注入 | ✅ | 数据库中自动注入API 响应不暴露,安全设计) |
| 3.1 | patient.created 事件 | ✅ | domain_events 表记录正确 |
| 3.4 | 死信队列 | ✅ | 0 条失败事件 |
| 4.1 | 权限码格式 | ✅ | 58 个 health 权限码,格式统一 |
| 4.2 | 告警权限码 | ✅ | health.alerts.manage复数CRITICAL 已修复 |
| 5.3 | 冻结 API 拦截 | ✅ | 后端 API 返回 200前端拦截 |
| 6.4 | 软删除可见性 | ✅ | 总 153 条,软删除 98 条API 只返回未删除 |
| 7.2 | API 返回解密 | ✅ | 患者姓名明文返回 |
| 10.2 | 401 响应 | ✅ | 伪造 JWT 返回 401 |
| 10.3 | 403 响应 | ✅ | doctor 访问 /users 返回 403 |
| 12.1 | SQL 注入 | ✅ | 搜索 `OR 1=1` 返回 0 条,未泄漏 |
| 12.4 | CORS | ✅ | evil.com 不返回 allow-origin |
| 12.5 | JWT 伪造 | ✅ | 伪造 token 返回 401 |
| 13.2 | 审计字段 | ✅ | created_at/updated_at/created_by/updated_by 全部填充 |
| 13.3 | 乐观锁版本 | ✅ | version=1 递增 |
## 失败项 (7/28)
| # | 测试项 | 结果 | 说明 |
|---|--------|------|------|
| 4.3 | AuthButton 覆盖 | ⚠️ 未验证 | 需逐页检查,审计显示仅 26% 覆盖 |
| 5.1-5.2 | 冻结路由拦截 | ❌ 部分失败 | 前端 FROZEN_ROUTES 守卫生效,但后端 API 仍正常返回 care-plans(1条) 和 shifts(2条) 数据 |
| 7.1 | PII 加密写入 | ⚠️ 待确认 | 数据库中 name 字段为明文存储blind_indexes 表不存在,加密可能仅对 id_number 生效但无数据 |
| 7.4 | 跨租户加密隔离 | ⚠️ 未验证 | 单租户开发环境无法测试 |
| 8.1-8.4 | FHIR API | ❌ 全部 404 | /api/v1/fhir/R4/* 路径返回 404路由注册代码存在但运行时不生效 |
| 9.1 | SSE 消息端点 | ⚠️ 待验证 | curl 3 秒无输出(可能是 SSE 格式需浏览器 EventSource |
| 10.4 | 空名称创建 | ❌ 后端验证缺失 | `name=""` 的患者被成功创建HTTP 200应返回 400 验证错误 |
## 问题清单
### BUG-001: FHIR 路由 404HIGH
- **现象**: 所有 FHIR 端点(/api/v1/fhir/R4/Patient 等)返回 404
- **根因**: 代码中有路由注册(`module.rs` fhir_routes + `main.rs` .nest("/fhir",...)),但运行时未生效
- **影响**: 14 个 FHIR API 完全不可用
### BUG-002: 冻结模块后端未拦截MEDIUM
- **现象**: care-plans 和 shifts API 正常返回数据
- **根因**: 前端有 FROZEN_ROUTES 守卫,后端无拦截中间件
- **影响**: 直接调 API 可绕过冻结限制
### BUG-003: 患者空名称可创建MEDIUM
- **现象**: POST /health/patients `{"name":"","gender":"male"}` 成功创建
- **根因**: 后端缺少 name 非空验证
- **影响**: 脏数据(列表中显示只有首字母 "P" 的无意义记录)
### ISSUE-004: PII 加密状态不明LOW
- **现象**: blind_indexes 表不存在name 字段明文存储
- **根因**: 可能仅对 id_number 等高敏感字段启用加密,但当前测试数据无 id_number
- **影响**: 需要有 id_number 的患者数据才能验证
### ISSUE-005: AuthButton 覆盖率低LOW已知
- **现象**: 审计显示 13/50 声明权限码有 AuthButton 包裹
- **影响**: 其他权限码依赖后端 403 兜底,用户体验差(按钮可见但操作报错)