61 lines
2.5 KiB
TypeScript
61 lines
2.5 KiB
TypeScript
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: ");
|
||
});
|
||
});
|