test: Abnahmekriterien als Playwright-Tests, Anmeldungen im Protokoll

Zehn Tests, die genau die Zusagen aus dem Auftrag pruefen - an der
laufenden Anwendung, nicht an einzelnen Funktionen:

- Aus dem Bestellungsdatum entstehen die gesetzlichen Fristen, mit
  Rechtsgrundlage, und die Aufwandspauschale ist als Ausschlussfrist
  gekennzeichnet.
- Ein PDF laesst sich hochladen und in zwei Klicks einem Vorgang
  zuordnen.
- Eine Datei, die sich nur als PDF ausgibt, wird abgewiesen. Das ist der
  Angriff, gegen den die Pruefung an den Magic Bytes gebaut ist: HTML mit
  PDF-Endung und PDF-MIME-Typ, das spaeter als Seite ausgeliefert wuerde.
- Ein genehmigungspflichtiger Vorgang bietet die Stufe "Vollzogen" gar
  nicht erst an, solange kein Beschluss hinterlegt ist (§ 1858 BGB).
- Das Vermoegensverzeichnis kommt als echtes PDF heraus - geprueft wird
  die Signatur %PDF-, nicht nur der Dateiname.
- Der Vollexport verlangt eine frische Anmeldung.
- Am Handy: kein waagerechtes Scrollen der Seite, Bedienelemente
  mindestens 40 Pixel hoch, Schublade per Escape schliessbar.

Dazu ein echter Fund aus dem Protokolltest: Anmeldungen und
Abmeldungen tragen keine betreuteId - sie haengen am Konto, nicht an der
Akte. Die Protokollansicht filterte nur nach betreuteId und liess damit
ausgerechnet die Frage weg, wer wann auf die Akte zugegriffen hat. Jetzt
werden beide Arten von Eintraegen gezeigt.

34 Tests, je einmal am Schreibtisch und am Handy.

Etappe: 8
Phase: Haertung
This commit is contained in:
Florian Wilde
2026-08-22 07:10:19 +02:00
parent 1a91f62ced
commit dccc34d669
2 changed files with 300 additions and 3 deletions
+16 -3
View File
@@ -70,14 +70,27 @@ export default async function ProtokollSeite({
const proSeite = 50
const nummer = Math.max(1, Number.parseInt(seite, 10) || 1)
/*
* Zwei Arten von Eintraegen gehoeren hierher:
*
* 1. Alles, was diese Betreuung betrifft.
* 2. Anmeldungen, Abmeldungen und Kontoaenderungen des angemeldeten
* Benutzers. Die tragen keine betreuteId - sie haengen ja am Konto,
* nicht an der Akte. Wuerde man nur nach betreuteId filtern, fehlte
* ausgerechnet die Frage "wer hat wann auf die Akte zugegriffen".
*/
const filter = {
OR: [{ betreuteId: aktive.id }, { userId: benutzer.id, betreuteId: null }],
}
const [eintraege, gesamt] = await Promise.all([
db.auditLog.findMany({
where: { betreuteId: aktive.id },
where: filter,
orderBy: { zeitpunkt: 'desc' },
skip: (nummer - 1) * proSeite,
take: proSeite,
}),
db.auditLog.count({ where: { betreuteId: aktive.id } }),
db.auditLog.count({ where: filter }),
])
const seiten = Math.max(1, Math.ceil(gesamt / proSeite))
@@ -86,7 +99,7 @@ export default async function ProtokollSeite({
<div className="space-y-6">
<SeitenKopf
titel="Protokoll"
beschreibung="Jede Änderung an den Daten dieser Betreuung, lückenlos und in der Reihenfolge, in der sie geschehen ist."
beschreibung="Jede Änderung an den Daten dieser Betreuung und jede Anmeldung an deinem Zugang — lückenlos und in der Reihenfolge, in der sie geschehen ist."
/>
<Alert variant="hinweis">