Appearance
功能测试场景
F-AUTH: 认证与授权
F-AUTH-01: 正常登录注册
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 发送验证码到有效手机号 | 204,收到短信 |
| 2 | 使用正确验证码登录 | 200,返回 JWT Token |
| 3 | 使用 Token 访问受保护端点 | 200,正常响应 |
F-AUTH-02: Token 过期
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 使用过期的 Token 访问端点 | 401 |
| 2 | 重新登录获取新 Token | 200 |
| 3 | 使用新 Token 访问端点 | 200 |
F-AUTH-03: 权限隔离
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 用户 A 创建角色 | 201 |
| 2 | 用户 B 查询 scope=own | 角色列表不包含 A 的角色 |
| 3 | 用户 B 直接访问 A 的角色 ID | 404 |
| 4 | 用户 A 设置角色为公开 | 200 |
| 5 | 用户 B 查询 scope=public | 角色列表包含 A 的角色 |
| 6 | 用户 B 尝试修改 A 的公开角色 | 403 |
F-CONV: AI 对话
F-CONV-01: 基本对话流程
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 创建用户角色配置 | 201 |
| 2 | 创建对话 | 201 |
| 3 | 连接对话 WebSocket | 连接成功 |
| 4 | 发送 append_message | 收到 message_appended |
| 5 | 发送 request_completion | 收到 completion_init |
| 6 | 等待流式响应 | 收到 llm_text_chunk 序列 |
| 7 | 等待完成 | 收到 assistant_message_complete + completion_done |
| 8 | 验证标题自动生成 | 收到 conversation_title_update(首次补全后) |
F-CONV-02: 工具调用
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 发送触发工具调用的消息(如"搜索xxx") | — |
| 2 | 请求补全 | 收到 tool_call_chunk 序列 |
| 3 | 等待工具执行 | 收到 tool_call(执行结果) |
| 4 | AI 基于工具结果回复 | 收到 llm_text_chunk + completion_done |
F-CONV-03: 工具确认(Accept)
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 在项目中发送触发画布操作的消息 | — |
| 2 | 请求补全 | 收到 tool_call_chunk (confirmation_state=pending) |
| 3 | 等待 completion_done (finish_reason=tool_calls) | 补全暂停 |
| 4 | 发送 tool_confirmation_response (accept) | 收到 tool_confirmation_processed |
| 5 | 发送 request_completion | 工具被执行,AI 继续回复 |
F-CONV-04: 工具确认(Reject)
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1-3 | 同 F-CONV-03 步骤 1-3 | — |
| 4 | 发送 tool_confirmation_response (reject, reason="不需要") | 收到 tool_confirmation_processed |
| 5 | 发送 request_completion | AI 应回复(可能提到拒绝原因) |
F-CONV-05: 停止补全
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 请求补全 | 开始收到流式响应 |
| 2 | 发送 stop_completion | 收到 stop_completion(含部分文本) |
| 3 | 再次请求补全 | 正常工作 |
F-CONV-06: 推理模式
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 创建 reasoning=true 的角色 | 201 |
| 2 | 创建对话并请求补全 | — |
| 3 | 观察响应 | 应收到 llm_thinking_chunk / llm_thinking_sentence |
| 4 | assistant_message_complete 应包含 thinking 字段 | — |
F-GEN: 内容生成
F-GEN-01: 图片生成
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 查询可用图片生成器 | 200,生成器列表 |
| 2 | 获取生成参数 Schema | 200,JSON Schema |
| 3 | 提交生成任务 | 200,返回 file_id(s) |
| 4 | 轮询文件状态 | pending → processing → completed |
| 5 | 获取下载链接 | download_url 有效可下载 |
| 6 | 检查余额变化 | 狐币减少了对应金额 |
F-GEN-02: 生成失败退款
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 记录当前余额 | — |
| 2 | 提交可能失败的生成任务 | 200 |
| 3 | 等待任务失败 | status=failed |
| 4 | 检查余额 | 应恢复到提交前 |
| 5 | 检查交易流水 | 应有退款记录 |
F-BILLING: 计费
F-BILLING-01: 对话计费
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 记录当前余额 | — |
| 2 | 进行一轮对话补全 | completion_done |
| 3 | 检查余额变化 | 应减少(减少量取决于 Token 用量) |
| 4 | 检查交易流水 | 应有 consume_llm 类型记录 |
F-BILLING-02: 余额不足拦截
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 使用余额为 0 的账户 | — |
| 2 | 请求对话补全 | WebSocket 收到 error (insufficient_balance) |
| 3 | 提交内容生成 | HTTP 402 |
F-FILE: 文件管理
F-FILE-01: 上传与下载
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 上传文件 | 201,返回文件信息 |
| 2 | 查询文件详情 | 200,status=completed |
| 3 | 访问 download_url | 可正常下载 |
F-FILE-02: 秒传
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 上传文件 A | 201,source=upload |
| 2 | 上传内容相同的文件 B | 201,source=duplicate |
| 3 | 检查存储配额 | 不应额外增加 |