package entry import ( "strings" "testing" ) // TestRenderHTMLEscapesRawHTML ist ein Sicherheitstest. // // Das gerenderte Ergebnis wird in der Weboberfläche ohne weiteres Escaping // eingesetzt. Der Schutz davor, dass jemand über einen Eintrag ein ", "", "", } for _, eingabe := range boesartig { html, err := RenderHTML(eingabe, "/p/test/e/") if err != nil { t.Fatalf("RenderHTML(%q): %v", eingabe, err) } if strings.Contains(html, "", "
  • ", ""} { if !strings.Contains(html, erwartet) { t.Errorf("%s fehlt im Ergebnis: %s", erwartet, html) } } } func TestRenderPlainStripsLinkSyntax(t *testing.T) { got := RenderPlain("Siehe [[server-zugang]] für Details.") if strings.Contains(got, "[[") { t.Errorf("die Verweis-Klammern blieben stehen: %q", got) } if !strings.Contains(got, "server-zugang") { t.Errorf("der Bezeichner ging verloren: %q", got) } } // ── Textausschnitte ────────────────────────────────────────────────────────── func TestSnippetAroundMatch(t *testing.T) { text := strings.Repeat("Vorlauf. ", 40) + "GESUCHT " + strings.Repeat("Nachlauf. ", 40) got := Snippet(text, "GESUCHT") if !strings.Contains(got, "GESUCHT") { t.Error("der Treffer fehlt im Ausschnitt") } // Der Ausschnitt soll kurz sein — er dient dem Einordnen, nicht dem Lesen. if len(got) > 400 { t.Errorf("Ausschnitt ist %d Zeichen lang, das ist zu viel", len(got)) } // Vorne und hinten wurde gekürzt, das muss sichtbar sein. if !strings.HasPrefix(got, "…") || !strings.HasSuffix(got, "…") { t.Errorf("die Auslassungszeichen fehlen: %q", got) } } func TestSnippetWithoutMatch(t *testing.T) { // Kein wörtlicher Treffer — etwa weil der Fund über die Präfix-Suche kam. got := Snippet("Ein kurzer Text ohne den Suchbegriff.", "deploy") if got == "" { t.Error("ohne Treffer kam gar kein Ausschnitt zurück") } if !strings.Contains(got, "kurzer Text") { t.Errorf("es wurde nicht der Textanfang genommen: %q", got) } } // TestSnippetBeiGanzerFrage prüft den Normalfall bei Agenten: Die Anfrage ist // eine ganze Frage, die so nie im Text steht. Der Ausschnitt muss trotzdem an // der Fundstelle ansetzen, nicht am Textanfang. func TestSnippetBeiGanzerFrage(t *testing.T) { text := strings.Repeat("Vorlauf. ", 40) + "Der Zertifikatswechsel ist im März. " + strings.Repeat("Nachlauf. ", 40) got := Snippet(text, "wie läuft der Zertifikatswechsel") if !strings.Contains(got, "Zertifikatswechsel") { t.Errorf("der Ausschnitt setzt nicht an der Fundstelle an: %q", got) } } // TestSnippetLaengstesWortZuerst prüft die Wahl zwischen mehreren Wörtern: // Das längere, aussagekräftigere gewinnt, auch wenn das kürzere früher steht. func TestSnippetLaengstesWortZuerst(t *testing.T) { text := "Dienst. " + strings.Repeat("Füllwort. ", 60) + "Kubernetes-Cluster hier." got := Snippet(text, "dienst kubernetes") if !strings.Contains(got, "Kubernetes") { t.Errorf("es wurde nicht das längste Wort gewählt: %q", got) } } func TestTrefferwort(t *testing.T) { text := "Wir deployen über GitHub Actions." faelle := map[string]string{ "GitHub Actions": "GitHub Actions", // ganze Anfrage kommt vor "wie deployen wir": "deployen", "wie wir": "", // nur kurze Wörter "gibtesnicht": "", "": "", "actions, github?": "actions", // gleich lang: Reihenfolge der Anfrage } for anfrage, erwartet := range faelle { if got := trefferwort(text, anfrage); got != erwartet { t.Errorf("trefferwort(%q) = %q, erwartet %q", anfrage, got, erwartet) } } } // TestHighlightSnippetEinzelwort prüft, dass bei einer ganzen Frage das Wort // hervorgehoben wird, an dem sich der Ausschnitt ausrichtet. func TestHighlightSnippetEinzelwort(t *testing.T) { got := HighlightSnippet("Wir deployen über GitHub Actions.", "wie deployen wir") if !strings.Contains(got, "deployen") { t.Errorf("das Fundwort wurde nicht hervorgehoben: %q", got) } } func TestSnippetShortText(t *testing.T) { got := Snippet("Kurz.", "Kurz") if got != "Kurz." { t.Errorf("Snippet = %q, erwartet %q", got, "Kurz.") } } // TestHighlightSnippetEscapesFirst ist ein Sicherheitstest: Der Inhalt muss // escaped werden, BEVOR die Hervorhebung eingesetzt wird. Andersherum könnte ein // Eintrag eigenes HTML in die Trefferliste einschleusen. func TestHighlightSnippetEscapesFirst(t *testing.T) { got := HighlightSnippet("Ein im Text", "script") if strings.Contains(got, "