import { readFileSync } from "node:fs"; import { join } from "node:path"; import { describe, expect, it } from "vitest"; import { MITARBEITERART_STANDARD, MITARBEITERARTEN, istMitarbeiterart } from "@/lib/mitarbeiterart"; // Dieselbe Vorsichtsmassnahme wie bei den Personenkreisen: 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/20260915140000_mitarbeiterart.sql"); function werteAusDerBedingung(): string[] { const sql = readFileSync(MIGRATION, "utf8"); const block = sql.match(/chk_mitarbeiterart\s+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 Mitarbeiterarten", () => { it("stimmen mit der Bedingung in der Datenbank überein", () => { expect(new Set(werteAusDerBedingung())).toEqual(new Set(MITARBEITERARTEN)); }); it("führen Standard als Vorgabe", () => { // Die Spalte ist NOT NULL mit genau diesem Vorgabewert; weicht die // Oberfläche davon ab, bekäme der Bestand etwas anderes als die neuen // Zeilen. expect(MITARBEITERARTEN).toContain(MITARBEITERART_STANDARD); expect(readFileSync(MIGRATION, "utf8")).toContain("not null default 'Standard'"); }); it("weisen zurück, was nicht in der Liste steht", () => { expect(istMitarbeiterart("Altersteilzeit")).toBe(true); expect(istMitarbeiterart("Teilzeit")).toBe(false); expect(istMitarbeiterart(null)).toBe(false); }); it("sind etwas anderes als die Beschäftigtengruppe", () => { // Die beiden Achsen dürfen keine Werte teilen: täten sie es, liesse sich // aus einem Wert nicht mehr ablesen, welche Frage er beantwortet. for (const wert of ["Angestellte:r", "Arbeiter:in", "Lehrling"]) { expect(MITARBEITERARTEN).not.toContain(wert); } }); });