# P1/P2 可执行修复工单(文件级) ## 总览 | 工单ID | 优先级 | 主题 | 当前状态 | |---|---|---|---| | MOSQ-P1-001 | P1 | E2E 严格断言,消除 401/异常吞掉导致假绿 | 已修复(2026-03-20) | | MOSQ-P1-002 | P1 | 解封关键集成测试(去 Disabled + 取消 surefire 排除) | 已落地 | | MOSQ-P2-001 | P2 | 审批失败回滚的 anonymous 容错不应吞异常 | 已落地 | | MOSQ-P2-002 | P2 | AuthService demo fallback 与硬编码 demo hash 清理 | 已落地 | | MOSQ-P2-003 | P2 | 权限迁移测试CI可信度(CI已配置strict模式) | 已落地 | | MOSQ-P2-004 | P2 | 生产环境风控前置检查文档 | 已补充(2026-03-20) | --- ## MOSQ-P1-001:E2E 严格断言修复 ### 目标 - 禁止 `user-journey` 用例吞掉 API 错误后仍通过。 - 无真实凭证时必须“显式跳过”,有真实凭证时必须“严格断言 2xx”。 ### 文件级变更步骤 1. 修改 `frontend/e2e/fixtures/test-data.ts` - 新增 `TestData.userToken` 字段。 - 新增 `hasRealApiCredentials()`,用于判断是否真实凭证(非占位值)。 - `apiClient` 使用 `testData.userToken`,不再硬编码 `test-e2e-token`。 2. 修改 `frontend/e2e/tests/user-journey.spec.ts` - 在核心旅程用例 `beforeEach` 增加 `test.skip(!hasRealApiCredentials(...))`。 - 去除 API 步骤中的 `try/catch` 吞错逻辑。 - 为关键 API(活动列表/详情/统计/排行榜/短链/分享)增加强断言。 3. 修改 `frontend/e2e/tests/user-journey-fixed.spec.ts` - 同步改为严格断言模式。 - 无真实凭证显式 `skip`,不允许“日志告警后通过”。 ### 测试用例 1. 语法与装配检查 - 命令: - `cd frontend/e2e && npx playwright test --config playwright.config.ts --list` - 实际:27 条测试分布在6个文件中(api-smoke、h5-user-operations、simple-health、user-frontend-operation、user-journey、user-journey-fixed)。 2. 无真实凭证场景 - 命令: - `cd frontend/e2e && npx playwright test tests/user-journey-fixed.spec.ts --config playwright.config.ts --reporter=line` - 预期:相关测试 `skipped`(显式),0 条"假通过"。 3. 有真实凭证场景(环境准备后) - 命令: - `cd frontend/e2e && npx playwright test --config playwright.config.ts` - 预期:关键 API 步骤必须返回断言状态(200/201/3xx);出现 401/500 直接失败。 ### 回滚策略 - 仅回退以下文件到修复前版本: - `frontend/e2e/fixtures/test-data.ts` - `frontend/e2e/tests/user-journey.spec.ts` - `frontend/e2e/tests/user-journey-fixed.spec.ts` ### 工时评估 - 开发:1.5h - 验证:0.5h - 合计:2.0h ### 验收标准 - 不存在 `try/catch + console.warn/console.log` 吞 API 失败并继续通过的路径。 - 无凭证时是“显式 skipped”;有凭证时是“严格断言”。 --- ## MOSQ-P1-002:关键集成测试解封 ### 目标 - 移除 `SimpleApiIntegrationTest` 禁用状态。 - 取消 surefire 对关键集成测试的默认排除。 - 通过测试桩修复认证链路,避免解封即失败。 ### 文件级变更步骤 1. 修改 `src/test/java/com/mosquito/project/integration/AbstractIntegrationTest.java` - 注入 `@MockBean AuthService`。 - `@BeforeEach` 中 mock: - `validateToken(...) -> TokenInfo(10001L, ...)` - `getUserById(...) -> UserInfo(...)` - 导入 `TestSecurityConfig` 以稳定集成测试安全链路。 2. 修改 `src/test/java/com/mosquito/project/integration/SimpleApiIntegrationTest.java` - 删除 `@Disabled` 注解。 3. 修改 `pom.xml` - 从 `maven-surefire-plugin` 的 `excludes` 中移除: - `SimpleApiIntegrationTest` - `ShortLinkRedirectIntegrationTest` - `ActivityAnalyticsServiceIntegrationTest` - `ActivityServiceCacheTest` ### 测试用例 1. P1 定向回归 - 命令: - `mvn -q -Dtest=SimpleApiIntegrationTest,ShortLinkRedirectIntegrationTest,ActivityAnalyticsServiceIntegrationTest,ActivityServiceCacheTest test` - 预期: - `SimpleApiIntegrationTest` tests=6 failures=0 errors=0 - `ShortLinkRedirectIntegrationTest` tests=1 failures=0 errors=0 - `ActivityAnalyticsServiceIntegrationTest` tests=3 failures=0 errors=0 - `ActivityServiceCacheTest` tests=1 failures=0 errors=0 2. 全链路回归(CI 脚本) - 命令: - `./scripts/ci/backend-verify.sh` - 预期:P1 改动相关测试不过不应引入新失败。 - 当前观察:存在既有非 P1 阻断项 `PermissionCanonicalMigrationTest` SQL 方言问题(H2 对 `REGEXP` 不兼容)。 ### 回滚策略 - 仅回退以下文件: - `src/test/java/com/mosquito/project/integration/AbstractIntegrationTest.java` - `src/test/java/com/mosquito/project/integration/SimpleApiIntegrationTest.java` - `pom.xml` ### 工时评估 - 开发:1.0h - 验证:1.0h - 合计:2.0h ### 验收标准 - `SimpleApiIntegrationTest` 不再被 `@Disabled`。 - surefire 不再默认跳过上述 4 个关键集成测试。 - 定向回归全部通过。 --- ## MOSQ-P2-001:审批失败回滚 anonymous 容错 ### 目标 - 审批流失败补偿中,不再吞掉写审计失败异常;至少记录 warn 并携带上下文。 ### 文件级变更步骤 1. 修改 `src/main/java/com/mosquito/project/controller/ApiKeyController.java` - 定位审批失败回滚分支(当前 `catch (Exception ignore)`)。 - 改为: - 捕获后 `log.warn(...)`(包含 `approvalRecordId`/`apiKeyId`/`operator`)。 - 不影响主流程返回,但避免 silent failure。 2. 新增或修改测试 - 推荐新增:`src/test/java/com/mosquito/project/controller/ApiKeyControllerTest.java` - 覆盖“审计写入异常但接口仍可预期返回”场景,并断言日志/行为。 ### 测试用例 - `mvn -q -Dtest=ApiKeyControllerTest test` ### 回滚策略 - 回退 `ApiKeyController` 和新增测试文件。 ### 工时评估 - 开发:0.5h - 验证:0.5h - 合计:1.0h ### 验收标准 - 代码中不存在该处 `catch (Exception ignore)`。 - 单测覆盖该容错路径。 --- ## MOSQ-P2-002:移除 demo fallback 与硬编码 demo hash ### 目标 - 彻底去除 demo 认证分支和硬编码 hash,认证只依赖真实用户体系。 ### 文件级变更步骤 1. 修改 `src/main/java/com/mosquito/project/service/AuthService.java` - 删除 `ADMIN_HASH/OPERATOR_HASH` 常量。 - 删除 `verifyDemoUser/getDemoUserId/getDemoUserDisplayName` 及调用路径。 - `login` 在用户不存在时统一返回认证失败。 2. 补充测试 - 修改/新增 `src/test/java/com/mosquito/project/service/AuthServiceTest.java` - 覆盖: - 用户不存在 -> 认证失败 - 后端不再读取 `app.demo-auth.*` 配置(配置项已清理) ### 测试用例 - `mvn -q -Dtest=AuthServiceTest test` ### 回滚策略 - 回退 `AuthService` 与相关测试改动。 ### 工时评估 - 开发:1.0h - 验证:0.5h - 合计:1.5h ### 验收标准 - 主代码不存在硬编码 demo 凭据。 - 不存在"用户不存在时走 demo fallback"的认证分支。 --- ## MOSQ-P2-003:权限迁移测试CI可信度 ### 目标 - CI环境中确保权限迁移测试不被跳过,提升测试可信度。 ### 现状 - `RolePermissionMigrationTest` 使用 `Assumptions.assumeTrue()` 在无Docker环境下跳过测试 - CI脚本 `scripts/ci/backend-verify.sh` 已配置 `-Dmigration.test.strict=true` - 在无Docker本地环境中测试仍会被跳过,这是预期行为 ### 文件级变更步骤 无需代码修改,CI配置已正确。 ### 测试用例 1. CI环境验证 - 命令:`./scripts/ci/backend-verify.sh` - 预期:`RolePermissionMigrationTest` 在CI中不被跳过 ### 验收标准 - CI中 `RolePermissionMigrationTest` 必须执行,不被跳过。 --- ## MOSQ-P2-004:生产环境风控前置检查 ### 目标 - 补充生产环境部署前的风控检查清单文档。 ### 文件级变更 1. 新增文档:`docs/PRODUCTION_RISK_CHECKLIST.md` ### 检查清单内容 1. **认证与授权检查** - [ ] 所有管理接口已配置权限验证 - [ ] API Key认证已启用 - [ ] CORS配置已限制可信域名 2. **数据安全检查** - [ ] 敏感数据已加密存储 - [ ] 数据库连接已使用SSL - [ ] 审计日志已启用 3. **风控规则检查** - [ ] 风险规则已配置并启用 - [ ] 限流规则已配置 - [ ] 黑名单机制已就绪 4. **监控与告警检查** - [ ] 健康检查接口已配置 - [ ] 异常告警已配置 - [ ] 日志收集已配置 ### 验收标准 - 文档 `docs/PRODUCTION_RISK_CHECKLIST.md` 已创建并包含上述检查项。