Files
th-hotel-simple/docs/project/integrations/superagent-mcp/test-cases.md
2026-07-12 19:39:14 +08:00

153 lines
9.1 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.

# TH Hotel SuperAgent MCP 联调测试用例
## 1. 文档信息
| 项目 | 内容 |
| --- | --- |
| 文档版本 | 0.1 |
| 日期 | 2026-07-09 |
| 状态 | 草案 |
| 适用范围 | SuperAgent HTTP MCP endpoint 联调和回归测试 |
## 2. 测试前置条件
测试前应确认:
- 后端 `server/` 已部署并暴露 `/mcp`
- SuperAgent 已拿到 MCP 层访问凭证。
- 后端已配置 `MCP_ENABLED=true``MCP_AUTH_TOKEN`
- 后端 `server/` dev/test 环境可访问。
- 测试数据不包含真实客户隐私、生产 Token、附件 URL 或支付信息。
## 3. 工具发现测试
| 用例 ID | 场景 | 期望结果 |
| --- | --- | --- |
| MCP-T00-001 | SuperAgent 连接 `/mcp` 并获取工具列表 | 能看到 5 个 TH Hotel tools |
| MCP-T00-002 | 未携带 MCP auth token | 返回 MCP 鉴权失败 |
| MCP-T00-003 | 使用错误 MCP auth token | 返回 MCP 鉴权失败,不调用后端 |
| MCP-T00-004 | 请求体不是合法 JSON | 返回 JSON-RPC parse error |
## 4. th_hotel_query_case_context
| 用例 ID | 场景 | 输入要点 | 期望结果 |
| --- | --- | --- | --- |
| MCP-T01-001 | 按 group code 查询 | `group_code``hotel_id` 可选 | 返回成功 envelope |
| MCP-T01-002 | 按 confirmation 查询 | `confirmation_number``hotel_id` 可选 | 返回成功 envelope |
| MCP-T01-003 | 缺少查询 key | 不传 `group_code``confirmation_number` | 返回 `QUERY_KEY_REQUIRED` |
| MCP-T01-004 | 缺省 hotel id | 不传 `hotel_id`,传 `group_code` | 后端按系统唯一 ACTIVE 酒店查询并返回成功 envelope |
| MCP-T01-005 | hotel id 不一致 | 传非系统酒店 `hotel_id` | 返回 `HOTEL_ACCESS_DENIED``HOTEL_ID_MISMATCH` |
## 5. th_hotel_query_object_detail
| 用例 ID | 场景 | 输入要点 | 期望结果 |
| --- | --- | --- | --- |
| MCP-T02-001 | 查询存在的订单对象 | `object_id=ORDER:{order_id}` | 返回对象详情 |
| MCP-T02-002 | 查询不存在对象 | 不存在的 `object_id` | 返回 `OBJECT_NOT_FOUND` |
| MCP-T02-003 | 缺少 object id | 只传 `hotel_id` | 返回请求参数错误 |
## 6. th_hotel_list_message_conversation_tasks
| 用例 ID | 场景 | 输入要点 | 期望结果 |
| --- | --- | --- | --- |
| MCP-T03-001 | 按外部会话 ID 查询任务 | `external_conversation_id` | 返回任务列表 |
| MCP-T03-002 | 按外部 source message id 锚点查询 | `source_message_id` | 返回该邮件所属会话任务 |
| MCP-T03-003 | 同 conversation id 不同 provider 隔离 | `source_provider=AGENTBUS` | 不返回其他 provider 的任务 |
| MCP-T03-004 | 会话不存在 | 不存在的 `external_conversation_id` | 返回 `MESSAGE_CONVERSATION_NOT_FOUND` |
| MCP-T03-005 | 缺少查询 key | 不传 `external_conversation_id``source_message_id` | 返回 `MESSAGE_CONVERSATION_QUERY_KEY_REQUIRED` |
排序验证:
- 任务先按邮件接收时间正序。
- 同一封邮件下按任务创建时间正序。
- 时间相同时按任务 ID 正序。
## 7. th_hotel_list_message_conversation_messages
| 用例 ID | 场景 | 输入要点 | 期望结果 |
| --- | --- | --- | --- |
| MCP-T04-001 | 按 source message id 查询邮件链正文 | `source_message_id` | 返回受控正文 |
| MCP-T04-002 | 按 external conversation id 查询邮件链正文 | `external_conversation_id` | 按接收时间正序返回正文 |
| MCP-T04-003 | 正文含图片和附件 URL | 测试 HTML 含 `src/href` | 响应不包含附件 URL 和图片 URL |
| MCP-T04-004 | 正文含原始 HTML | 后端有原文 HTML | 响应只包含 `html_body_sanitized` |
| MCP-T04-005 | 读取正文审计 | 调用正文工具 | 后端写入原文访问审计 |
禁止项验证:
- 响应不得包含 `attachments`
- 响应不得包含 `inline_images`
- 响应不得包含 `external_url`
- 响应不得包含附件 URL。
- 响应不得包含原始未清洗 HTML。
## 8. th_hotel_submit_task_results
| 用例 ID | 场景 | 输入要点 | 期望结果 |
| --- | --- | --- | --- |
| MCP-T05-001 | 提交单个 normal task | `ai_task_results` 1 条 | 返回 `accepted_count=1` |
| MCP-T05-002 | 提交 manual review | `result_type=manual_review` | 写入人工复核任务 |
| MCP-T05-003 | 提交 informational message | `result_type=informational_message` | 写入提示类信息 |
| MCP-T05-004 | source message 不存在 | 不存在的外部 `source_message_id` | 返回 `SOURCE_MESSAGE_NOT_FOUND` |
| MCP-T05-005 | 缺省 hotel id | 不传 `hotel_id`source message 属于系统酒店 | 后端按系统唯一 ACTIVE 酒店写入成功 |
| MCP-T05-006 | 重复提交同一幂等任务 | 使用相同幂等信息 | 不重复创建业务任务 |
| MCP-T05-007 | hotel id 不一致 | 显式传非系统酒店 `hotel_id` | 返回 `HOTEL_ID_MISMATCH` |
| MCP-T05-008 | source message 入库渠道为 OUTLOOK | 不传 `source_channel`,只传外部 `source_message_id` | 后端按真实 Inbox 渠道写入成功 |
| MCP-T05-009 | source message 多渠道重复 | 同一酒店存在相同外部 `source_message_id` 的多条 Inbox | 返回 `SOURCE_MESSAGE_AMBIGUOUS` |
| MCP-T05-010 | V3 Parent split 使用 Agent 内部事件 ID | `message_events[].source_event_index=E_CHILD_1/E_CHILD_2/E_PARENT` | MCP adapter 按数组顺序映射为 `1/2/3`,返回 `accepted_count=3` |
| MCP-T05-011 | V3 缺失 source message id | `source_message.source_message_id` 缺失 | 返回既有 `MISSING_SOURCE_MESSAGE_ID` typed infrastructure error |
| MCP-T05-012 | V3 多事件关系悬空 | `related_source_event_indices` 引用不存在的事件 ID | 返回 `MCP_SUBMIT_PAYLOAD_INVALID`,不写 AI batch、订单或任务 |
| MCP-T05-013 | V3 多事件关系重复 | `related_source_event_indices=["E_CHILD_1","E_CHILD_1"]` | 返回 `MCP_SUBMIT_PAYLOAD_INVALID`,不写 AI batch、订单或任务 |
| MCP-T05-014 | V3 根节点未知字段 | 根节点存在 `unexpected_root` | 返回 `MCP_SUBMIT_PAYLOAD_INVALID`,不调用业务写入 Service |
| MCP-T05-015 | V3 跨 Child Trace | Trace event 关联全部 Child event | `related_source_event_indices[]` 保留全量关系并映射为真实索引,不压缩到第一个 Child |
| MCP-T05-016 | V3 缺失整个 source_message | 业务根或 S10/S99 没有 `source_message` | 返回既有 `MISSING_SOURCE_MESSAGE_ID` typed infrastructure error |
| MCP-T05-017 | V2 item 缺必填字段 | `ai_task_results[]` item 缺 `task_type` 等必填字段 | 返回 `MCP_SUBMIT_PAYLOAD_INVALID`,不调用业务写入 Service |
| MCP-T05-018 | V3 event 业务契约错误 | event_type unsupported 但 transport 字段完整 | MCP adapter 不整批拒绝,业务入站层保存 `adapter_contract_error` transition |
| MCP-T05-019 | V3 S10 入口通知 | `route_code=S10` | 通过 MCP 写入只读 `SOURCE_MESSAGE_ONLY` 任务 |
| MCP-T05-020 | V3 S99 入口通知 | `route_code=S99``manual_review` 完整 | 通过 MCP 写入只读 `SOURCE_MESSAGE_ONLY` 任务 |
写入验证:
- `ai_task_results[]` 顺序不能被 MCP endpoint 改变。
- V3 `message_events[]` 顺序是 `source_event_index` 的唯一基准MCP endpoint 不能重排。
- `E1/E2/E_PARENT` 等 Agent 内部事件 ID 只能由 MCP adapter 转换,不能作为本系统最终 `source_event_index`
- MCP endpoint 不能在日志输出完整 `extracted_fields` 中的敏感内容。
- 失败响应应保留后端错误码和 message。
- MCP adapter 校验失败时不进入业务写入 Service且不自动重试。
- V3 成功响应返回 `mapping_diagnostics.source_event_index_mapping[]`,但 AI transition 业务 payload 不包含该诊断字段。
- V3 `relationship_type` 可在 event 根节点透传,也可在 `extracted_fields` 中作为业务关系字段MCP adapter 不据此派生业务含义。
## 9. MCP 鉴权和开关测试
| 用例 ID | 场景 | 期望结果 |
| --- | --- |
| MCP-AUTH-001 | `MCP_ENABLED=false` | `/mcp` 不暴露或不可调用 |
| MCP-AUTH-002 | 未携带 Bearer token | 返回 `MCP_AUTH_INVALID` |
| MCP-AUTH-003 | Bearer token 错误 | 返回 `MCP_AUTH_INVALID` |
| MCP-AUTH-004 | `MCP_ENABLE_SUBMIT_TASK_RESULTS=false` | 写入 tool 返回 `MCP_TOOL_DISABLED` |
| MCP-AUTH-005 | 请求体超过 `MCP_MAX_BODY_BYTES`,默认 10MB | 返回 `MCP_REQUEST_BODY_TOO_LARGE` |
## 10. 协议和内部异常测试
| 用例 ID | 场景 | 期望结果 |
| --- | --- |
| MCP-PROTO-001 | 调用不存在的 MCP method | 返回 `MCP_METHOD_NOT_FOUND` |
| MCP-PROTO-002 | 调用不存在的 tool | 返回 `MCP_TOOL_NOT_FOUND` |
| MCP-PROTO-003 | tool arguments 不合法 | 返回 `MCP_TOOL_ARGUMENTS_INVALID` |
| MCP-PROTO-004 | 发送 `notifications/initialized` | 返回 202 空响应体 |
## 11. 回归测试清单
每次 MCP endpoint 或 REST 契约变更后,至少回归:
- 5 个工具均能被发现。
- 5 个工具正常成功调用。
- 查询接口错误 envelope 不丢失。
- 任务结果写入成功和幂等重放正常。
- V3 submit payload adapter 的事件索引映射、mapping 诊断、悬空关系拒绝、重复关系拒绝和未知字段拒绝正常。
- V2 `ai_task_results[]` item schema 和 adapter 校验正常。
- S10/S99 结构化入口通知可通过 MCP 写入工具。
- provider/channel 隔离正常。
- 受控正文不返回附件 URL。
- MCP auth 失败不进入业务 Service。
- REST HMAC 接口仍保持原有测试覆盖。