Files
leocrm/TEST_PLAN.md
T

1085 lines
34 KiB
Markdown
Raw Normal View History

# 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.tsx` parsen
- 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:
- `#root` nicht 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-zugriff` erwartet
- 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.py` holen
- 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=short` ausfü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 run` ausführen
- Alle Failures dokumentieren
- Prüfen: Test-Setup korrekt?
### 6.3 E2E-Tests (7 Dateien, 1.175 Zeilen)
- `npx playwright test` ausfü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.md` vs 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
1. Phase 6 zuerst — wissen welche Tests existieren und laufen
2. Phase 1 — alle API-Crashes finden
3. Phase 2 — alle weißen Seiten finden
4. Phase 4 — DB-Schema verifizieren
5. Phase 5 — Permission-System verifizieren
6. Phase 3 — Plugins testen
7. Phase 7 — Integration testen
8. Phase 8 — Deployment testen
9. Phase 9 — Scripts testen
10. 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_*.py` speichern
- 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: `.py` als `image/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_at` gesetzt, 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 stamp` vs `alembic 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)
1. Phase 6 — Existierende Tests ausführen
2. Phase 1 — Alle 224 API-Endpoints
3. Phase 2 — Alle 62 Frontend-Seiten
4. Phase 4 — DB-Schema verifizieren
5. Phase 5 — Permission-Matrix
6. Phase 12 — Security (früh, weil kritisch)
7. Phase 3 — Plugins testen
8. Phase 7 — Integration
9. Phase 11 — Edge Cases
10. Phase 13 — Data Integrity
11. Phase 15 — Error Recovery
12. Phase 16 — Performance
13. Phase 17 — Cross-Plugin
14. Phase 18 — State Management
15. Phase 14 — Concurrent
16. Phase 8 — Deployment
17. Phase 21 — Backup/Restore
18. Phase 22 — Migration Safety
19. Phase 23 — Rate Limiting
20. Phase 24 — Webhooks
21. Phase 25 — Search & AI
22. Phase 26 — Communication
23. Phase 27 — Workspace & Tenant
24. Phase 29 — File Storage & DMS
25. Phase 30 — Mail System
26. Phase 19 — Accessibility
27. Phase 20 — i18n
28. Phase 28 — Browser Compatibility
29. Phase 9 — Scripts
30. Phase 10 — Docs
### Nach jeder Phase
- Alle gefundenen Fehler in `docs/test-results/phase-XX.md` dokumentieren
- 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_*.py` speichern
- 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.**