import { afterEach, describe, expect, it, vi } from "vitest"; import { MARKE_FEHLER_TEXT, MARKE_GUELTIG_SEKUNDEN, markeErzeugen, markePruefen, } from "@/lib/kiosk/anmeldemarke"; /** * Die Anmeldemarke ist ein Anmeldeweg — sie verdient dieselbe Sorgfalt wie ein * Passwort. Geprüft wird deshalb nicht nur der gute Fall, sondern vor allem, * was passiert, wenn jemand an der Marke dreht. */ const PERSON = "8f7d3b1e-2c4a-4e6f-9a1b-0c2d4e6f8a1b"; const ORGANISATION = "1a2b3c4d-5e6f-4a8b-9c0d-1e2f3a4b5c6d"; afterEach(() => { vi.useRealTimers(); }); describe("Anmeldemarke", () => { it("erkennt die eigene Marke wieder", () => { const marke = markeErzeugen(PERSON, ORGANISATION); const ergebnis = markePruefen(marke); expect(ergebnis).toEqual({ personId: PERSON, organisationId: ORGANISATION }); }); it("weist eine Marke ab, an der jemand gedreht hat", () => { const marke = markeErzeugen(PERSON, ORGANISATION); // Andere Person, alte Signatur — der klassische Versuch. const fremde = marke.replace(PERSON, "0000ffff-1111-4222-8333-444455556666"); expect(markePruefen(fremde)).toEqual({ fehler: "verfaelscht" }); }); it("weist eine Marke ab, deren Signatur gefälscht wurde", () => { const marke = markeErzeugen(PERSON, ORGANISATION); const teile = marke.split("."); const verdreht = [...teile.slice(0, 3), "x".repeat(teile[3]!.length)].join("."); expect(markePruefen(verdreht)).toEqual({ fehler: "verfaelscht" }); }); it("erkennt etwas, das gar keine Marke ist", () => { expect(markePruefen("")).toEqual({ fehler: "ungueltig" }); expect(markePruefen("https://beispiel.de/g/INV-0001")).toEqual({ fehler: "ungueltig" }); expect(markePruefen("a.b.c")).toEqual({ fehler: "ungueltig" }); }); it("läuft nach der festgelegten Zeit ab", () => { vi.useFakeTimers(); const marke = markeErzeugen(PERSON, ORGANISATION); // Kurz vor Ablauf gilt sie noch. vi.advanceTimersByTime((MARKE_GUELTIG_SEKUNDEN - 1) * 1000); expect(markePruefen(marke)).toHaveProperty("personId", PERSON); // Zwei Sekunden später nicht mehr — das abfotografierte Handy nützt nichts. vi.advanceTimersByTime(2000); expect(markePruefen(marke)).toEqual({ fehler: "abgelaufen" }); }); it("nimmt keine Marke aus der Zukunft an", () => { vi.useFakeTimers(); vi.advanceTimersByTime(10 * 60 * 1000); const spaetere = markeErzeugen(PERSON, ORGANISATION); vi.setSystemTime(new Date(Date.now() - 5 * 60 * 1000)); expect(markePruefen(spaetere)).toEqual({ fehler: "abgelaufen" }); }); it("hat für jeden Fehler einen Satz, den man am Terminal lesen kann", () => { for (const text of Object.values(MARKE_FEHLER_TEXT)) { expect(text.length).toBeGreaterThan(10); expect(text).toMatch(/[.!]$/); } }); it("erzeugt bei jedem Aufruf eine andere Marke", () => { vi.useFakeTimers(); const erste = markeErzeugen(PERSON, ORGANISATION); vi.advanceTimersByTime(1000); const zweite = markeErzeugen(PERSON, ORGANISATION); expect(erste).not.toBe(zweite); }); });