import { readFileSync } from "node:fs"; import { join } from "node:path"; import { describe, expect, it } from "vitest"; import { BEGUENSTIGUNG_AB_GRAD, GRUND_BEGUENSTIGT_BEHINDERT, KUENDIGUNGSSCHUTZ_GRUENDE, istKuendigungsschutzGrund, } from "@/lib/kuendigungsschutz"; // Die Liste der Personenkreise steht zweimal: in lib/kuendigungsschutz.ts für // die Oberfläche und als CHECK in der Migration für die Datenbank. Die // Doppelung ist begründet (siehe dort) — aber eine begründete Doppelung ist // immer noch eine, und zwei Listen laufen auseinander. Auffallen würde es // erst beim Speichern: die Oberfläche böte einen Wert an, den die Bedingung // zurückweist, und die Benutzerin sähe einen Fehler aus der Datenbank. // // Deshalb liest dieser Test die Migration und hält die beiden gegeneinander. // Er braucht keine Datenbank — die Datei genügt. const MIGRATION = join( process.cwd(), "db/migrations/20260915120000_kuendigungsschutz_personenkreis_und_behinderung.sql" ); function werteAusDerBedingung(): string[] { const sql = readFileSync(MIGRATION, "utf8"); const block = sql.match(/chk_kuendigungsschutz_personenkreis\s+check[\s\S]*?\);/)?.[0]; expect(block, "Die Bedingung steht nicht mehr in der Migration").toBeDefined(); // Die Werte stehen als einfach zitierte Zeichenketten in der in-Liste. return [...block!.matchAll(/'([^']+)'/g)].map((m) => m[1]); } describe("Die Personenkreise", () => { it("stimmen mit der Bedingung in der Datenbank überein", () => { expect(new Set(werteAusDerBedingung())).toEqual(new Set(KUENDIGUNGSSCHUTZ_GRUENDE)); }); it("stehen jeder nur einmal", () => { expect(new Set(KUENDIGUNGSSCHUTZ_GRUENDE).size).toBe(KUENDIGUNGSSCHUTZ_GRUENDE.length); }); it("enthalten den Kreis, an dem die Angaben zur Behinderung hängen", () => { // Wird er umbenannt, blendet die Akte die Felder nicht mehr auf — und // niemand bemerkt es, weil nichts fehlschlägt. expect(KUENDIGUNGSSCHUTZ_GRUENDE).toContain(GRUND_BEGUENSTIGT_BEHINDERT); }); it("weisen zurück, was nicht in der Liste steht", () => { expect(istKuendigungsschutzGrund("Eltern")).toBe(true); expect(istKuendigungsschutzGrund("Irgendetwas")).toBe(false); expect(istKuendigungsschutzGrund("")).toBe(false); expect(istKuendigungsschutzGrund(null)).toBe(false); }); }); describe("Die Grenze der Begünstigung", () => { it("liegt bei 50 Prozent", () => { expect(BEGUENSTIGUNG_AB_GRAD).toBe(50); }); });