package console import ( "strings" "testing" "yunyan/comm" ) // Azure TTS 模板只该留「凭据两件套 + 语言两项」:音色/语速/音调配在服务上会跟 agent 的音色选择打架。 func TestAzureTTSTemplateFields(t *testing.T) { var azure *ThirdSvcTemplate for _, x := range builtinSvcTemplates() { if x.Id == "tts_azure" { tmp := x azure = &tmp break } } if azure == nil { t.Fatal("内置模板里找不到 tts_azure") } keys := make([]string, 0, len(azure.Fields)) for _, f := range azure.Fields { keys = append(keys, f.Key) } got := strings.Join(keys, ",") want := "languages,default_lang,subscription_key,region" if got != want { t.Fatalf("tts_azure 字段 = %s,期望 %s", got, want) } } // languages 预填值必须来自音色表:有音色才说得出那门语言,两处口径不能各写各的。 func TestTTSTemplateLanguagesPrefilled(t *testing.T) { want := strings.Join(comm.TTSLanguages(comm.TTSProviderAzure), ",") if want == "" { t.Fatal("音色表里 azure 没有语言,检查 comm/ttsvoice.go") } for _, x := range builtinSvcTemplates() { if x.Id != "tts_azure" { continue } for _, f := range x.Fields { if f.Key != "languages" { continue } if f.DefValue != want { t.Fatalf("tts_azure 的 languages 预填 = %q,期望与音色表一致 %q", f.DefValue, want) } return } t.Fatal("tts_azure 没有 languages 字段") } } // 废弃字段只从指定模板里删,且不碰别的字段——seed 平时是「只补不删」,这里是有名有姓的例外。 func TestRemoveDeprecatedFields(t *testing.T) { fields := []SvcField{ {Key: "subscription_key"}, {Key: "region"}, {Key: "voice_name"}, {Key: "rate"}, {Key: "pitch"}, {Key: "languages"}, {Key: "default_lang"}, {Key: "运营自己加的"}, // 不在废弃清单里,必须留着 } out, removed := removeDeprecatedFields("tts_azure", fields) if len(removed) != 3 { t.Fatalf("应删 3 个废弃字段,实际 %v", removed) } keys := make([]string, 0, len(out)) for _, f := range out { keys = append(keys, f.Key) } got := strings.Join(keys, ",") want := "subscription_key,region,languages,default_lang,运营自己加的" if got != want { t.Fatalf("清理后字段 = %s,期望 %s", got, want) } // 别的模板一个字段都不能少 if out2, removed2 := removeDeprecatedFields("tts_openai", fields); len(removed2) != 0 || len(out2) != len(fields) { t.Fatalf("不该动 tts_openai 的字段,removed=%v len=%d", removed2, len(out2)) } }