package recognize import ( "context" "strings" "testing" ) // Промпт задаёт язык локализованного title и не трогает original_title. func TestSystemPrompt_LanguageDirective(t *testing.T) { en := systemPrompt("en") if !strings.Contains(en, "английском") { t.Errorf("en-промпт без директивы «английском»:\n%s", en) } ru := systemPrompt("ru") if !strings.Contains(ru, "русском") { t.Errorf("ru-промпт без директивы «русском»:\n%s", ru) } for _, p := range []string{en, ru} { // Директива касается только title; original_title остаётся на оригинале. if !strings.Contains(p, "\"original_title\" всегда на языке оригинала") { t.Errorf("промпт не оговаривает original_title:\n%s", p) } // Fallback на оригинал при отсутствии перевода (защита от ложного авто-матча). if !strings.Contains(p, "оригинальное название, не выдумывай") { t.Errorf("промпт не задаёт fallback на оригинал:\n%s", p) } } } // Сквозной путь: язык из Config доезжает через New до системного сообщения LLM. // Ловит регресс проводки, который иначе тих (пустой язык → английский = дефолт). func TestRecognize_LanguageReachesSystemPrompt(t *testing.T) { const resp = `{"type":"movie","title":"X","files":[{"src":"a.mkv","role":"main"}]}` in := Input{Name: "X", Files: []File{{Path: "a.mkv", Size: 1 << 30}}} cases := map[string]string{"ru": "русском", "en": "английском", "": "английском"} for lang, want := range cases { f := &fakeLLM{responses: []string{resp}} r := New(f, nil, Config{Language: lang}, testLogger()) if _, err := r.Recognize(context.Background(), in); err != nil { t.Fatalf("Recognize(lang=%q): %v", lang, err) } sys := f.lastReq.Messages[0].Content if !strings.Contains(sys, want) { t.Errorf("lang=%q: системное сообщение без %q:\n%s", lang, want, sys) } } } // Незаданный язык в сборке промпта → английская директива (дефолт en). func TestSystemPrompt_DefaultsToEnglish(t *testing.T) { def := systemPrompt("") if !strings.Contains(def, "английском") { t.Errorf("дефолтный промпт не английский:\n%s", def) } }