Files
av a2d8140e22 recognition: глобальный переключатель языка вывода [general].language
- новое поле [general].language (ru|en, дефолт en) — единый источник языка
  локализованного title детектора и локали запросов к метабазам; original_title
  всегда на языке оригинала
- локаль TMDB (поиск + credits) выводится из него, [metadata.tmdb].language убран
- промпт LLM явно задаёт язык title с fallback на оригинал
2026-07-24 14:09:04 +03:00

58 lines
2.6 KiB
Go

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