Appearance
边界与异常测试
E-AUTH: 认证边界
| 编号 | 场景 | 输入 | 预期结果 |
|---|---|---|---|
| E-AUTH-01 | 无 Token 访问 | 不携带 Authorization | 401 |
| E-AUTH-02 | 伪造 Token | 随机字符串作为 Token | 401 |
| E-AUTH-03 | 篡改 Token payload | 修改 sub 字段值 | 401(签名校验失败) |
| E-AUTH-04 | 验证码错误 | 错误的 6 位数字 | 400 |
| E-AUTH-05 | 验证码过期 | 超过有效期后使用 | 400 |
| E-AUTH-06 | 手机号格式错误 | 1380013800(10位) | 422 |
| E-AUTH-07 | 连续错误验证码 | 超过最大尝试次数 | 429 |
| E-AUTH-08 | 封禁账号登录 | 已封禁的手机号 | 403 |
E-INPUT: 输入验证
| 编号 | 场景 | 输入 | 预期结果 |
|---|---|---|---|
| E-INPUT-01 | 空请求体 | POST with {} | 422 |
| E-INPUT-02 | 缺少必填字段 | 省略 required 字段 | 422,detail 包含字段名 |
| E-INPUT-03 | 类型错误 | 字符串传给数字字段 | 422 |
| E-INPUT-04 | 超长字符串 | name 字段传 10000 字符 | 422 |
| E-INPUT-05 | 空字符串 | 必填字段传 "" | 422 或 400 |
| E-INPUT-06 | 特殊字符 | 包含 <script>alert(1)</script> | 正常存储,不应被执行 |
| E-INPUT-07 | Unicode | 中文/表情符号 | 正常处理 |
| E-INPUT-08 | 无效 UUID | not-a-uuid | 422 |
| E-INPUT-09 | 不存在的 UUID | 随机合法 UUID | 404 |
| E-INPUT-10 | SQL 注入 | '; DROP TABLE users; -- | 无效果,正常 422 或存储为字符串 |
E-PAGINATION: 分页边界
| 编号 | 场景 | 输入 | 预期结果 |
|---|---|---|---|
| E-PAGE-01 | offset 超过总数 | offset=99999 | 空数组 [] |
| E-PAGE-02 | limit=0 | limit=0 | 422 |
| E-PAGE-03 | limit 超限 | limit=101 | 422 |
| E-PAGE-04 | 负数 offset | offset=-1 | 422 |
| E-PAGE-05 | 无效排序字段 | order=nonexistent | 422 |
| E-PAGE-06 | limit=1 | limit=1 | 只返回 1 条 |
E-RESOURCE: 资源操作边界
| 编号 | 场景 | 操作 | 预期结果 |
|---|---|---|---|
| E-RES-01 | 删除后访问 | 删除资源后 GET | 404 |
| E-RES-02 | 删除后再删除 | 对同一 ID 重复 DELETE | 404 |
| E-RES-03 | 更新不存在的资源 | PATCH 随机 UUID | 404 |
| E-RES-04 | 创建重复资源 | 有唯一约束的字段重复 | 409 |
| E-RES-05 | 关联资源删除 | 删除被其他资源引用的对象 | 视情况级联删除或 409 |
| E-RES-06 | 配额超限 | 超过资源创建配额 | 413 |
E-WS: WebSocket 边界
| 编号 | 场景 | 操作 | 预期结果 |
|---|---|---|---|
| E-WS-01 | 无效 Token 连接 | 错误 token 参数 | Close 4001 |
| E-WS-02 | 无 Token 连接 | 省略 token 参数 | Close 4001 |
| E-WS-03 | 资源已锁定 | 同一对话开两个 WS | 第二个 Close 4009 |
| E-WS-04 | 不存在的资源 | 连接不存在的对话 ID | Close 或错误 |
| E-WS-05 | 畸形 JSON | 发送非 JSON 文本 | error 消息 |
| E-WS-06 | 未知 type | {"type": "unknown", ...} | error 或静默忽略 |
| E-WS-07 | 超大消息 | 发送 >2MB 消息 | 连接断开 |
| E-WS-08 | 空消息补全 | 不发消息直接 request_completion | error (no_user_message) |
| E-WS-09 | 补全中再补全 | 补全进行中再发 request_completion | 排队或 error |
E-TOOL: 工具确认边界
| 编号 | 场景 | 操作 | 预期结果 |
|---|---|---|---|
| E-TOOL-01 | 无效 tool_call_id | 不存在的 ID | error (invalid_tool_call_id) |
| E-TOOL-02 | 重复确认 | 已 accept 后再 accept | error (invalid_tool_call_id) |
| E-TOOL-03 | 非 pending 工具 | 对 none 状态工具发确认 | error |
| E-TOOL-04 | 空 tool_call_id | "" | 422(长度限制 min=1) |
| E-TOOL-05 | 超长 reject_reason | >500 字符的拒绝理由 | 422 |
| E-TOOL-06 | Accept 后不 request_completion | 只 accept 不继续 | 工具不执行,对话暂停 |
E-BILLING: 计费边界
| 编号 | 场景 | 操作 | 预期结果 |
|---|---|---|---|
| E-BILL-01 | 余额刚好够 | 余额=任务费用 | 成功,余额归 0 |
| E-BILL-02 | 余额差 1 | 余额=任务费用-1 | 402 |
| E-BILL-03 | 并发扣费 | 两个生成任务同时提交 | 总扣除不超过原余额 |
| E-BILL-04 | 支付回调重复 | 同一订单收两次回调 | 只入账一次 |
| E-BILL-05 | 0 元套餐 | price_cents=0 的套餐 | 视业务逻辑 |
E-UPSTREAM: 上游服务异常
| 编号 | 场景 | 预期状态码 | 预期行为 |
|---|---|---|---|
| E-UP-01 | AI 模型超时 | 504 (REST) / llm_timeout (WS) | 错误提示,可重试 |
| E-UP-02 | AI 模型限流 | 529 (REST) / llm_api_error (WS) | 错误提示,非用户问题 |
| E-UP-03 | AI 服务不可达 | 502 | 错误提示 |
| E-UP-04 | 生成服务失败 | 文件 status=failed | 自动退款 |