Files
alpenwerk-hr/tests/unit/historie-felder.test.ts
Andrei Laas 8b7e32f14a
All checks were successful
CI / Lint, Typen, Tests, Build (push) Successful in 11m35s
CI / Migrationen auf leerer Datenbank (push) Successful in 10m10s
Hay-Grade auch in "Daten aendern"
Die Befoerderung konnte ihn schon setzen, "Daten aendern" nicht -- weder das
Formular noch change_employee_data kannten das Feld. Damit war eine Einstufung
nur ueber den Weg "Befoerderung" zu aendern, und eine Richtigstellung ("da
stand von Anfang an die falsche Stufe") ist keine Befoerderung: sie soll keine
Planstelle wechseln und kein Ereignis in der Historie hinterlassen.

Das Feld gehoert zur Gruppe contract und ist damit datiert -- eine Umstufung
gilt ab einem Tag. Es kann also in pending_org_changes landen, und deshalb
steht es auch im Nachtlauf. Genau diese zweite Stelle ist hier schon einmal
vergessen worden: die Gruppe role fehlte dort monatelang, und eine datierte
Aenderung wurde als applied vermerkt, ohne etwas zu tun. Drittens
app_feld_karte, sonst waere der Eintrag in der Historie nicht richtigstellbar.

Alle drei Funktionen werden aus der laufenden Definition gelesen und an genau
einem Anker ergaenzt, nicht aus einer Datei kopiert.

Der Test zur Feldkarte liest jetzt alle Migrationen statt einer bestimmten. Der
feste Dateiname darin trug den Vermerk "die zuletzt gueltige Fassung" und war
schon zwei Migrationen spaeter falsch -- und ein Teil der Feldkarte kommt
inzwischen ohnehin aus einer Punktaenderung statt aus einer vollstaendigen
Fassung.
2026-09-28 15:06:58 +02:00

62 lines
3.1 KiB
TypeScript

import { readdirSync, readFileSync } from "node:fs";
import { join } from "node:path";
import { describe, expect, it } from "vitest";
import { FELD_AUSWAHLEN, auswahlFuer } from "@/lib/historie-felder";
// Die Schlüssel sind Bezeichnungen aus `app_feld_karte()`. Stimmt eine nicht
// mehr — umbenannt, vertippt —, fällt das nirgends auf: das Feld bliebe im
// Dialog „Eintrag berichtigen" einfach ein Textfeld, und getippte Werte
// landeten wieder in der Spalte. Ein stiller Rückfall auf den Zustand, den
// diese Datei beheben soll.
//
// Gelesen werden **alle** Migrationen, nicht eine bestimmte. Hier stand
// einmal ein fester Dateiname mit dem Vermerk „die zuletzt gültige Fassung";
// der war schon zwei Migrationen später falsch, und ein Teil der Feldkarte
// kommt inzwischen ohnehin aus einer Punktänderung an der laufenden
// Definition statt aus einer vollständigen Fassung. Eine Bezeichnung, die
// irgendwann einmal eingetragen wurde, zählt damit als bekannt — das ist
// schwächer als der Stand von heute, aber es ist die Frage, die hier zählt:
// ob jemand einen Schlüssel erfunden hat, den es nie gab.
const MIGRATIONEN = join(process.cwd(), "db/migrations");
function bezeichnungenDerFeldkarte(): string[] {
// Je Zeile: 'Bezeichnung', jsonb_build_array('spalte', 'typ', 'gruppe'),
const muster = /'([^']+)',\s+jsonb_build_array\('[a-z_]+', '[a-z_]+'/g;
const gefunden = readdirSync(MIGRATIONEN)
.filter((f) => f.endsWith(".sql"))
.flatMap((f) => [...readFileSync(join(MIGRATIONEN, f), "utf8").matchAll(muster)].map((m) => m[1]));
expect(gefunden.length, "Die Feldkarte steht in keiner Migration mehr").toBeGreaterThan(0);
return gefunden;
}
describe("Die Auswahllisten im Dialog „Eintrag berichtigen“", () => {
it("nennen nur Felder, die es in der Feldkarte gibt", () => {
const bekannt = new Set(bezeichnungenDerFeldkarte());
expect(bekannt.size).toBeGreaterThan(30);
for (const feld of Object.keys(FELD_AUSWAHLEN)) {
expect(bekannt, `„${feld}“ steht nicht in app_feld_karte()`).toContain(feld);
}
});
it("bieten für das Verhältnis des Notfallkontakts eine Liste an", () => {
// Der gemeldete Fall: dort liess sich freier Text eintragen, während die
// Erfassung überall sonst eine Liste führt.
expect(auswahlFuer("Notfallkontakt Verhältnis")).toContain("Gattin/Gatte");
expect(auswahlFuer("Notfallkontakt Verhältnis")).toContain("Tochter");
});
it("lassen Felder ohne feste Liste als Textfeld stehen", () => {
expect(auswahlFuer("Adresse")).toBeUndefined();
expect(auswahlFuer("Wochenstunden")).toBeUndefined();
});
it("führen keine Felder mit Aufzählungstyp", () => {
// Dort ist der gespeicherte Wert nicht die Anzeige (`m`/`w`,
// `true`/`false`). Eine Liste, die die Anzeigeform schreibt, liefe in
// einen Umwandlungsfehler oder in einen stillen Fehlwert.
for (const feld of ["Geschlecht", "Beschäftigungsausmaß", "Vertragsart", "Besetzungsart", "Betriebsrat"]) {
expect(auswahlFuer(feld), `„${feld}“ gehört nicht in die Auswahl`).toBeUndefined();
}
});
});