import { describe, expect, it } from "vitest"; import { istPersonalnummer, suchMuster, TRENNZEICHEN, TRENNZEICHEN_ERSATZ } from "@/lib/employee-search"; // Der Anlass: „Winkler H" gab alle sieben Winkler zurück statt der einen // Hannah. Das „H" wurde als Teilzeichenkette gesucht und traf damit T-h-omas, // Kat-h-arina und CNC-Dre-h-er:in. // // Was hier geprüft wird, ist die Musterbildung. Dass „am Wortanfang" auch // wirklich am Wortanfang trifft, entscheidet das SQL der Seite — und ist // gegen die laufende Datenbank belegt: „winkler h" liefert dort genau Hannah // Winkler, „winkler kat" die beiden Katharinas, „dreher" die CNC-Dreher:innen. describe("istPersonalnummer", () => { it("erkennt reine Ziffern", () => { expect(istPersonalnummer("3038")).toBe(true); expect(istPersonalnummer(" 3038 ")).toBe(true); }); it("hält alles andere für einen Namen", () => { for (const t of ["winkler", "winkler 3038", "3038a", "", " "]) { expect(istPersonalnummer(t)).toBe(false); } }); }); describe("suchMuster", () => { it("macht aus jedem Wort ein Paar: am Anfang, und nach einem Leerzeichen", () => { expect(suchMuster("winkler")).toEqual([["winkler%", "% winkler%"]]); }); it("behandelt jedes Wort einzeln", () => { expect(suchMuster("winkler h")).toEqual([ ["winkler%", "% winkler%"], ["h%", "% h%"], ]); }); it("zerlegt an denselben Zeichen wie das Feld, gegen das verglichen wird", () => { // Das Feld wird per translate an TRENNZEICHEN in Leerzeichen zerlegt. Tat // es nur das Feld, erzeugte „Müller-Weiß" das Muster „müller-weiß%", // während im Heuhaufen „müller weiß" stand: null Treffer, obwohl die // Person da ist. Ohne Bindestrich fand man sie. (C.08, 29.09.) expect(suchMuster("müller-weiß")).toEqual([ ["müller%", "% müller%"], ["weiß%", "% weiß%"], ]); }); it("zerlegt an jedem der Trennzeichen", () => { for (const zeichen of [...TRENNZEICHEN]) { expect(suchMuster(`abc${zeichen}def`), `„${zeichen}" trennt nicht`).toEqual([ ["abc%", "% abc%"], ["def%", "% def%"], ]); } }); it("findet dieselbe Person mit und ohne Bindestrich", () => { expect(suchMuster("müller-weiß")).toEqual(suchMuster("müller weiß")); }); it("hält Trennzeichen und Ersatz gleich lang", () => { // translate() ordnet Zeichen für Zeichen zu. Wäre der Ersatz kürzer, // fielen die überzähligen Trennzeichen ersatzlos weg und „Müller-Weiß" // würde im Feld zu „müllerweiß" — die Suche fände es dann wieder nicht. expect(TRENNZEICHEN_ERSATZ).toHaveLength(TRENNZEICHEN.length); expect(TRENNZEICHEN_ERSATZ.trim()).toBe(""); }); it("kennt keinen Platzhalter mitten im Wort", () => { // Das ist der Kern: „h%" trifft Hannah, „%h%" träfe auch Thomas. const [, [amAnfang]] = suchMuster("winkler h"); expect(amAnfang.startsWith("%")).toBe(false); }); it("schreibt klein, damit der Vergleich unabhängig von der Schreibweise ist", () => { expect(suchMuster("WINKLER")).toEqual([["winkler%", "% winkler%"]]); }); it("verträgt beliebig viel Abstand und Rand", () => { expect(suchMuster(" winkler h ")).toHaveLength(2); expect(suchMuster(" ")).toEqual([]); }); it("entschärft die Platzhalter von LIKE", () => { // Sonst wäre „%" eine Suche nach allem und „_" nach beliebigem Zeichen. expect(suchMuster("100%")).toEqual([["100\\%%", "% 100\\%%"]]); expect(suchMuster("a_b")).toEqual([["a\\_b%", "% a\\_b%"]]); expect(suchMuster("a\\b")).toEqual([["a\\\\b%", "% a\\\\b%"]]); }); });