90 lines
2.5 KiB
Go
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)
|
|
}
|
|
}
|