package service import ( "context" "testing" "fashionapi/internal/model" "fashionapi/internal/repository" ) type fakeTranslateBrandRepo struct{ repository.BrandRepository } func (fakeTranslateBrandRepo) CrawlBrands(ctx context.Context, brandID uint32) ([]model.Brand, error) { return []model.Brand{ {NameEn: "Chanel", NameCn: "香奈儿"}, {NameEn: "Acne Studios", NameCn: "阿尼亚"}, }, nil } type fakeTranslateMem struct { m map[string]string repository.TranslateRepository } func (f *fakeTranslateMem) GetTitleCnMemory(ctx context.Context, titleEn string) (string, bool, error) { v, ok := f.m[titleEn] return v, ok, nil } func (f *fakeTranslateMem) UpsertTitleCnMemory(ctx context.Context, titleEn, titleCn string) error { if f.m == nil { f.m = map[string]string{} } f.m[titleEn] = titleCn return nil } func newTranslateServiceForTest() *TranslateService { return &TranslateService{brandRepo: fakeTranslateBrandRepo{}, memRepo: &fakeTranslateMem{m: map[string]string{}}} } func TestRuleTranslate(t *testing.T) { brandCN := map[string]string{"chanel": "香奈儿", "acne studios": "阿尼亚"} cases := []struct { en string want string ok bool }{ {"Spring 2024 Ready-to-Wear", "春夏 2024 成衣", true}, {"London Fashion Week Street Style", "伦敦 时装周 街拍", true}, {"Chanel Spring 2024 Ready-to-Wear", "香奈儿 春夏 2024 成衣", true}, {"Acne Studios Fall 2023 Couture", "阿尼亚 秋冬 2023 高级定制", true}, // 含未知品牌 → 未完整翻译 → 失败(不写脏数据) {"UnknownBrand Spring 2024 Ready-to-Wear", "", false}, {"", "", false}, } for _, c := range cases { got, ok := RuleTranslate(c.en, brandCN) if ok != c.ok || got != c.want { t.Errorf("RuleTranslate(%q) = (%q, %v), want (%q, %v)", c.en, got, ok, c.want, c.ok) } } } func TestSuggestTitleCnMemory(t *testing.T) { svc := newTranslateServiceForTest() ctx := context.Background() if err := svc.Remember(ctx, "Foobar Fall 2023 Couture", "自定义中文"); err != nil { t.Fatal(err) } got, err := svc.SuggestTitleCn(ctx, "Foobar Fall 2023 Couture") if err != nil { t.Fatal(err) } if got != "自定义中文" { t.Fatalf("记忆未优先命中: got %q", got) } } func TestSuggestTitleCnRule(t *testing.T) { svc := newTranslateServiceForTest() got, err := svc.SuggestTitleCn(context.Background(), "Chanel Spring 2024 Ready-to-Wear") if err != nil { t.Fatal(err) } if got != "香奈儿 春夏 2024 成衣" { t.Fatalf("规则翻译不符: got %q", got) } }