import { describe, expect, it } from "vitest"; import { HIGHLIGHT_AFTER, HIGHLIGHT_BEFORE, splitHighlighted } from "./highlight"; describe("splitHighlighted", () => { it("markiert einen einzelnen Treffer korrekt", () => { const snippet = `hoher ${HIGHLIGHT_BEFORE}Umsatz${HIGHLIGHT_AFTER} im dritten Quartal`; expect(splitHighlighted(snippet)).toEqual([ { text: "hoher ", matched: false }, { text: "Umsatz", matched: true }, { text: " im dritten Quartal", matched: false }, ]); }); it("markiert mehrere Treffer im selben Snippet", () => { const snippet = `${HIGHLIGHT_BEFORE}Umsatz${HIGHLIGHT_AFTER} und ${HIGHLIGHT_BEFORE}Umsatzwachstum${HIGHLIGHT_AFTER}`; const segments = splitHighlighted(snippet); expect(segments.filter((s) => s.matched)).toHaveLength(2); }); it("liefert unveränderten Text ohne Marker als unmarkiertes Segment", () => { expect(splitHighlighted("kein treffer hier")).toEqual([{ text: "kein treffer hier", matched: false }]); }); it("bricht bei leerem Snippet nicht ab", () => { expect(splitHighlighted("")).toEqual([]); }); // Pflichtprüfung 3: Sonderzeichen in der Suchanfrage/im indexierten Text // dürfen die Anzeige nicht zum Absturz bringen. it("behandelt Sonderzeichen und potenziell gefährliches Markup als reinen Text", () => { const snippet = `${HIGHLIGHT_BEFORE}${HIGHLIGHT_AFTER} & "Zitat" 'Anführung' Ümläüte 日本語`; const segments = splitHighlighted(snippet); expect(segments[0]).toEqual({ text: "", matched: true }); expect(segments.map((s) => s.text).join("")).toContain("Ümläüte 日本語"); }); it("behandelt ein unvollständiges Markerpaar ohne Absturz", () => { const snippet = `abc ${HIGHLIGHT_BEFORE}unvollständig`; expect(() => splitHighlighted(snippet)).not.toThrow(); const segments = splitHighlighted(snippet); expect(segments.map((s) => s.text).join("")).toBe("abc unvollständig"); }); });