test-spec.md 8.3 KB

测试规格 — 统一能力开放平台产品化改造

依据:code-copilot/rules/automated-testing-standard.md 基线:复用 unified-capability-open-platform 已通过的认证、授权、限流、幂等和审计测试,仅验证本轮差异与必要回归。

1. P0 自动化验证

编号 验证项 证据
P0-1 通用执行适配器正确分派,未知/重复来源失败关闭 OpenGatewayCapabilityResolverTest 3/3、CapabilityInvokeOrchestratorTest 10/10
P0-2 BUSINESS_ACTION/FLOW_ACTION 现有调用兼容 BusinessActionOpenGatewayAdapterTest 3/3、FlowActionExecutionAdapterTest 6/6
P0-3 REST/MCP audience 严格分离 CapabilityAccessTokenServiceTest 7/7、OpenGatewayAuthenticatorTest 4/4;MCP 委托身份集成测试 3/3
P0-4 Markdown 完整参数表、规则、示例、错误和敏感信息排除 CapabilityOpenApiDocumentServiceTest 3/3,覆盖 Spring 容器构造器注入、递归 Schema、业务规则、权限、错误码、Token Exchange 和敏感占位符
P0-5 OpenAPI Body/Header 幂等契约一致 CapabilityOpenApiDocumentServiceTest 验证 Idempotency-Key 仅位于 Header,错误码契约完整
P0-6 调用指南 readiness 和示例分支 CapabilityCallGuideServiceTest 5/5,覆盖客户端/授权/网关开关阻断、网关强制 Identity 运行态和 OAuth/HMAC 示例
P0-7 系统服务仅执行代码注册定义 SystemServiceDefinitionRegistryTest 4/4、SystemServiceCapabilityPublisherTest 3/3、SystemServiceOpenGatewayAdapterTest 3/3
P0-8 流程启动固定模型、拒绝身份/模型注入、快照漂移失败关闭 FlowProcessStartSystemServiceTest 5/5
P0-9 Blob 显式保留,Markdown/OpenAPI 下载可用 ✅ capability 相关 4 个前端文件定向 ESLint 零错误;生产构建成功并包含调用指南/系统服务注册组件;真实浏览器下载保留为 P1
P0-10 Admin 聚合编译与前端生产构建 ✅ Admin 47/47 Reactor 模块编译成功;前端 pnpm build 成功

2. P1 环境验证

  • 配置真实 MySQL/Redis/OIDC 后完成 OAuth Token → 调用指南 curl → 流程实例启动。
  • 使用 MCP audience Token 调 REST,预期 401;使用 REST audience Token 调 MCP,预期 401。
  • 浏览器完成“注册流程启动能力 → 创建客户端 → 授权 → 查看就绪状态 → 下载 Markdown → curl 调用”。

P1 环境不可用时记录跳过原因,不伪造通过结论。

本轮未启动真实 Admin/Flow 服务,也未连接 MySQL、Redis 或 OIDC,所以上述 P1 项保持待验证;详细原因和复跑入口见 execution-log.md

3. 安全回归

  • 不存在任意 URL/Method/Bean 配置入口。
  • 请求 Schema 不包含 modelKey/modelId/tenantId/userId/activeOrgId/initiator
  • 指南和文档不含任何真实 Secret、Token 或用户敏感信息。
  • 未注册来源、流程快照失效、权限不足、身份不兼容均在副作用前拒绝。

4. 2026-08-02 启动装配缺陷增量验证

  • Identity 关闭但 Open Gateway 开启时,Identity 自动配置仍提供 CapabilityAccessTokenService
  • Open Gateway 与 Identity 联合上下文可创建认证器和调用编排器,不再出现缺 Bean。
  • 调用指南采用与运行态一致的有效 Identity 状态,OAuth 检查和示例不产生假阻断。
  • Identity、Open Gateway、Control Plane 相关模块全量测试通过。
  • Admin 聚合编译通过,git diff --check 无空白错误。

5. 2026-08-02 授权参数与中文字典增量验证(待用户执行)

本轮用户明确要求由其自行测试,因此以下项目只记录验证范围,不标记为通过:

  • 后端 forge.crypto.enabled=false 时新增授权,请求体应直接绑定 clientId/capabilityId/versionStrategy/fixedVersion,授权成功。
  • 后端加密开启时新增授权,应先完成密钥协商并保持加密传输,授权成功。
  • 服务端安全配置无法读取时,前端应提示“无法确认服务端安全配置”并阻止敏感请求。
  • 能力目录的来源类型、风险等级、调用主体、可见性、发布状态均显示中文;当前版本继续显示语义版本号。
  • 能力详情的来源类型、行为类型及其它策略属性均显示中文。
  • 流程能力新增授权时,“允许操作”显示“发起流程/审批通过/审批驳回”,字典未就绪时禁止提交。
  • 临时制造某一个字典请求失败后,其它已成功字典仍正常显示;重新进入页面或点击刷新后可恢复,不需要重启整个 SPA。
  • Flyway 执行 V1.0.78__add_capability_catalog_dicts.sql 后,两类字典及六条字典数据存在且无重复。

6. 2026-08-02 OAuth 路由、能力恢复与在线测试(待用户执行)

本轮继续遵循用户“自行测试”的要求,以下项目不标记为已通过:

  • 配置 forge.capability.open-gateway.enabled=trueforge.capability.identity.enabled=false 并重启 Admin,POST /oauth2/token 不再返回 404,OAuth Client Credentials 能取得 OpenAPI audience Token。
  • 能力停用后目录显示“启用”;当前版本为 PUBLISHED 时可重新启用,能力状态恢复为 PUBLISHED/enabled=1
  • 人为使当前版本缺失或非发布状态后执行启用,接口应返回明确中文错误且能力保持停用。
  • SERVICE + OAuth 在线测试可完成 Token 与真实网关调用,页面展示两段完整脱敏报文。
  • USER 委托能力未填 subject_token 时前端阻止调用;填写受信 OIDC JWT 后走 Token Exchange,不伪造用户身份。
  • SERVICE + HMAC 在线测试签名通过;修改 Body 后重新测试仍按本次原始 Body 正确计算 SHA-256。
  • ACTION/FLOW 能力点击测试先出现副作用确认,确认后的调用报文包含唯一 Idempotency-Key
  • 下载测试报文不包含真实 Client Secret、Signing Key、Bearer Token、OIDC Token 或 HMAC Signature。
  • 下载接入示例包含地址、Resource、Scope、请求 Body、curl 和 Java 17 示例;Java 示例通过环境变量读取密钥。
  • 关闭调用指南或切换客户端后,之前输入的 Secret、Signing Key 和 subject token 被清空。

7. 2026-08-02 无 OIDC 客户端用户断言(待用户执行)

本轮用户明确要求由其自行测试,因此以下项目只记录验证范围,不标记为通过:

  • 执行 Flyway V1.0.79__add_capability_client_user_assertion.sql 后,客户端断言四个字段和映射 subject_hint 存在;重复检查无重复字段。
  • USER_DELEGATION/HYBRID + OAuth 客户端可生成 RSA-2048 密钥;返回 PKCS#8 私钥只出现一次,数据库仅保存 X.509 公钥、kid 和版本。
  • SERVICE、非 OAuth、过期、吊销客户端均不能启用用户断言。
  • 绑定外围 sub 后数据库只存在 SHA-256、脱敏提示和 Forge userId,不存在原始 sub;重复绑定同一用户幂等,绑定不同用户拒绝。
  • 系统管理员、租户管理员、禁用用户、强制改密用户、无组织或无有效角色用户均不能绑定。
  • 使用专用 urn:forge:params:oauth:token-type:user-assertion+jwt 可换取 USER Token;未预绑定 sub 返回 invalid_grant
  • 篡改签名、错误 kid/iss/aud/client_id、缺失 iat/exp/jti、未来签发、过期、TTL 超限、非法组织 ID 均返回 invalid_grant
  • 同一 jti 第二次使用被拒绝;Redis/Redisson 不可用时返回 temporarily_unavailable,不得降级放行。
  • 客户端断言验签失败后不会尝试 OIDC;OIDC JWT 也不会尝试客户端公钥验签。
  • 密钥轮换、用户断言停用和客户端吊销会递增 credential_version,旧私钥及旧 Forge Token 失效;用户映射保留。
  • 每次 Token Exchange 都重新加载 Forge 用户组织、角色和权限;用户状态、组织或角色失效后不能再换取 Token。
  • 客户端页面可一次下载私钥、管理脱敏映射;在线测试可选 OIDC/客户端断言,并能在浏览器内临时生成 RS256 JWT。
  • 下载测试报文和 Markdown 接入示例不包含 Client Secret、私钥、可用 JWT 或 Bearer Token;Java 17 示例从私钥文件和环境变量读取凭据。