import { readFileSync } from "node:fs"; import { join } from "node:path"; import { describe, expect, it } from "vitest"; import { HAY_GRADES, HAY_GRADE_STANDARD, HAY_GRADE_WERTE, hayGradeLabel, istHayGrade } from "@/lib/hay-grade"; // Dieselbe Vorsichtsmassnahme wie bei Personenkreis und Mitarbeiterart: die // Liste steht in der Migration als CHECK und hier für die Oberfläche. Laufen // die beiden auseinander, bietet das Formular einen Wert an, den die Datenbank // abweist — und die Benutzerin sieht einen Fehler aus dem Maschinenraum. const MIGRATION = join(process.cwd(), "db/migrations/20260928140000_hay_grade.sql"); function werteAusDerBedingung(): string[] { const sql = readFileSync(MIGRATION, "utf8"); const block = sql.match(/constraint chk_hay_grade check \([\s\S]*?\);/)?.[0]; expect(block, "Die Bedingung steht nicht mehr in der Migration").toBeDefined(); return [...block!.matchAll(/'([^']+)'/g)].map((m) => m[1]); } describe("Die Hay-Grades", () => { it("stimmen mit der Bedingung in der Datenbank überein", () => { expect(new Set(werteAusDerBedingung())).toEqual(new Set(HAY_GRADE_WERTE)); }); it("führen den Generic Grade als Vorgabe", () => { // Die Spalte ist NOT NULL mit genau diesem Vorgabewert, und der Bestand // hat ihn bei der Umstellung bekommen. Weicht die Oberfläche davon ab, // bekämen neue Zeilen etwas anderes als die vorhandenen. expect(HAY_GRADE_WERTE).toContain(HAY_GRADE_STANDARD); expect(readFileSync(MIGRATION, "utf8")).toContain("set default '-'"); }); it("zeigen den Titel und speichern die Kennung", () => { // Nur beim Generic Grade gehen beide auseinander — genau deshalb darf die // Anzeige nicht einfach der gespeicherte Wert sein. expect(hayGradeLabel("-")).toBe("Generic Grade"); expect(hayGradeLabel("HG15")).toBe("HG15"); for (const g of HAY_GRADES) { if (g.value !== "-") expect(g.label).toBe(g.value); } }); it("lassen einen unbekannten Wert stehen, statt ihn zu verschlucken", () => { // Eine Zeile aus der Zeit vor der Umstellung soll sichtbar falsch sein, // nicht unsichtbar leer. expect(hayGradeLabel("B")).toBe("B"); expect(hayGradeLabel(null)).toBe("–"); }); it("weisen zurück, was nicht in der Liste steht", () => { expect(istHayGrade("HG19P")).toBe(true); expect(istHayGrade("HG21")).toBe(false); expect(istHayGrade("B")).toBe(false); expect(istHayGrade(null)).toBe(false); }); });