Files
geo/server/internal/tenant/app/template_assist_test.go
T
root 14a7921445 feat(prompts): expand keyword guidance to long-tail search queries
Tighten the analyze prompts (runtime + recommendation platform) so the
model returns 8-10 question-style search queries (哪家好/有哪些/怎么选/
价格/排名/避坑 …) instead of generic tag words, and lift the keyword cap
in normalizeAnalyzeResult from 5 to 10 to keep them. Add tests covering
the new ten-keyword window and the question-like guidance in the seeded
analyze prompt.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 01:28:59 +08:00

96 lines
3.4 KiB
Go

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])
}
}