package processing import ( "strings" "testing" "github.com/descrybe/descrybe-v2/apps/api/internal/company" ) func TestResolvePromptFallbackChain(t *testing.T) { t.Parallel() // Category override for language wins over company user template. // Overrides without {{attrs}} get standard context placeholders injected. sys, user := resolveProductPromptTemplates(ProductInput{ EnhanceSystemTemplate: "sys", EnhanceUserTemplate: "company-en", CategoryEnhancePrompt: "cat-sl", Language: "sl", }) if sys != "sys" { t.Fatalf("sys=%q", sys) } if !strings.HasPrefix(user, "cat-sl") || !strings.Contains(user, "{{attrs}}") { t.Fatalf("sys=%q user=%q want cat-sl + attrs", sys, user) } // Empty category → company template. _, user = resolveProductPromptTemplates(ProductInput{ EnhanceUserTemplate: "company-de", Language: "de", }) if user != "company-de" { t.Fatalf("user=%q", user) } // sl-only category prompt: exact for sl; en falls back to primary=sl. m := map[string]company.LangPromptMap{"audio": {"sl": "slo-prompt"}} if got := categoryEnhancePromptFor(m, "audio", "sl", "sl"); got != "slo-prompt" { t.Fatalf("sl exact: got %q", got) } if got := categoryEnhancePromptFor(m, "audio", "en", "sl"); got != "slo-prompt" { t.Fatalf("en→primary sl: got %q", got) } if got := categoryEnhancePromptFor(m, "audio", "en", "en"); got != "" { t.Fatalf("en with primary=en and no en/* prompt should be empty, got %q", got) } // wildcard shared overlay m2 := map[string]company.LangPromptMap{"audio": {"*": "shared-overlay"}} if got := categoryEnhancePromptFor(m2, "audio", "en", "sl"); got != "shared-overlay" { t.Fatalf("wildcard: got %q", got) } }