Files
Laufzettel/tests/validierung.test.ts
T
florian.wilde e3d80e5982
Prüfung / pruefung (push) Canceled after 0s
Prüfung / e2e (push) Canceled after 0s
feat(vorlagen): Editor, Liste und Versionsgeschichte (#24)
2026-09-25 08:23:22 +00:00

61 lines
2.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { describe, expect, it } from "vitest";
import { z } from "@/lib/validierung";
import { AustauschSchema, StrukturSchema, stelleBenennen } from "@/lib/vorlagen-format";
/**
* Zod ist in src/lib/validierung.ts auf Deutsch eingestellt (#009).
*
* Ohne diese Einstellung landen englische Standardsaetze ueber die Server
* Actions in der Oberflaeche — und zwar genau dort, wo niemand an eine eigene
* Meldung gedacht hat.
*/
describe("Deutsche Meldungen", () => {
it("meldet einen falschen Typ auf Deutsch", () => {
const ergebnis = z.object({ name: z.string() }).safeParse({ name: 42 });
expect(ergebnis.error?.issues[0]?.message).toMatch(/Ungültige Eingabe/);
});
it("meldet ein fehlendes Pflichtfeld auf Deutsch", () => {
const ergebnis = z.object({ name: z.string() }).safeParse({});
expect(ergebnis.error?.issues[0]?.message).not.toMatch(/Invalid input/);
});
it("laesst eigene Meldungen unangetastet", () => {
const ergebnis = StrukturSchema.safeParse({
abschnitte: [{ titel: "A", schritte: [{ titel: "" }] }],
});
expect(ergebnis.error?.issues[0]?.message).toBe("Ein Schritt braucht einen Titel.");
});
it("meldet ein unbekanntes Austauschformat auf Deutsch", () => {
const ergebnis = AustauschSchema.safeParse({ format: 99, name: "X", struktur: {} });
expect(ergebnis.error?.issues[0]?.message).toMatch(/Unbekanntes Format/);
});
});
describe("Stelle benennen", () => {
it("macht aus einem Zod-Pfad eine Stelle im Editor", () => {
expect(stelleBenennen(["struktur", "abschnitte", 2, "schritte", 0, "titel"])).toBe(
"Abschnitt 03, Schritt 1: ",
);
expect(stelleBenennen(["variablen", 1, "schluessel"])).toBe("Variable 2: ");
expect(stelleBenennen(["abschnitte", 0, "schritte", 3, "konfig", "optionen", 1])).toBe(
"Abschnitt 01, Schritt 4, Option 2: ",
);
});
it("liefert nichts, wenn der Pfad keine Stelle beschreibt", () => {
// Dann bleibt die Meldung des Schemas fuer sich allein stehen – besser als
// ein leerer Doppelpunkt davor.
expect(stelleBenennen(["name"])).toBe("");
expect(stelleBenennen([])).toBe("");
});
it("nennt die Stelle in der Reihenfolge, in der man sie sucht", () => {
// Erst der Abschnitt, dann der Schritt darin – nicht umgekehrt.
const stelle = stelleBenennen(["abschnitte", 9, "schritte", 11, "titel"]);
expect(stelle.indexOf("Abschnitt")).toBeLessThan(stelle.indexOf("Schritt"));
expect(stelle).toBe("Abschnitt 10, Schritt 12: ");
});
});