package aiprompts import ( "strings" "testing" ) func TestCategoryEnhanceUserTemplateHasRequiredVars(t *testing.T) { t.Parallel() vars := ExtractVariables(CategoryEnhanceUserTemplate) want := []string{"language", "category", "name", "description", "attrs"} got := map[string]struct{}{} for _, v := range vars { got[v] = struct{}{} } for _, w := range want { if _, ok := got[w]; !ok { t.Fatalf("CategoryEnhanceUserTemplate missing {{%s}}; vars=%v", w, vars) } } lower := strings.ToLower(CategoryEnhanceUserTemplate) if strings.Contains(lower, "100 besed") || strings.Contains(lower, "gpt predloga") { t.Fatal("template must not demand legacy long HTML marketing docs") } if !strings.Contains(CategoryEnhanceUserTemplate, `{"name":"string","description":"string","meta_title":"string","meta_description":"string","attrs":{}}`) { t.Fatal("template should reference enhance JSON schema including meta_* and attrs") } // Attribute prompting is retired from category prompts — extraction guidance // is pipeline-level (AppendAttributeConstraints), never prompt-authored. if strings.Contains(strings.ToLower(CategoryEnhanceUserTemplate), `build json "attrs"`) { t.Fatal("template must not carry an attributes role instruction") } if !CategoryEnhanceHasRoleSections(CategoryEnhanceUserTemplate) { t.Fatal("canonical template must be role-sectioned for title/description/meta") } if !strings.Contains(lower, "{{language}}") { t.Fatal("language must come from {{language}}") } } func TestCategoryEnhancePromptNeedsRepair(t *testing.T) { t.Parallel() if CategoryEnhancePromptNeedsRepair("") { t.Fatal("empty should not need repair") } if CategoryEnhancePromptNeedsRepair(CategoryEnhanceUserTemplate) { t.Fatal("canonical template should be idempotent") } if CategoryEnhancePromptNeedsRepair(" " + CategoryEnhanceUserTemplate + "\n") { t.Fatal("whitespace-trimmed canonical should be idempotent") } legacy := `Ustvari nov opis\n

foo

\nAttrs missing` if !CategoryEnhancePromptNeedsRepair(legacy) { t.Fatal("legacy HTML prompt should need repair") } // Per-category sectioned overlay (Slovenian rules) must not force re-repair. split := SplitLegacyCombinedEnhancePrompt(`GPT predloga: {Napiši tip izdelka} {140 znakov}

{benefit}

`) if CategoryEnhancePromptNeedsRepair(split) { t.Fatal("sectioned split overlay should be idempotent") } } func TestBuiltInProductEnhanceUsesSharedUserTemplate(t *testing.T) { t.Parallel() def, ok := DefaultFor(KeyProductEnhance) if !ok { t.Fatal("missing product_enhance default") } if def.UserTemplate != CategoryEnhanceUserTemplate { t.Fatalf("UserTemplate must be CategoryEnhanceUserTemplate") } if strings.Contains(def.SystemTemplate, "1-2 factual sentences") { t.Fatal("system template must not force 1-2 sentences over category Description formulas") } if !strings.Contains(strings.ToLower(def.SystemTemplate), "description formula") { t.Fatal("system template should defer to Description formula when present") } }