Testbook: Abgabe-Links¶
Dieses Testbook beschreibt die Prüfungen für den Zugang zur öffentlichen Abgabebox per
Link. Der Zugang ist ein zufälliger Schlüssel in der URL (<abgabebox-domain>/<schlüssel>),
der Mandanten-Slug ist keine Zugangsberechtigung mehr. Geschützt werden vor allem drei
Dinge: kein Zugriff ohne gültigen Link, ein Link erreicht nur die ihm zugeordneten
Abgaben und die Trennung der Abgabebox bleibt so strikt wie zuvor (eingeschränkte
DB-Rolle, kein geteilter Code).
Die ergänzenden Prüfungen für exakte Datei-Duplikate und gleichzeitige Uploads stehen im Upload-Testbook.
Ausführung¶
| Ebene | Befehl | Datei |
|---|---|---|
| E2E (echter Stack, Chromium) | ./scripts/e2e.sh all |
frontend/e2e/abgabe-links.spec.ts |
| Haupt-Backend (verknüpfte Uploads, echte DB) | ./scripts/test.sh backend |
backend/tests/test_submission_upload_rules.py, backend/tests/test_submission_service.py |
| Haupt-Backend (echte DB, DB-Rechte) | ./scripts/test.sh backend |
backend/tests/test_submission_links.py |
| Abgabebox-Backend (ohne DB) | ./scripts/test.sh abgabebox-backend |
abgabebox-backend/tests/test_link_token_access.py |
| Haupt-Frontend (Vitest) | ./scripts/test.sh frontend |
frontend/components/submission-assignments/submission-link-manager.test.tsx |
Nur die E2E-Datei, bei bereits gestartetem E2E-Stack (./scripts/e2e.sh up):
cd frontend
PLAYWRIGHT_BASE_URL=http://127.0.0.1:13000 E2E_ABGABEBOX_BASE_URL=http://127.0.0.1:13001 \
npx playwright test e2e/abgabe-links.spec.ts --workers=1
Für einen frischen Lauf den E2E-Stack zurücksetzen (./scripts/e2e.sh down, dann up):
die MFA-Einrichtung gehört zur jeweiligen Testdatenbank. Die Spec räumt ihre Links,
Abgaben und Termine selbst auf und stellt den ursprünglichen Standard-Link wieder her.
Automatisierte Testfälle (E2E)¶
| ID | Durchführung | Erwartung |
|---|---|---|
| LNK-01 | Links des Mandanten abrufen | Genau ein Standard-Link; Schlüssel ≥ 32 Zeichen, nur URL-sichere Zeichen, alle Schlüssel verschieden; URL endet auf den Schlüssel |
| LNK-02 | Link anlegen, doppelten Namen (andere Schreibweise) anlegen, umbenennen, zum Standard machen | Doppelter Name abgelehnt (400); Umbenennen ändert den Schlüssel nicht; danach genau ein Standard-Link |
| LNK-03 | Abgabe ohne, mit expliziter und mit leerer Link-Auswahl anlegen | Ohne Angabe: Standard-Link; explizit: genau die gewählten Links; leer: kein Link |
| LNK-04 | Öffentlichen Abruf über passenden Link, über fremden gültigen Link, über unbekannten/zu kurzen Schlüssel und über den Mandanten-Slug | Nur der zugeordnete Link liefert 200; alle anderen Fälle 404 (nicht unterscheidbar); der Slug öffnet nichts mehr |
| LNK-05 | Abgabe über zwei Links erreichbar machen, danach einen Link abwählen | Beide Links funktionieren; nach dem Abwählen 404 nur über den abgewählten Link |
| LNK-06 | Neuen Schlüssel erzeugen, danach Link löschen | Alte URL sofort 404, neue URL 200; nach dem Löschen 404 und die Abgabe hat den Link nicht mehr |
| LNK-07 | Link-Endpunkte mit der Sitzung eines Lesers eines anderen Arbeitsbereichs aufrufen | Auflisten (würde Schlüssel preisgeben), Anlegen, Ändern, Erneuern und Löschen: 403; Link unverändert |
| LNK-08 | Im Browser Links-Dialog öffnen, öffentliche Seite mit Schlüssel, mit falschem Schlüssel und Startseite laden | Dialog zeigt Namen und volle URL; Abgabe erscheint über den Schlüssel; falscher Schlüssel 404 „Nicht gefunden“; Startseite ohne Mandanten-/Abgabeinfo; Referrer-Policy: no-referrer und noindex |
Automatisierte Testfälle (Backend)¶
backend/tests/test_submission_links.py (echte, migrierte Datenbank):
| Bereich | Prüfung |
|---|---|
| Tokens | Zufällig, mindestens 32 Zeichen, URL-sicher, eindeutig |
| Link-Verwaltung | Name je Mandant eindeutig (ohne Beachtung der Schreibweise), anderer Mandant darf denselben Namen nutzen; höchstens ein Standard-Link; Neu-Erzeugen ändert den Schlüssel; Links sind mandantengebunden |
| Neuer Mandant | Anlage über das Admin-Panel erzeugt genau einen Standard-Link „Standard“ |
| Zuordnung | Neue Abgabe nutzt den Standard-Link; mehrere Links oder keiner möglich; fremder Link wird abgelehnt (Anlegen und Ändern); Ändern ersetzt die Links, None lässt sie unverändert; Löschen eines Links entfernt nur die Zuordnung, Löschen einer Abgabe lässt den Link bestehen |
| Todos | Referenz-Link enthält den Link-Schlüssel; nach Neu-Erzeugen des Schlüssels aktualisiert; ohne Link kein Sync und Referenz geleert |
| Klonen/Export/Import | Klon erhält gleiche Link-Struktur mit neuen Schlüsseln (bzw. einen Standard-Link, falls die Quelle keinen hatte); Export enthält keine Schlüssel, Import erzeugt einen neuen Standard-Link mit allen importierten Abgaben |
| Isolation | Rolle hocx_abgabebox darf id, tenant_id, token und assignment_id, link_id lesen, aber weder Name, Standard-Flag noch SELECT *, und weder einfügen, ändern noch löschen |
| Migration | Jeder bereits vorhandene Mandant hat nach 0075 einen Standard-Link |
abgabebox-backend/tests/test_link_token_access.py (ohne Datenbank):
- Ungültig geformte Schlüssel ergeben 404, ohne die Datenbank abzufragen.
- Unbekannter Schlüssel: 404 mit derselben Meldung wie bei jeder anderen fehlenden Ressource.
- Jede Abfrage unterhalb des Links ist auf Mandant und Link beschränkt.
- Die Tabellendefinitionen entsprechen exakt den freigegebenen Spalten; es gibt keine Mandanten-Tabelle und keine Slug-Abfrage mehr.
- Die Captcha-Sitzung ist an den Link gebunden (anderer Link, andere Abgabe, andere IP: abgelehnt).
submission-link-manager.test.tsx: Anzeige mit Namen, Standard-Markierung und voller URL;
Anlegen nur mit Namen; Löschen nur nach Bestätigung samt Hinweis auf betroffene Abgaben;
nach „Als Standard festlegen“ genau ein Standard-Link.
Verknüpfte Dateien und Bilder als Abgabe¶
Direkt-Uploads über „Dateien“ oder „Fotos“ mit Bezug auf ein Abgabe-Element zählen in der internen Abgabeansicht ebenfalls als eingereicht. Bestehende Verknüpfungen werden beim Lesen berücksichtigt; eine erneute Einreichung ist nicht nötig.
Automatisiert in backend/tests/test_submission_upload_rules.py,
test_linked_upload_counts_as_submission: acht Kombinationen aus Dokument/Bild,
offen/geschlossen und Virenprüfung clean/pending. Jeder Fall prüft anschließend
auch die Kombination mit einer zusätzlichen Datei aus der öffentlichen Abgabebox.
| ID | Durchführung | Erwartung |
|---|---|---|
| ABG-UP-01 | PDF direkt hochladen und einem offenen Abgabe-Element zuordnen, das noch keinen öffentlichen Upload hat | Status submitted; Datei und Einreichungszeitpunkt vorhanden; Download-URL verweist auf die interne Datei |
| ABG-UP-02 | Bild direkt hochladen und demselben Typ Abgabe-Element zuordnen | Gleiche Status-, Zeitpunkt- und Dateianzeige wie beim Dokument |
| ABG-UP-03 | Dokument oder Bild einem bereits geschlossenen Element zuordnen | Datei wird angezeigt; Status bleibt closed |
| ABG-UP-04 | Verknüpften Upload mit ausstehender Virenprüfung (pending) lesen |
Datei behält pending; Element zählt in der Quarantäne, nicht als sauber geprüft; bei clean zählt es als freigegeben |
| ABG-UP-05 | Zu einem verknüpften Direkt-Upload eine saubere öffentliche Einreichung desselben Elements hinzufügen | Beide Dateien erscheinen; die Übersicht zählt das Element nur einmal; die saubere Einreichung zählt auch neben einer ausstehenden Prüfung |
| ABG-UP-06 | Dateilimit auf drei setzen, zuerst direkt und dann öffentlich je eine Datei verknüpfen | Nach dem Direkt-Upload bleiben zwei Plätze, danach einer; keine doppelte Anrechnung |
Ergänzend deckt backend/tests/test_submission_service.py offene Elemente ohne
Dateien, öffentliche Einreichungen sowie Schließen und Wiederöffnen ab.
Manuell im Browser prüfen (diese Schritte wurden durch die Backend-Tests nicht ausgeführt):
| ID | Durchführung | Erwartung |
|---|---|---|
| ABG-UP-M1 | Unter „Dateien“ eine PDF mit Abgabe-Bezug hochladen; Abgabe öffnen und Datei herunterladen | Datei erscheint in Detailansicht und Übersicht; heruntergeladener Inhalt entspricht der PDF |
| ABG-UP-M2 | Unter „Fotos“ ein Bild mit Abgabe-Bezug hochladen; Verarbeitung abwarten und Abgabe öffnen | Bild erscheint mit Einreichungszeitpunkt; Download funktioniert |
| ABG-UP-M3 | Eine bereits vor der Änderung verknüpfte Datei in der Abgabe öffnen | Datei und Status werden ohne erneuten Upload berücksichtigt |
| ABG-UP-M4 | Bei einer Datei mit ausstehender Virenprüfung die Abgabe öffnen | Quarantänekennzeichnung sichtbar; kein freigegebener Download angeboten |
Manuelle Prüfungen¶
Diese Punkte sind bewusst nicht automatisiert (Infrastruktur oder Betriebsablauf):
| ID | Durchführung | Erwartung |
|---|---|---|
| LNK-M1 | Update einer bestehenden Installation (alembic upgrade head) |
Jeder Mandant hat einen Standard-Link, alle bisherigen Abgaben sind daran gehängt; alte URLs mit Mandanten-Slug liefern 404 |
| LNK-M2 | Mandant mit eigener, verifizierter Abgabebox-Domain | Die Link-URL im Links-Dialog verwendet diese Domain |
| LNK-M3 | Abgabe im Konfigurator anlegen und bearbeiten | Standard-Link ist bei „Erreichbar über“ vorausgewählt; ohne Auswahl erscheint der Hinweis „nicht erreichbar“; nach Löschen eines Links verschwindet er auch aus dem geöffneten Formular |
| LNK-M4 | Echter Upload über die Abgabebox mit einem Link (mit FriendlyCaptcha oder im Dev-Stack) | Upload gelingt; Datei erscheint in der Abgabe; Upload über einen inzwischen gelöschten Link wird abgewiesen |
| LNK-M5 | Verantwortliche Person zuweisen, Todos synchronisieren, danach Schlüssel erneuern | Todo-Verweis zeigt auf die neue Adresse und öffnet die Abgabe |
Grenzen¶
- Der vollständige Upload über die Abgabebox im Browser ist im Dev-/E2E-Stack durch das
bekannte Hydration-Problem der Captcha-Anbindung blockiert (siehe Kopfkommentar von
frontend/e2e/abgabebox-photo-album-sync.spec.ts). LNK-08 prüft deshalb serverseitig gerenderte Inhalte und Statuscodes; der Upload selbst bleibt LNK-M4. - LNK-07 kann die Mandantentrennung der Link-IDs nicht über die API zeigen, weil der zweite
Arbeitsbereich der E2E-Sitzung nur Leserechte hat; diese Trennung prüft
test_submission_links.pyauf Service-Ebene. - Die Prüfung der Datenbankrechte läuft über
SET ROLEin der Test-Datenbank und ersetzt keine Prüfung der Rechte in einer produktiven Installation.