34 KiB
LeoCRM — Vollständiger Test-Plan
Erstellt: 2026-08-17 Codebasis: ~230.000 Zeilen Ziel: Jede Komponente testen, jeden Fehler finden, nichts überspringen
Was getestet werden muss
| Schicht | Was | Anzahl | Zeilen |
|---|---|---|---|
| Backend API | Endpoints | 224 | 75.797 |
| Backend Services | Service-Module | 42 | (in app/) |
| Backend Models | SQLAlchemy-Models | 40 | (in app/) |
| Backend Core | Core-Module | 38 | (in app/) |
| Plugins | Built-in Plugins | 25 | (in app/) |
| Migrationen | Alembic-Versionen | 121 | 9.177 |
| Scripts | Python-Scripts | 20 | 4.601 |
| Frontend Seiten | React-Pages | 62 | (in src/) |
| Frontend Komponenten | React-Components | 154 | (in src/) |
| Frontend Stores | Zustand-Stores | 12 | (in src/) |
| Frontend Hooks | Custom Hooks | 11 | (in src/) |
| Frontend API | API-Clients | 48 | (in src/) |
| Existierende Tests | Backend-Tests | 86 | 40.214 |
| Existierende Tests | Frontend-Tests | 79 | 7.369 |
| Existierende Tests | E2E-Tests | 7 | 1.175 |
| Docs | Dokumentation | 18 | 12.484 |
| Config | Docker/Deploy | — | 1.076 |
| Gesamt | ~1.000 Komponenten | ~230.000 |
Phase 1: Backend API — Alle 224 Endpoints testen
1.1 Endpoint-Discovery
- OpenAPI-Spec parsen (
/openapi.json) - Alle Endpoints mit Method, Path, Auth-Requirement extrahieren
- Erwartete Status-Codes pro Endpoint ableiten
1.2 Admin-Test (als is_system_admin=True)
- Login → Session-Cookie holen
- Alle 224 Endpoints aufrufen (GET/POST/PUT/DELETE)
- Für GET: Echte Daten abrufen, 200/404/403 erwartet, nicht 500
- Für POST/PUT/DELETE: Mit minimalen Payloads, 201/200/400/403/404 erwartet, nicht 500
- Alle 500er = Server-Crash → finden und fixen
- Alle 422er = Schema-Mismatch → finden und fixen
1.3 Non-Admin-Test (als normaler User)
- Neuen User erstellen ohne is_system_admin
- Alle 224 Endpoints aufrufen
- 403 erwartet für Admin-Only Endpoints
- 200 erwartet für User-Endpunkte
- 500er = Permission-Resolver-Crash → finden und fixen
1.4 Unauthenticated-Test (ohne Login)
- Alle 224 Endpoints aufrufen
- 401 erwartet für geschützte Endpoints
- 200 erwartet für öffentliche Endpoints (health, login)
- 500er = Auth-Middleware-Crash → finden und fixen
1.5 Plugin-Endpoint-Test
- Alle Plugin-Routes identifizieren (aus Registry)
- Pro Plugin: Alle Routes aufrufen
- Plugin-spezifische Errors finden
Aufwand: ~6h Findet: Alle Backend-Crashes, Import-Fehler, Query-Fehler, Schema-Mismatches
Phase 2: Frontend — Alle 62 Seiten testen
2.1 Route-Discovery
- Router-Config aus
routes/index.tsxparsen - Alle 62 Routes mit Path, Permission-Requirement extrahieren
2.2 Admin-Route-Test (als Admin eingeloggt)
- Login über Browser
- Alle 62 Routes nacheinander laden
- Pro Route prüfen:
#rootnicht leer (keine weiße Seite)- Keine Weiterleitung zu
/kein-zugriff - Keine JS-Console-Errors
- Keine unhandled Promise rejections
- API-Calls erfolgreich (keine 500er in Network-Tab)
2.3 Non-Admin-Route-Test
- Als normaler User einloggen
- Alle 62 Routes laden
- Permission-geschützte Routes → Weiterleitung zu
/kein-zugrifferwartet - Nicht-geschützte Routes → Seite lädt
2.4 Component-Test
- Alle 154 Komponenten identifizieren
- Pro Komponente: Wird sie auf mindestens einer Route gerendert?
- Komponenten die nirgends gerendert werden = tot oder fehlende Integration
2.5 Store-Test
- Alle 12 Stores prüfen:
- Wird der Store initialisiert?
- Werden die Actions aufgerufen?
- Stimmt der State nach API-Calls?
2.6 Hook-Test
- Alle 11 Hooks prüfen:
- Wird der Hook aufgerufen?
- Macht er die erwarteten API-Calls?
- Verarbeitet er die Response korrekt?
Aufwand: ~5h Findet: Alle weißen Seiten, Router-Context-Fehler, fehlende Provider, kaputte Hooks, tote Komponenten
Phase 3: Plugin-System — Alle 25 Plugins testen
3.1 Plugin-Discovery
- Alle 25 Plugins aus Registry holen
- Pro Plugin: Manifest, Routes, Hooks, Services identifizieren
3.2 Plugin-Manifest-Test
- Pro Plugin: Manifest laden über API
- Prüfen: menu_items, page_routes, settings_pages, detail_tabs vorhanden?
- Frontend: Werden Plugin-Menü-Items in Sidebar angezeigt?
3.3 Plugin-Route-Test
- Pro Plugin: Alle Plugin-Routes laden
- Prüfen: Seite rendert, keine 500er, keine weiße Seite
3.4 Plugin-Hook-Test
- Pro Plugin: Alle registrierten Hooks identifizieren
- Trigger auslösen (z.B. contact.after_create)
- Prüfen: Hook wird ausgeführt, kein Crash
3.5 Plugin-Settings-Test
- Pro Plugin: Settings-Seite laden
- Prüfen: Seite rendert, Settings können gespeichert werden
3.6 Plugin-Activation-Test
- Pro Plugin: Deaktivieren → Aktivieren
- Prüfen: Kein Crash, Hooks korrekt registriert/deregistriert
Aufwand: ~4h Findet: Alle Plugin-Verkabelungs-Fehler, fehlende Manifeste, kaputte Hooks
Phase 4: DB-Schema — Alle 126 Tabellen testen
4.1 Schema-vs-Model-Test
- Alle 40 SQLAlchemy-Models laden
- Pro Model: Tabelle existiert in DB?
- Pro Model: Alle Spalten in DB vorhanden?
- Pro Model: Spalten-Typen stimmen überein?
- Pro Model: FKs vorhanden und korrekt?
4.2 RLS-Test
- Pro Tabelle mit tenant_id: RLS-Policy vorhanden?
- Pro Tabelle: Cross-Tenant-Zugriff blockiert?
- Pro Tabelle: Admin-Bypass funktioniert?
4.3 Migration-Integrität
- Alembic current = head?
- Alle 121 Migration-Hashes gültig?
- Downgrade-Test: Letzte Migration zurücknehmen, wieder anwenden
4.4 Seed-Test
- seed_admin.py ausführen → User erstellt?
- seed_default_workspace() → Workspace + Module erstellt?
- Plugin-Schema-Sync → Alle Plugin-Tabellen vorhanden?
Aufwand: ~3h Findet: Alle Schema-Drifts, fehlende Tabellen, RLS-Lücken
Phase 5: Permission-System — Vollständige Matrix
5.1 Permission-Definitionen
- Alle definierten Permissions aus
permissions.pyholen - Alle Plugin-Permissions aus Manifesten holen
- Prüfen: Frontend kennt alle Backend-Permissions?
5.2 Permission-Matrix
- Admin (is_system_admin=True): Alle 224 Endpoints → 200/201/204 erwartet
- Non-Admin mit Rolle "admin" (: Permission): Alle Endpoints → 200/201/204
- Non-Admin ohne Rolle: Geschützte Endpoints → 403
- Guest: Nur Guest-Endpoints → 200, Rest → 403
5.3 Frontend-Permission-Checks
- Alle PermissionRoute-Komponenten identifizieren
- Pro Route: Mit Admin → Seite lädt
- Pro Route: Ohne Permission → Weiterleitung zu /kein-zugriff
5.4 Field-Level-Permissions
- Pro Entity: Field-Permissions testen
- Admin: Alle Felder sichtbar
- Non-Admin: Nur erlaubte Felder sichtbar
Aufwand: ~3h Findet: Alle RBAC-Verkabelungs-Fehler, fehlende Permission-Checks, Field-Level-Bugs
Phase 6: Existierende Tests — Laufen sie überhaupt?
6.1 Backend-Tests (86 Dateien, 40.214 Zeilen)
pytest tests/ -v --tb=shortausführen- Alle Failures dokumentieren
- Prüfen: Sind die Tests korrekt oder ist der Code kaputt?
- Mocks/Fixtures prüfen: Werden Permissions weg-gemockt?
6.2 Frontend-Tests (79 Dateien, 7.369 Zeilen)
npx vitest runausführen- Alle Failures dokumentieren
- Prüfen: Test-Setup korrekt?
6.3 E2E-Tests (7 Dateien, 1.175 Zeilen)
npx playwright testausführen- Alle Failures dokumentieren
- Prüfen: Test-Environment korrekt?
Aufwand: ~2h Findet: Welche Tests wirklich laufen, welche kaputt sind, welche wertlos (gemockt)
Phase 7: Integration — Frontend ↔ Backend Contracts
7.1 API-Response vs Frontend-Erwartung
- Pro Frontend-API-Call: Welche Felder erwartet das Frontend?
- Pro Backend-Endpoint: Welche Felder liefert er?
- Mismatches finden (z.B. is_system_admin fehlt in Login-Response)
7.2 WebSocket-Test
- Comm WebSocket: Connect, Subscribe, Message send/receive
- AI UI Control WebSocket: Connect, Command send/receive
7.3 File-Upload-Test
- DMS: Datei hochladen, herunterladen, löschen
- Mail: Attachment hochladen
- Avatar: Bild hochladen
7.4 Search-Test
- Global Search: Query senden, Ergebnisse prüfen
- Pro Search-Provider: Funktioniert er?
Aufwand: ~3h Findet: Alle Contract-Mismatches, WebSocket-Bugs, Upload-Bugs, Search-Bugs
Phase 8: Deployment & Config
8.1 Docker-Build-Test
docker compose build— funktioniert?docker compose up— starten alle Services?
8.2 prestart.sh-Test
- Alembic migration: Läuft durch?
- DB role passwords: Werden gesetzt?
- sync_plugin_schema: Läuft?
- seed_admin: Läuft und erstellt User + Workspace?
8.3 Health-Check-Test
/api/v1/health→ 200, alle Checks up?- Worker healthcheck → Redis ping?
8.4 Config-Validation
- Alle ENV-Variablen gesetzt?
- SECRET_KEY nicht default?
- Production-Checks in config.py
Aufwand: ~2h Findet: Deploy-Bugs, fehlende ENV-Vars, Seed-Fehler
Phase 9: Scripts (20 Stück, 4.601 Zeilen)
9.1 Script-Ausführung
- Pro Script:
python3 scripts/<name>.py --help— läuft? - Kritische Scripts testen:
- backup.py: Backup erstellen
- restore.py: Restore testen
- sync_plugin_schema.py: Schema sync
- seed_admin.py: Admin seed
- check_migration_hashes.py: Hash validation
- check_indexes.py: Index check
- check_cross_plugin_imports.py: Import check
Aufwand: ~1h Findet: Kaputte Scripts, fehlende Dependencies
Phase 10: Docs-Accuracy (18 Dateien, 12.484 Zeilen)
10.1 API-Docs vs Code
docs/api-documentation.mdvs OpenAPI-Spec — stimmen die Endpoints?
10.2 Deploy-Guide vs Realität
docs/deploy-guide.md— stimmen die Befehle?
10.3 Test-Strategy vs Realität
docs/test-strategy.md— wird sie befolgt?
Aufwand: ~1h Findet: Veraltete/irreführende Dokumentation
Zusammenfassung
| Phase | Was | Aufwand | Findet |
|---|---|---|---|
| 1 | Backend API (224 Endpoints) | 6h | Alle Server-Crashes |
| 2 | Frontend (62 Seiten) | 5h | Alle weißen Seiten |
| 3 | Plugins (25 Stück) | 4h | Alle Plugin-Verkabelungs-Fehler |
| 4 | DB-Schema (126 Tabellen) | 3h | Alle Schema-Drifts |
| 5 | Permissions (Matrix) | 3h | Alle RBAC-Fehler |
| 6 | Existierende Tests (172 Stück) | 2h | Welche Tests wirklich laufen |
| 7 | Integration (Contracts) | 3h | Alle Frontend↔Backend-Mismatches |
| 8 | Deployment & Config | 2h | Alle Deploy-Bugs |
| 9 | Scripts (20 Stück) | 1h | Kaputte Scripts |
| 10 | Docs (18 Dateien) | 1h | Veraltete Docs |
| Gesamt | Alles | ~30h | Vollständige Abdeckung |
Ausführung
Reihenfolge
- Phase 6 zuerst — wissen welche Tests existieren und laufen
- Phase 1 — alle API-Crashes finden
- Phase 2 — alle weißen Seiten finden
- Phase 4 — DB-Schema verifizieren
- Phase 5 — Permission-System verifizieren
- Phase 3 — Plugins testen
- Phase 7 — Integration testen
- Phase 8 — Deployment testen
- Phase 9 — Scripts testen
- Phase 10 — Docs prüfen
Nach jeder Phase
- Alle gefundenen Fehler dokumentieren
- Fehler fixen
- Phase nochmal laufen lassen
- Erst weiter wenn 0 Fehler
Automatisierung
- Phase 1: Python-Script das OpenAPI-Spec parst und alle Endpoints testet
- Phase 2: Playwright-Script das alle Routes lädt
- Phase 3: Python-Script das Plugin-Registry ausliest und testet
- Phase 4: Python-Script das Models vs DB-Schema vergleicht
- Phase 5: Python-Script das Permission-Matrix testet
- Alle Scripts in
scripts/test_*.pyspeichern - CI-Pipeline kann sie automatisch ausführen
Ergebnis
Nach Abschluss dieses Plans:
- Jedes der 224 Endpoints wurde aufgerufen
- Jede der 62 Seiten wurde geladen
- Jedes der 25 Plugins wurde getestet
- Jede der 126 Tabellen wurde verifiziert
- Jede Permission-Kombination wurde getestet
- Jeder existierende Test wurde ausgeführt
- Jeder Frontend↔Backend-Contract wurde geprüft
- Jedes Script wurde ausgeführt
- Jede Doku wurde gegen Code geprüft
Das ist nicht läppisch. Das ist vollständige Abdeckung der Basis-Funktionalität.
Phase 11: Edge Cases & Input Validation
11.1 Leere/Null-Daten
- Alle GET-Listen mit leerer DB → 200,
{items: [], total: 0} - Alle POST mit leeren Pflichtfeldern → 422
- Alle POST mit null-Werten für optionale Felder → 200/201
- Filter/Search mit leerem Query-String → 200, leere Ergebnisse
11.2 Ungültige Inputs
- Ungültige UUIDs → 422 (nicht 500)
- Ungültige Datumsformate → 422
- Ungültige Email-Format → 422
- SQL-Sonderzeichen in Search (
'; DROP TABLE--) → 200, keine Injection - Unicode/Emoji in allen Text-Feldern → 200/201
- Sehr lange Strings (>10.000 Zeichen) → 200/201 oder 422 mit klarer Meldung
- Negative Zahlen für IDs/Counts → 422
11.3 Große Datenmengen
- 10.000 Kontakte erstellen → Performance <5s
- Paginierung: page=1&page_size=1 vs page=10000&page_size=100 → korrekte Ergebnisse
- Bulk-Import mit 5.000 Zeilen → Erfolg oder klarer Fehler
- Datei-Upload 50MB (Limit) → Erfolg
- Datei-Upload 51MB → 413
11.4 Pydantic-Schema-Validation
- Alle Schemas mit falschen Typen testen (String für Integer-Feld, etc.)
- Alle Schemas mit fehlenden Pflichtfeldern
- Alle Schemas mit zusätzlichen unbekannten Feldern (sollten ignoriert oder 422)
- Nested Objects mit falschen Strukturen
Aufwand: ~4h Findet: Alle Input-Validation-Lücken, SQL-Injection-Vektoren, Performance-Bottlenecks
Phase 12: Security & Penetration
12.1 SQL-Injection
- Alle GET-Parameter mit SQL-Injection-Patterns testen
- Alle POST/PUT-Body-Felder mit SQL-Injection-Patterns
- Search-Queries mit Injection-Patterns
- Raw-SQL-Queries im Code identifizieren und prüfen
12.2 XSS
- Alle Text-Eingabefelder mit
<script>alert(1)</script>testen - Prüfen ob Output escaped wird (Frontend + Backend)
- Markdown-Rendering mit XSS-Payloads
- HTML-E-Mail-Anzeige mit XSS-Payloads
- DOMPurify funktioniert in allen Render-Pfaden?
12.3 CSRF
- Alle POST/PUT/DELETE ohne CSRF-Token → 403
- Alle POST/PUT/DELETE mit falschem CSRF-Token → 403
- CSRF-Token-Rotation nach Login
12.4 Path-Traversal
- File-Download mit
../../../etc/passwd→ 404/403 - DMS-Dateipfade mit Traversal-Patterns
- Attachment-Pfade mit Traversal
12.5 RLS-Bypass
- User A kann nicht auf Tenant B Daten zugreifen
- User A kann nicht auf User B's private Daten zugreifen
- Admin-Bypass funktioniert nur mit is_system_admin=True
- RLS-Policies für alle 126 Tabellen mit tenant_id prüfen
12.6 Session-Security
- Session-Cookie: HttpOnly, Secure, SameSite
- Session-Fixation: Session-ID ändert sich nach Login
- Session-Expiry nach TTL
- Concurrent-Session-Limit (falls konfiguriert)
- Logout invalidiert Session in Redis
12.7 File-Upload-Security
- MIME-Type-Validation:
.pyalsimage/jpeg→ abgelehnt - File-Size-Limits enforced
- Filename-Sanitization (keine
../, keine Null-Bytes) - Virus-Scan (falls konfiguriert)
12.8 API-Token-Security
- Token-Erstellung, -Validierung, -Revocation
- Token-Scopes enforced
- Token-Expiry
Aufwand: ~6h Findet: Alle Security-Lücken, Injection-Vektoren, Auth-Bypasses
Phase 13: Data Integrity & Audit
13.1 Soft-Delete
- Alle Entities: DELETE →
deleted_atgesetzt, nicht aus DB entfernt - Alle Listen: Gelöschte Entities nicht sichtbar
?gdpr=true→ Hard-Delete funktioniert- Restore aus Papierkorb funktioniert
13.2 Audit-Log
- Pro Mutation (Create/Update/Delete): Audit-Log-Eintrag erstellt?
- Audit-Log enthält: user_id, action, entity_type, entity_id, changes
- Audit-Log ist immutable (kein Update/Delete möglich)
13.3 Entity-History
- Pro Update: History-Eintrag mit diff erstellt?
- Undo funktioniert (Restore einer vorherigen Version)
- History zeigt korrekte Feld-Änderungen
13.4 FK-Constraints
- Contact löschen → Person wird gelöscht/NULL gesetzt (je nach Config)
- Tenant löschen → Alle Tenant-Daten gelöscht (Cascade)
- Role löschen → UserTenant.role_id wird NULL gesetzt
13.5 Outbox-Reliability
- Mutation → Outbox-Eintrag erstellt
- Worker verarbeitet Outbox-Eintrag
- Bei Fehler: Retry-Logic funktioniert
- Dead-Letter-Queue für fehlgeschlagene Events
Aufwand: ~3h Findet: Alle Data-Integrity-Verletzungen, fehlende Audit-Logs, kaputte FKs
Phase 14: Concurrent & Race Conditions
14.1 Gleichzeitige Edits
- Zwei User editieren gleichen Kontakt gleichzeitig → Optimistic Locking oder Last-Write-Wins
- Zwei User erstellen Kontakt mit gleicher Email → Unique-Constraint oder Dedup
14.2 WebSocket bei mehreren Clients
- Zwei Browser-Tabs gleicher User → Messages synchron?
- Two Users in gleicher Conversation → Real-time Updates?
- WebSocket Reconnect nach Verbindungsabbruch
14.3 Worker-Concurrency
- Mehrere Worker-Instanzen → Cron-Jobs nicht doppelt ausgeführt (Redis-Lock)
- Gleichzeitige Background-Jobs → Keine Deadlocks
14.4 Session-Concurrency
- Login von zwei Geräten → Beide Sessions gültig?
- Logout auf Gerät A → Gerät B noch eingeloggt?
Aufwand: ~3h Findet: Alle Race Conditions, Deadlock-Gefahren, WebSocket-Sync-Issues
Phase 15: Error Recovery & Resilience
15.1 DB-Verbindungsabbruch
- DB kurzzeitig nicht erreichbar → API gibt 503, nicht 500
- DB wieder da → API erholt sich automatisch
- Circuit-Breaker öffnet/schließt korrekt
15.2 Redis-Ausfall
- Redis nicht erreichbar → Sessions funktionieren nicht (klare Fehlermeldung)
- Redis wieder da → Alles normal
- Worker: Redis-Ausfall → Retry, nicht Crash
15.3 Worker-Crash
- Worker stirbt mittendrin → Job wird retryt
- Job schlägt 3x fehl → Dead-Letter oder klarer Fehler
15.4 LLM-Timeout/Error
- LLM-Provider nicht erreichbar → Timeout nach konfigurierten Sekunden
- LLM gibt Fehler → KI-Chat zeigt Fehlermeldung, nicht weiße Seite
- Cost-Tracking funktioniert auch bei Fehlern
15.5 External Service-Ausfall
- SMTP nicht erreichbar → Password-Reset-Email schlägt fehl mit klarer Meldung
- IMAP nicht erreichbar → Mail-Sync schlägt fehl, retryt später
- Forgejo/GitHub Webhook-Empfänger nicht erreichbar → Retry-Logic
Aufwand: ~3h Findet: Alle unhandled Errors, fehlende Circuit-Breaker, Crash-bei-Ausfall-Szenarien
Phase 16: Performance & Scalability
16.1 Response-Zeiten
- Alle 224 Endpoints: Response-Zeit <200ms (mit DB-Daten)
- Listen-Endpoints mit 1.000 Einträgen: <500ms
- Search-Queries: <1s
16.2 N+1 Queries
- Kontakte-Liste lädt nicht pro Kontakt eine separate Query für Companies/Persons
- Plugin-Manifeste: Nicht pro Plugin eine separate Query
- Audit-Log: Nicht pro Eintrag eine separate User-Query
16.3 Memory-Leaks
- Längerer Last-Test (100 Requests/min für 10min) → Memory stabil?
- Frontend: Seitenwechsel 50x → Memory stabil?
16.4 DB-Query-Performance
- EXPLAIN ANALYZE für kritische Queries (Contacts, Mails, Files, Search)
- Fehlende Indexe identifizieren
- Slow-Query-Log aktivieren und auswerten
16.5 Frontend-Bundle-Size
- Bundle-Analyse: Chunks >500kB identifizieren
- Lazy-Loading funktioniert für alle 62 Seiten
- Code-Splitting effektiv?
Aufwand: ~3h Findet: Alle Performance-Bottlenecks, N+1 Queries, Memory-Leaks, fehlende Indexe
Phase 17: Cross-Plugin & Plugin-Lifecycle
17.1 Plugin-Dependencies
- Plugin A deaktivieren während Plugin B von A abhängt → Fehlermeldung
- Plugin A aktivieren bevor Dependency B aktiv ist → Fehlermeldung
- Dependency-Graph korrekt?
17.2 Hook-Ketten
- Contact erstellen → ContactsPlugin Hook → HistoryPlugin Hook → SearchPlugin Hook → AIPlugin Hook
- Alle Hooks werden in korrekter Reihenfolge ausgeführt
- Ein Hook crasht → Andere Hooks laufen trotzdem
17.3 Plugin-Activation/Deactivation
- Alle 25 Plugins: Aktivieren → Hooks registriert, Tabellen erstellt
- Alle 25 Plugins: Deaktivieren → Hooks deregistriert, Tabellen bleiben
- Re-Aktivieren → Hooks wieder registriert, keine Duplikate
17.4 Plugin-Isolation
- Plugin A kann nicht Plugin B's Hooks löschen (clear_actions Bug war P0-3)
- Plugin A kann nicht auf Plugin B's private Tabellen zugreifen
Aufwand: ~3h Findet: Alle Plugin-Dependency-Issues, Hook-Ketten-Fehler, Isolation-Verletzungen
Phase 18: State Management & Frontend Consistency
18.1 Store-Consistency nach API-Fehlern
- API gibt 500 → Store bleibt konsistent (kein halber State)
- API gibt 403 → UI zeigt korrekte Fehlermeldung
- Network-Error → UI zeigt Offline-Banner, Store bleibt konsistent
18.2 State nach Page-Refresh
- Alle 12 Stores: Persistierter State korrekt geladen?
- authStore: User, isAuthenticated, is_system_admin nach Refresh korrekt?
- workspaceStore: Active Workspace nach Refresh korrekt?
- themeStore: Theme nach Refresh korrekt?
18.3 TanStack Query Cache
- Cache invalidation nach Mutations (Create/Update/Delete)
- staleTime korrekt konfiguriert?
- refetchOnWindowFocus disabled (konfiguriert)
- Query-Keys eindeutig?
18.4 Optimistic Updates
- Contact-Edit: UI aktualisiert sofort, rollback bei API-Fehler
- Mail-Send: UI zeigt sofort, rollback bei Fehler
Aufwand: ~2h Findet: Alle State-Inconsistencies, Cache-Bugs, fehlende Rollbacks
Phase 19: Accessibility (a11y)
19.1 ARIA-Attributes
- Alle interaktiven Elemente haben aria-label
- Alle Buttons haben aria-label oder sichtbaren Text
- Alle Form-Inputs haben label
- Navigation hat aria-label
19.2 Keyboard-Navigation
- Tab-Reihenfolge logisch (top-to-bottom, left-to-right)
- Enter auf Button löst Klick aus
- Escape schließt Modals/Dialogs
- Tab-Trapping in Modals
19.3 Touch-Targets
- Alle interaktiven Elemente ≥44px (min-h-touch class)
- Mobile: Keine zu kleinen Buttons
19.4 Screen-Reader
- Skip-to-content Link funktioniert
- Heading-Hierarchie korrekt (h1 → h2 → h3)
- Status-Messages haben role=status oder aria-live
19.5 Color-Contrast
- Alle Text/Background-Kombinationen ≥4.5:1 (WCAG AA)
- Dark-Mode: Contrast korrekt?
Aufwand: ~2h Findet: Alle a11y-Verstöße, fehlende ARIA, Keyboard-Traps
Phase 20: i18n (Internationalisierung)
20.1 Translation-Completeness
- Deutsch: Alle t()-Keys vorhanden? Keine hardcoded Strings?
- Englisch: Alle t()-Keys vorhanden? Keine hardcoded Strings?
- Fallback: Fehlender Key → Fallback auf Deutsch?
20.2 Dynamic-Values
- Interpolation:
{{count}},{{name}}funktionieren in allen Sprachen - Plural-Forms korrekt?
20.3 Date/Number-Formatting
- Datumsformat korrekt pro Locale (de: dd.MM.yyyy, en: MM/dd/yyyy)
- Zahlenformat korrekt (de: 1.234,56, en: 1,234.56)
Aufwand: ~1h Findet: Fehlende Übersetzungen, hardcoded Strings, Formatierungs-Fehler
Phase 21: Backup & Restore
21.1 Full-Backup
scripts/backup.py→ pg_dump + files → Backup erstellt- Backup-Datei gültig (kann restored werden)
- Backup-Retention funktioniert
21.2 Full-Restore
scripts/restore.py→ DB + Files restored- Alle Daten nach Restore korrekt
- RLS-Policies nach Restore intakt
21.3 Partial-Restore
- Nur DB restore → funktioniert
- Nur Files restore → funktioniert
- Restore auf andere DB → funktioniert
21.4 Backup-Schedule
- Cron-Job für regelmäßige Backups konfiguriert?
- Backup-Fehler → Notification
Aufwand: ~2h Findet: Backup/Restore-Bugs, fehlende Schedules
Phase 22: Migration Safety
22.1 Rollback-Test
- Letzte Migration zurücknehmen (
alembic downgrade -1) - Wieder anwenden (
alembic upgrade head) - Daten nach Roundtrip intakt?
22.2 Hash-Validierung
scripts/check_migration_hashes.py→ alle Hashes gültig?- Manuell geänderte Migrationen erkannt?
22.3 Fehlgeschlagene Migration
- Migration simuliert fehlschlagen → DB konsistent?
- Recovery:
alembic stampvsalembic upgrade
22.4 Migration-Order
- Alle 121 Migrationen in korrekter Reihenfolge
- Keine zirkulären Dependencies
- Down-Revisions korrekt
Aufwand: ~2h Findet: Migration-Order-Fehler, kaputte Rollbacks, Hash-Mismatches
Phase 23: Rate Limiting & Circuit Breaker
23.1 Rate-Limiting
- Login: 5 Versuche → Rate-Limit aktiviert
- API: 100 Requests/min → Rate-Limit aktiviert
- Rate-Limit-Reset nach Window
23.2 Circuit-Breaker
- DB: 5 Fehler in 30s → Circuit öffnet
- Circuit offen → API gibt 503, nicht 500
- Nach Cooldown → Circuit schließt, Requests gehen durch
23.3 Retry-Logic
- DB-Retry: 3 Versuche mit Backoff
- LLM-Retry: Konfigurierte Versuche
- Worker-Retry: Failed-Job wird retryt
Aufwand: ~1h Findet: Fehlende Rate-Limits, kaputte Circuit-Breaker, fehlende Retries
Phase 24: Webhooks & External Integration
24.1 Webhook-Delivery
- Webhook registriert → Event ausgelöst → Delivery an externe URL
- Externe URL nicht erreichbar → Retry-Logic
- Webhook-Signatur korrekt
24.2 Forgejo/GitHub-Integration
- Forgejo-Error-Reporter: Fehler werden gemeldet
- GitHub-Actions: CI-Pipeline funktioniert
24.3 MCP-Server/Client
- MCP-Server: Tools verfügbar, ausführbar
- MCP-Client: Server-Config, Connection, Tool-Call
Aufwand: ~2h Findet: Webhook-Delivery-Fehler, fehlende Retries, kaputte Integrationen
Phase 25: Search & AI
25.1 Unified-Search
- Global-Search: Query → Ergebnisse aus allen Providern
- Pro Provider (13 Stück): Funktioniert er?
- Reindexing:
reindex_all→ alle Entities neu indiziert - pgvector: Embeddings korrekt, HNSW-Index funktioniert
25.2 AI-Assistant
- Chat-Session erstellen → Message senden → Antwort erhalten
- Streaming: Token-weise Ausgabe funktioniert
- Cost-Tracking: Kosten pro Request erfasst
- Error-Handling: LLM-Fehler → klare Meldung
25.3 AI-Proactive
- Context-Tracking: Seitenwechsel → Context aktualisiert
- Suggestion-Generation: Vorschläge basierend auf Context
25.4 AI-UI-Control
- WebSocket: Command senden → UI führt Aktion aus
- Navigation, Filter, Modal, Tab, Settings Commands
25.5 Automation & Agents
- Automation erstellen → Trigger auslösen → Action ausführen
- Agent erstellen → Execute → Subtasks → Result
- Dry-Run: Automation ohne echte Ausführung
- Cron-Jobs: Scheduler-Tick funktioniert
Aufwand: ~3h Findet: Alle Search/AI/Automation-Verkabelungs-Fehler
Phase 26: Communication & Collaboration
26.1 Comm-WebSocket
- Connect → Subscribe → Message senden → Message empfangen
- Typing-Indicators
- Read-Receipts
- Message-Blocks (Markdown, HTML, Audio, Video, File, Action-Card, Contact-Card, MiniApp)
- Reconnect nach Verbindungsabbruch
26.2 Conversations
- Create, List, Archive, Pin, Mute
- Direct-Chat zwischen Usern
- System-Channel (Notifications)
- AI-Channel (Assistant)
26.3 Message-Editing
- Message editieren → Edit-History gespeichert
- Message löschen → Soft-Delete
- Reactions auf Messages
Aufwand: ~2h Findet: Alle Comm-Verkabelungs-Fehler, WebSocket-Bugs, Message-Rendering-Issues
Phase 27: Workspace & Tenant
27.1 Workspace-Operations
- Workspace erstellen, bearbeiten, löschen
- Module zuweisen, Sichtbarkeit togglen
- User zuweisen, Rollen vergeben
- Workspace-Switching: Context ändert sich korrekt
27.2 Tenant-Operations
- Tenant erstellen (Multi-Tenant)
- User zu Tenant einladen
- Tenant-Switching: Daten isoliert
- Cross-Tenant-Access: Blockiert durch RLS
27.3 Workspace-Module-Visibility
- Pro Module: Sichtbar in Sidebar?
- Module ohne Permission → ausgeblendet
- Admin sieht alle Module
Aufwand: ~2h Findet: Alle Workspace/Tenant-Isolation-Fehler
Phase 28: Browser Compatibility
28.1 Chrome (aktuell)
- Alle 62 Seiten laden
- Alle Features funktionieren
28.2 Firefox (aktuell)
- Alle 62 Seiten laden
- CSS-Rendering korrekt
28.3 Safari (aktuell)
- Alle 62 Seiten laden
- Datei-Upload funktioniert
- WebSocket funktioniert
28.4 Mobile (Chrome Android / Safari iOS)
- Responsive-Layout korrekt
- Touch-Targets ≥44px
- Mobile-Sidebar (Off-Canvas) funktioniert
- Virtual Keyboard verdeckt nicht Inputs
Aufwand: ~2h Findet: Browser-spezifische Bugs, Mobile-Issues
Phase 29: File Storage & DMS
29.1 File-Operations
- Upload (einzelne Datei, mehrere Dateien, Drag-Drop)
- Download (einzelne Datei, Bulk-Download)
- Rename, Move, Copy
- Delete (Soft-Delete, Hard-Delete mit GDPR)
- Restore aus Papierkorb
29.2 Folder-Operations
- Create, Rename, Move, Delete
- Nested-Folders (5+ Ebenen)
- Folder-Permissions (User, Group)
29.3 Share-Links
- Share-Link erstellen mit Password
- Share-Link mit Expiry-Date
- Public-Access über Share-Link
- Share-Link revoken
29.4 Storage-Limits
- Max-File-Size enforced
- Storage-Quota (falls konfiguriert)
- Cleanup verwaister Dateien
Aufwand: ~2h Findet: Alle DMS/File-Storage-Bugs
Phase 30: Mail System
30.1 Mail-Accounts
- IMAP-Account hinzufügen, testen, synchronisieren
- SMTP-Account konfigurieren
- Shared vs Personal Accounts
- Account löschen → Mails bleiben oder werden gelöscht
30.2 Mail-Operations
- Mail empfangen, lesen, als gelesen/ungelesen markieren
- Mail senden (mit/ohne Attachments)
- Reply, Reply-All, Forward
- Flag, Move, Delete, Restore
- Search in Mails
30.3 Mail-Rules
- Rule erstellen (Condition → Action)
- Rule ausführen auf neue Mails
- Rule löschen
30.4 Mail-Labels
- Label erstellen, zuweisen, entfernen
- Filter nach Labels
30.5 Mail-Signatures
- Signature erstellen, als Default setzen
- Signature in neuer Mail eingefügt
30.6 Vacation-Responder
- Aktivieren, konfigurieren, deaktivieren
- Auto-Response wird gesendet
30.7 PGP-Verschlüsselung
- Key importieren
- Mail verschlüsseln/entschlüsseln
- Contact-PGP-Key speichern
Aufwand: ~3h Findet: Alle Mail-System-Bugs
Vollständige Zusammenfassung (alle 30 Phasen)
| Phase | Was | Aufwand |
|---|---|---|
| 1 | Backend API (224 Endpoints) | 6h |
| 2 | Frontend (62 Seiten, 154 Komponenten, 12 Stores, 11 Hooks) | 5h |
| 3 | Plugins (25 Stück) | 4h |
| 4 | DB-Schema (126 Tabellen, 40 Models) | 3h |
| 5 | Permissions (Matrix, Field-Level) | 3h |
| 6 | Existierende Tests (172 Stück) | 2h |
| 7 | Integration (Contracts, WebSocket, Upload, Search) | 3h |
| 8 | Deployment & Config | 2h |
| 9 | Scripts (20 Stück) | 1h |
| 10 | Docs (18 Dateien) | 1h |
| 11 | Edge Cases & Input Validation | 4h |
| 12 | Security & Penetration | 6h |
| 13 | Data Integrity & Audit | 3h |
| 14 | Concurrent & Race Conditions | 3h |
| 15 | Error Recovery & Resilience | 3h |
| 16 | Performance & Scalability | 3h |
| 17 | Cross-Plugin & Lifecycle | 3h |
| 18 | State Management & Consistency | 2h |
| 19 | Accessibility | 2h |
| 20 | i18n | 1h |
| 21 | Backup & Restore | 2h |
| 22 | Migration Safety | 2h |
| 23 | Rate Limiting & Circuit Breaker | 1h |
| 24 | Webhooks & External Integration | 2h |
| 25 | Search & AI & Automation | 3h |
| 26 | Communication & Collaboration | 2h |
| 27 | Workspace & Tenant | 2h |
| 28 | Browser Compatibility | 2h |
| 29 | File Storage & DMS | 2h |
| 30 | Mail System | 3h |
| Gesamt | Vollständige Abdeckung | ~80h |
Ausführung
Reihenfolge (angepasst)
- Phase 6 — Existierende Tests ausführen
- Phase 1 — Alle 224 API-Endpoints
- Phase 2 — Alle 62 Frontend-Seiten
- Phase 4 — DB-Schema verifizieren
- Phase 5 — Permission-Matrix
- Phase 12 — Security (früh, weil kritisch)
- Phase 3 — Plugins testen
- Phase 7 — Integration
- Phase 11 — Edge Cases
- Phase 13 — Data Integrity
- Phase 15 — Error Recovery
- Phase 16 — Performance
- Phase 17 — Cross-Plugin
- Phase 18 — State Management
- Phase 14 — Concurrent
- Phase 8 — Deployment
- Phase 21 — Backup/Restore
- Phase 22 — Migration Safety
- Phase 23 — Rate Limiting
- Phase 24 — Webhooks
- Phase 25 — Search & AI
- Phase 26 — Communication
- Phase 27 — Workspace & Tenant
- Phase 29 — File Storage & DMS
- Phase 30 — Mail System
- Phase 19 — Accessibility
- Phase 20 — i18n
- Phase 28 — Browser Compatibility
- Phase 9 — Scripts
- Phase 10 — Docs
Nach jeder Phase
- Alle gefundenen Fehler in
docs/test-results/phase-XX.mddokumentieren - Fehler fixen
- Phase nochmal laufen lassen
- Erst weiter wenn 0 Fehler
Automatisierung
- Phase 1:
scripts/test_all_endpoints.py— OpenAPI-Spec parsen, alle Endpoints testen - Phase 2:
scripts/test_all_routes.py— Playwright, alle Routes laden - Phase 3:
scripts/test_all_plugins.py— Plugin-Registry, Manifeste, Routes - Phase 4:
scripts/test_schema_vs_models.py— Models vs DB-Schema - Phase 5:
scripts/test_permission_matrix.py— Permission-Matrix - Phase 11:
scripts/test_edge_cases.py— Edge-Case-Payloads - Phase 12:
scripts/test_security.py— Security-Scans - Phase 16:
scripts/test_performance.py— Performance-Benchmarks - Alle Scripts in
scripts/test_*.pyspeichern - CI-Pipeline kann sie automatisch ausführen
Ergebnis nach Abschluss
- Jedes der 224 Endpoints wurde mit gültigen/ungültigen/leeren/bösartigen Inputs getestet
- Jede der 62 Seiten wurde in Chrome geladen und auf JS-Errors geprüft
- Jedes der 25 Plugins wurde aktiviert/deaktiviert und getestet
- Jede der 126 Tabellen wurde gegen Models validiert
- Jede Permission-Kombination (Admin/Non-Admin/Guest/Unauth) wurde getestet
- Jeder der 172 existierenden Tests wurde ausgeführt
- Jeder Frontend↔Backend-Contract wurde geprüft
- Jedes Script wurde ausgeführt
- Jede Doku wurde gegen Code geprüft
- Security: SQL-Injection, XSS, CSRF, Path-Traversal, RLS-Bypass, Session getestet
- Performance: Response-Zeiten, N+1 Queries, Memory-Leaks getestet
- Resilience: DB/Redis/Worker/LLM-Ausfall getestet
- Accessibility: ARIA, Keyboard, Touch-Targets, Contrast getestet
- i18n: Alle Übersetzungen, alle Sprachen getestet
- Backup/Restore: Vollständiger Cycle getestet
- Migration: Rollback, Hash-Validierung getestet
- Browser: Chrome, Firefox, Safari, Mobile getestet
- Mail: Kompletter Mail-Cycle getestet
- DMS: Kompletter File-Cycle getestet
- Communication: WebSocket, Messages, Blocks getestet
- AI: Chat, Streaming, Cost-Tracking, Automation, Agents getestet
30 Phasen. ~80 Stunden. Vollständige Abdeckung. Nichts übersprungen.