package agent import ( "strings" "testing" "github.com/example/glpi-ai-agent/internal/model" ) func productionTestPolicy() Policy { return NewPolicy(true, true, .9, .97, .88, .30, .45, .35, .20, []string{"internal-kb", "vendor-docs"}, []string{"internal-kb"}, "de-DE", "formal", "Guten Tag,", "Mit freundlichen Grüßen", "IT-Service", true, true, true, .2) } func approvedHit(source, language, style string) []model.KnowledgeHit { return []model.KnowledgeHit{{Doc: model.KnowledgeDoc{ID: "KB1", Answer: "Bitte starten Sie den VPN-Client neu.", AutoReply: true, MinScore: .9, Categories: []int64{2}, Source: source, Language: language, CommunicationStyle: style}, Score: .95}} } func replyDecision() model.Decision { var d model.Decision d.Reply.Allowed = true d.Reply.Confidence = .99 d.Reply.KnowledgeID = "KB1" d.Category.ID = 2 d.Category.Confidence = .99 return d } func TestPolicyAutoReplyUsesApprovedKnowledge(t *testing.T) { r, err := productionTestPolicy().Evaluate(model.Ticket{CategoryID: 1}, replyDecision(), []model.Category{{ID: 1}, {ID: 2}}, approvedHit("internal-kb", "de-DE", "formal"), model.ContextSnapshot{}) if err != nil { t.Fatal(err) } if !r.Reply || !r.ChangeCategory { t.Fatalf("unexpected result: %+v", r) } if !r.ReplyIsHTML { t.Fatalf("AI-labelled reply must be HTML: %+v", r) } if !strings.HasPrefix(r.ReplyText, AIContentLabelHTML) { t.Fatalf("AI content label is not the exact first content: %s", r.ReplyText) } for _, expected := range []string{"Guten Tag,", "Bitte starten Sie", "Mit freundlichen Grüßen", "IT-Service"} { if !strings.Contains(r.ReplyText, expected) { t.Fatalf("reply missing %q: %q", expected, r.ReplyText) } } } func TestPolicyPreservesGLPIKnowledgeRichText(t *testing.T) { p := productionTestPolicy() d := replyDecision() hits := []model.KnowledgeHit{{Doc: model.KnowledgeDoc{ ID: "KB1", Title: "Rich", Answer: "Wichtiger Hinweis Erstens Zweitens", AnswerHTML: `

Wichtiger Hinweis

Bitte beachten:

Dokumentation

`, AutoReply: true, MinScore: .9, Categories: []int64{2}, Source: "internal-kb", Language: "de-DE", CommunicationStyle: "formal", }, Score: .95, CategoryScore: 1}} r, err := p.Evaluate(model.Ticket{CategoryID: 2}, d, []model.Category{{ID: 2}}, hits, model.ContextSnapshot{}) if err != nil { t.Fatal(err) } if !r.Reply || !r.ReplyIsHTML { t.Fatalf("expected rich reply, got %+v", r) } for _, want := range []string{"

Wichtiger Hinweis

", "Bitte beachten:", "