Files
backend_v2/internal/service/translate_test.go
toom1996 1b06bd5bda update
2026-09-30 11:58:32 +08:00

90 lines
2.5 KiB
Go

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