1085 lines
34 KiB
Markdown
1085 lines
34 KiB
Markdown
|
|
# 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.**
|