package handler import ( "testing" "kefu-cloud/server/internal/model" ) func TestNormalizeWelcomeSegments(t *testing.T) { SetImagePublicBase("http://localhost:9100/kefu") _, _, err := normalizeWelcomeSegments(nil) if err == nil { t.Fatal("空列表应失败") } ok, first, err := normalizeWelcomeSegments([]WelcomeSegment{ {Type: "text", Content: " 你好 "}, {Type: "image", Content: "http://localhost:9100/kefu/tenants/1/welcome/a.webp"}, {Type: "text", Content: "请描述问题"}, }) if err != nil { t.Fatalf("合法多段应通过: %v", err) } if len(ok) != 3 || ok[0].Content != "你好" || first != "你好" { t.Fatalf("规范化结果异常: %+v first=%s", ok, first) } _, _, err = normalizeWelcomeSegments([]WelcomeSegment{ {Type: "image", Content: "https://evil.example/x.png"}, }) if err == nil { t.Fatal("非白名单图片 URL 应失败") } tooMany := make([]WelcomeSegment, maxWelcomeSegments+1) for i := range tooMany { tooMany[i] = WelcomeSegment{Type: "text", Content: "x"} } if _, _, err := normalizeWelcomeSegments(tooMany); err == nil { t.Fatal("超过段数上限应失败") } } func TestResolveWelcomeSegmentsCompat(t *testing.T) { // 仅有旧字段 s1 := &model.TenantSetting{WelcomeMessage: "旧欢迎语"} segs := resolveWelcomeSegments(s1) if len(segs) != 1 || segs[0].Type != "text" || segs[0].Content != "旧欢迎语" { t.Fatalf("旧字段兼容失败: %+v", segs) } // 优先 JSON s2 := &model.TenantSetting{ WelcomeMessage: "旧", WelcomeMessagesJSON: `[{"type":"text","content":"新1"},{"type":"image","content":"http://x/a.webp"}]`, } segs = resolveWelcomeSegments(s2) if len(segs) != 2 || segs[0].Content != "新1" { t.Fatalf("JSON 优先失败: %+v", segs) } // 空 → 默认 segs = resolveWelcomeSegments(&model.TenantSetting{}) if len(segs) != 1 || segs[0].Content != defaultWelcomeMessage { t.Fatalf("默认欢迎语失败: %+v", segs) } }