Drei Rollen: Administrator, Techniker, Kunde. Jede der 28 Aktionen nennt das Recht, das sie verlangt; die Rechte stehen an einer Stelle. Kundenkonten haengen an genau einem Kunden und sehen nur dessen Hosts und Rechnungen - ohne Einkaufspreise und Marge. Die Einschraenkung sitzt in den Abfragen selbst, damit keine Seite vergessen kann, sie weiterzugeben; sechs Tests pruefen das. Dabei gefunden: Neu ueber OIDC angelegte Konten haetten die Vorgabe des Datenmodells geerbt - ADMIN. Jetzt gibt es dafuer eine Einstellung mit der Vorgabe Techniker. Passkeys (#028) als gleichwertiger, passwortloser Anmeldeweg neben Passwort und OIDC. Mehrere je Konto, Aufgabe in einem kurzlebigen Cookie, rpID aus der oeffentlichen Adresse. Ohne HTTPS sagt die Seite es, statt still zu scheitern. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
65 lines
2.6 KiB
TypeScript
65 lines
2.6 KiB
TypeScript
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("legt neue OIDC-Konten nicht als Administrator an", () => {
|
|
// Die Vorgabe ist sicherheitsrelevant: Wer sich beim Anbieter anmelden kann, soll nicht
|
|
// automatisch alles dürfen.
|
|
expect(einstellungenSchema.parse({}).oidcStandardRolle).toBe("TECHNIKER");
|
|
});
|
|
|
|
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);
|
|
});
|
|
});
|