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");
});
});