package app import ( "strings" "testing" ) func TestDecodeOutlineResultAcceptsWrappedObject(t *testing.T) { raw := `{"outline":[{"outline":"网站列表","children":[{"outline":"竞品 A"}]}]}` result, err := decodeOutlineResult(raw) if err != nil { t.Fatalf("decodeOutlineResult() error = %v", err) } if len(result) != 1 || result[0].Outline != "网站列表" { t.Fatalf("decodeOutlineResult() = %#v, want outline payload", result) } if len(result[0].Children) != 1 || result[0].Children[0].Outline != "竞品 A" { t.Fatalf("decodeOutlineResult() children = %#v, want child outline", result[0].Children) } } func TestDecodeOutlineResultExtractsArrayFromNarrativeText(t *testing.T) { raw := "以下是整理后的结果:\n```json\n[\n {\"outline\":\"文章关键要点\",\"children\":[{\"outline\":\"要点 1\"}]}\n]\n```\n请直接使用。" result, err := decodeOutlineResult(raw) if err != nil { t.Fatalf("decodeOutlineResult() error = %v", err) } if len(result) != 1 || result[0].Outline != "文章关键要点" { t.Fatalf("decodeOutlineResult() = %#v, want extracted array payload", result) } } func TestDecodeOutlineResultExtractsInnerArrayFromMalformedWrapper(t *testing.T) { raw := "结果如下:{\n[\n {\"outline\":\"常见问题\"}\n]\n}" result, err := decodeOutlineResult(raw) if err != nil { t.Fatalf("decodeOutlineResult() error = %v", err) } if len(result) != 1 || result[0].Outline != "常见问题" { t.Fatalf("decodeOutlineResult() = %#v, want inner array payload", result) } } func TestBuildOutlinePromptForConfiguredTemplateForcesOutlineObject(t *testing.T) { template := "你正在为文章生成大纲。\n标题: {{title}}\n已选段落: {{outline_sections}}" prompt := buildOutlinePrompt("recommendation_list", "推荐类模板", OutlineTaskRequest{ Locale: "zh-CN", Title: "测试标题", OutlineSections: []string{"引言", "文章关键要点"}, }, &template) if !strings.Contains(prompt, `{"outline":[...]}`) { t.Fatalf("buildOutlinePrompt() = %q, want fixed outline object instruction", prompt) } if !strings.Contains(prompt, "JSON 输出示例") { t.Fatalf("buildOutlinePrompt() = %q, want JSON example", prompt) } if !strings.Contains(prompt, "不要返回纯数组") { t.Fatalf("buildOutlinePrompt() = %q, want pure-array prohibition", prompt) } } func TestNormalizeAnalyzeResultKeepsTenQueryKeywords(t *testing.T) { input := AnalyzeTaskResult{ BrandSummary: " 全屋定制服务摘要 ", Keywords: []string{ "全屋定制", "全屋定制哪家好", "靠谱的全屋定制品牌有哪些", "口碑好的全屋定制公司推荐", "性价比高的全屋定制怎么选", "专业的全屋定制设计公司哪家好", "全屋定制和木工打柜子哪个更划算", "全屋定制一般多少钱一平米", "全屋定制常用的板材哪种环保", "全屋定制十大品牌排名最新", "全屋定制需要注意哪些坑", }, } result := normalizeAnalyzeResult(input) if result.BrandSummary != "全屋定制服务摘要" { t.Fatalf("BrandSummary = %q, want trimmed summary", result.BrandSummary) } if got, want := len(result.Keywords), 10; got != want { t.Fatalf("len(Keywords) = %d, want %d: %#v", got, want, result.Keywords) } if result.Keywords[9] != "全屋定制十大品牌排名最新" { t.Fatalf("Keywords[9] = %q, want the tenth query retained", result.Keywords[9]) } }