package processing import ( "context" "encoding/json" "strings" "testing" "github.com/descrybe/descrybe-v2/apps/api/internal/aiprompts" ) type a1SmokeCompleter struct { system, user string reply string } func (c *a1SmokeCompleter) Complete(_ context.Context, system, user string) (Completion, error) { c.system, c.user = system, user return Completion{Text: c.reply, TotalTokens: 12}, nil } func (c *a1SmokeCompleter) Enabled() bool { return true } func TestEnhance_A1StyleFormulaLocalSmoke(t *testing.T) { t.Parallel() prompt := aiprompts.SectionTitleStart + "\n" + `Napiši novo ime izdelka po formuli: "tip izdelka sentence case", "znamka s pravilno kapitalizacijo", "model", barva v eni besedi. Ne uporabljaj vejic.` + "\n" + aiprompts.SectionTitleEnd + "\n\n" + aiprompts.SectionDescriptionStart + "\n" + `

{Napiši Novo ime izdelka in izpostavi en benefit}

` + `

{Napiši odstavek, ki je dolg 100 besed, ki NE vsebuje Novo ime izdelka.}

` + `

{Izpostavi en benefit, in NE napiši Novo ime izdelka}

` + `

{Napiši odstavek, ki je dolg 100 besed in VKLJUČI tudi tip izdelka lowercase}

` + `{Tehnične specifikacije}` + "\n" + aiprompts.SectionDescriptionEnd + "\n\n" + aiprompts.SectionMetaStart + "\n" + `Najprej napiši Novo ime izdelka in potem nadaljuj dokler nisi zapisal 140 znakov.` + "\n" + aiprompts.SectionMetaEnd replyObj := map[string]any{ "name": "ovitek PanzerGlass Honor 200 Smart črna", "description": "

Zaščita z elegantnim videzom

" + strings.Repeat("Besedilo o ovitku. ", 20) + "

Trden oprijem

" + strings.Repeat("Še več besedila. ", 20) + "

", "meta_title": "ovitek PanzerGlass Honor 200 Smart črna | zaščita", "meta_description": "ovitek PanzerGlass Honor 200 Smart črna z elegantnim videzom in trdnim oprijemom za vsakodnevno uporabo.", "attrs": map[string]any{"brand": "PanzerGlass"}, } raw, _ := json.Marshal(replyObj) cap := &a1SmokeCompleter{reply: string(raw)} eng := &Engine{Completer: cap} descTpl := aiprompts.EffectiveDescriptionTemplateAny(nil, prompt) name, desc, _, meta, err := eng.enhance(context.Background(), ProductInput{ Name: "ovitek PanzerGlass 200 Smart", Description: "Zaščitni ovitek za telefon.", Language: "sl", CategoryEnhancePrompt: prompt, DescriptionTemplate: descTpl, CategoryUniqueID: "ovitki", }, "Ovitki in mape", map[string]any{"brand": "PanzerGlass", "product_model": "Honor 200 Smart"}) if err != nil { t.Fatal(err) } if !strings.Contains(cap.system, "Si tekstopisec") { t.Fatalf("expected A1 system, got: %s", cap.system) } if !strings.Contains(cap.user, "GPT predloga:") || !strings.Contains(cap.user, "{") { t.Fatalf("expected legacy GPT predloga user, got: %s", cap.user) } if !strings.Contains(cap.user, "Staro_ime_izdelka: ovitek PanzerGlass 200 Smart") { t.Fatalf("expected supplier name substituted like legacy STARO IME: %s", cap.user) } if !strings.Contains(cap.user, "

{") && !strings.Contains(cap.user, "

{") { t.Fatalf("expected HTML formula in predloga: %s", cap.user) } if name != "ovitek PanzerGlass Honor 200 Smart črna" { t.Fatalf("name=%q", name) } if !descriptionSatisfiesFormula(desc, descTpl) { t.Fatalf("description must satisfy formula: %s", desc) } st, _ := meta.(map[string]any) if st == nil || st["status"] != "ok" { t.Fatalf("meta=%#v", meta) } }