package comm import "testing" // 一组典型规则:精确 > 半通配 > 全通配兜底,覆盖双向与不限区域。 func demoRules() []*CallTranslateRule { return []*CallTranslateRule{ {Id: 1, Region: 1, SrcLangs: "zh-CN,en-US", DstLangs: "ja-JP,ko-KR", Bidir: true, AgentId: "ast-asia", Priority: 100, Enable: true}, {Id: 2, Region: 1, SrcLangs: "zh-CN", DstLangs: "en-US", AgentId: "ast-cn-en", Priority: 90, Enable: true}, {Id: 3, Region: 1, SrcLangs: LangAny, DstLangs: "en-US", AgentId: "mt-to-en", Priority: 50, Enable: true}, {Id: 4, Region: RegionAny, SrcLangs: LangAny, DstLangs: LangAny, Bidir: true, AgentId: "mt-fallback", Priority: 10, Enable: true}, {Id: 5, Region: 1, SrcLangs: "de-DE", DstLangs: "fr-FR", AgentId: "disabled-one", Priority: 999, Enable: false}, } } func TestMatchCallTranslateRule(t *testing.T) { rules := demoRules() cases := []struct { name string region int32 src, dst, want string }{ {"精确命中最高优先级", 1, "zh-CN", "ja-JP", "ast-asia"}, {"次高优先级的精确规则", 1, "zh-CN", "en-US", "ast-cn-en"}, {"源通配 + 目标精确", 1, "de-DE", "en-US", "mt-to-en"}, {"全通配兜底", 1, "de-DE", "fr-FR", "mt-fallback"}, {"双向:反向也命中同一条", 1, "ja-JP", "zh-CN", "ast-asia"}, {"其他区域只剩不限区域的兜底", 7, "zh-CN", "ja-JP", "mt-fallback"}, {"停用的规则不参与选路", 1, "de-DE", "fr-FR", "mt-fallback"}, {"宽松匹配:客户端只报主语言", 1, "zh", "ja", "ast-asia"}, } for _, c := range cases { t.Run(c.name, func(t *testing.T) { got := MatchCallTranslateRule(rules, c.region, c.src, c.dst) if got == nil { t.Fatalf("%s→%s(region=%d) 未命中任何规则,期望 %s", c.src, c.dst, c.region, c.want) } if got.AgentId != c.want { t.Fatalf("%s→%s(region=%d) 命中 %s,期望 %s", c.src, c.dst, c.region, got.AgentId, c.want) } }) } } // 同优先级时精确规则应压过通配规则,避免兜底规则把精确配置吃掉。 func TestMatchPrefersSpecificOnTie(t *testing.T) { rules := []*CallTranslateRule{ {Id: 1, Region: 1, SrcLangs: LangAny, DstLangs: LangAny, AgentId: "wildcard", Priority: 50, Enable: true}, {Id: 2, Region: 1, SrcLangs: "zh-CN", DstLangs: "en-US", AgentId: "exact", Priority: 50, Enable: true}, } if got := MatchCallTranslateRule(rules, 1, "zh-CN", "en-US"); got == nil || got.AgentId != "exact" { t.Fatalf("同优先级下应选精确规则,实际 %+v", got) } } // 无规则可用时必须返回 nil,让调用方走「未配置」分支而不是拿到零值。 func TestMatchNoHit(t *testing.T) { rules := []*CallTranslateRule{ {Id: 1, Region: 1, SrcLangs: "zh-CN", DstLangs: "en-US", AgentId: "x", Priority: 10, Enable: true}, } if got := MatchCallTranslateRule(rules, 2, "zh-CN", "en-US"); got != nil { t.Fatalf("区域不匹配时应无命中,实际 %+v", got) } if got := MatchCallTranslateRule(nil, 1, "zh-CN", "en-US"); got != nil { t.Fatalf("空规则集应无命中,实际 %+v", got) } } func TestSplitLangs(t *testing.T) { got := SplitLangs(" zh-CN , ,en-US ") if len(got) != 2 || got[0] != "zh-CN" || got[1] != "en-US" { t.Fatalf("SplitLangs 结果异常: %#v", got) } }