feat(einstellungen): Betriebswerte im Dashboard einstellbar (#025)
Vier Bereiche unter Einstellungen -> System: Adresse und Agent, Kaufmaennisches, Sicherheit sowie Firma und Darstellung. Alles liegt als eine JSON-Zeile in der Tabelle Einstellung; fehlende Felder bekommen ihren Vorgabewert, eine kaputte Zeile legt den Betrieb nicht lahm. Die Werte wirken auch wirklich: Die Dashboard-Adresse und der Melderhythmus landen im ausgelieferten Einzeiler und im systemd-Timer (live geprueft), der Steuersatz in neuen Rechnungspositionen, die Sitzungsdauer im Token, die Firmenangaben im Kopf der PDF-Dateien. Nebenbei geschlossen: die OIDC-Luecke aus #024. Erlaubte Domaenen und ein Schalter gegen automatisch angelegte Konten. Dazu raeumt der Worker nachts nach den eingestellten Fristen auf - der juengste Report je Host bleibt. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { domaeneErlaubt, einstellungenSchema, onCalendar, VORGABEN } from "@/server/einstellungen";
|
||||
|
||||
describe("Einstellungen", () => {
|
||||
it("füllt fehlende Werte mit den Vorgaben", () => {
|
||||
const werte = einstellungenSchema.parse({});
|
||||
expect(werte.steuersatz).toBe(19);
|
||||
expect(werte.sitzungsdauerStunden).toBe(12);
|
||||
expect(werte.agentRhythmus).toBe("taeglich");
|
||||
expect(werte.oidcKontenAnlegen).toBe(true);
|
||||
});
|
||||
|
||||
it("übernimmt gesetzte Werte und lässt den Rest auf Vorgabe", () => {
|
||||
const werte = einstellungenSchema.parse({ steuersatz: 7.7, waehrung: "CHF" });
|
||||
expect(werte.steuersatz).toBe(7.7);
|
||||
expect(werte.waehrung).toBe("CHF");
|
||||
expect(werte.zahlungszielTage).toBe(VORGABEN.zahlungszielTage);
|
||||
});
|
||||
|
||||
it("weist unsinnige Werte ab", () => {
|
||||
expect(einstellungenSchema.safeParse({ steuersatz: 250 }).success).toBe(false);
|
||||
expect(einstellungenSchema.safeParse({ sitzungsdauerStunden: 0 }).success).toBe(false);
|
||||
expect(einstellungenSchema.safeParse({ dashboardUrl: "kein-url" }).success).toBe(false);
|
||||
expect(einstellungenSchema.safeParse({ anmeldeversuche: 1 }).success).toBe(false);
|
||||
});
|
||||
|
||||
it("lässt eine leere Dashboard-Adresse zu (dann gilt die Umgebung)", () => {
|
||||
expect(einstellungenSchema.parse({ dashboardUrl: "" }).dashboardUrl).toBe("");
|
||||
});
|
||||
|
||||
it("übersetzt den Rhythmus nach systemd", () => {
|
||||
expect(onCalendar("taeglich")).toBe("daily");
|
||||
expect(onCalendar("stuendlich")).toBe("hourly");
|
||||
expect(onCalendar("zwoelfstuendlich")).toBe("0/12:00:00");
|
||||
});
|
||||
});
|
||||
|
||||
describe("Erlaubte OIDC-Domänen", () => {
|
||||
it("lässt ohne Angabe jede Domäne zu", () => {
|
||||
expect(domaeneErlaubt("wer@auch-immer.de", "")).toBe(true);
|
||||
});
|
||||
|
||||
it("lässt nur die genannten Domänen zu", () => {
|
||||
expect(domaeneErlaubt("fw@wilde-server.de", "wilde-server.de")).toBe(true);
|
||||
expect(domaeneErlaubt("fremd@example.com", "wilde-server.de")).toBe(false);
|
||||
});
|
||||
|
||||
it("versteht mehrere Domänen, Leerzeichen und führendes @", () => {
|
||||
const liste = " @wilde-server.de, kunde.de ";
|
||||
expect(domaeneErlaubt("a@kunde.de", liste)).toBe(true);
|
||||
expect(domaeneErlaubt("b@WILDE-SERVER.DE", liste)).toBe(true);
|
||||
expect(domaeneErlaubt("c@fremd.de", liste)).toBe(false);
|
||||
});
|
||||
|
||||
it("weist eine Adresse ohne Domäne ab", () => {
|
||||
expect(domaeneErlaubt("kaputt", "kunde.de")).toBe(false);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user