Files
slogan/styleagent/agent/output_test.go
T
adminandClaude Opus 4.7 ef22f7672a feat: slogan-agent MVP 服务端完整实现
- 用户域:注册/登录(JWT)/修改密码/个人资料
- 照片/衣橱/身形/化身:上传存储 + 3D 化身模板匹配
- 穿搭生成:天气(高德+和风+缓存) → 规则预筛 → LLM 规划(1次调用)
  → 规则评分(5维100分制) → 全低分触发 LLM 兜底创作 → 异步任务状态机
- 效果图:选主方案后异步生成 3 视角(mock/wanx 供应商 + 内容 hash 缓存 + 每日限额)
- 商业化:合作门店列表(seed 4 家)
- 冒烟:全链路端到端验证通过(mock LLM/天气),23 个 API 端点

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-07-31 12:15:11 +08:00

45 lines
1.6 KiB
Go

package agent
import "testing"
func TestParsePlanOutput_Valid(t *testing.T) {
raw := `{"plans":[{"title":"通勤清爽","hairstyle":"清爽短发","hair_color":"#2B2B2B","items":[{"slot":"上衣","item_id":1,"name":"白衬衫","desc":"正式","new_item":false},{"slot":"鞋","item_id":3,"name":"小白鞋","desc":"百搭","new_item":false}]}]}`
out, err := ParsePlanOutput(raw)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if len(out.Plans) != 1 || out.Plans[0].Title != "通勤清爽" {
t.Fatalf("wrong parse result: %+v", out.Plans)
}
}
func TestParsePlanOutput_CodeFence(t *testing.T) {
raw := "```json\n{\"plans\":[{\"title\":\"周末约会\",\"hairstyle\":\"波浪卷发\",\"hair_color\":\"#8B4513\",\"items\":[{\"slot\":\"下装\",\"item_id\":0,\"name\":\"A字裙\",\"desc\":\"飘逸\",\"new_item\":true}]}]}\n```"
out, err := ParsePlanOutput(raw)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if len(out.Plans) != 1 || !out.Plans[0].Items[0].NewItem {
t.Fatalf("wrong parse result: %+v", out.Plans)
}
}
func TestParsePlanOutput_MissingPlans(t *testing.T) {
if _, err := ParsePlanOutput(`{"plans":[]}`); err == nil {
t.Fatal("expected error for empty plans")
}
}
func TestParsePlanOutput_InvalidJSON(t *testing.T) {
if _, err := ParsePlanOutput(`not json`); err == nil {
t.Fatal("expected error for invalid json")
}
}
func TestParsePlanOutput_InvalidSlot(t *testing.T) {
raw := `{"plans":[{"title":"x","hairstyle":"y","hair_color":"#fff","items":[{"slot":"帽子","item_id":1,"name":"a","desc":"b","new_item":false}]}]}`
if _, err := ParsePlanOutput(raw); err == nil {
t.Fatal("expected error for invalid slot")
}
}