docs: Test-Plan erweitert auf 85 Kategorien (+30 Architektur-Fehler-Tests: Circular Deps, Dead Code, Layer Violations, God Objects, Duplikate, Tenant-Isolation, Indexes, N+1, Error-Handling, Validierung, Hardcoded, Type Hints, Async/Sync, Audit, Soft-Delete, SQL Injection, CSRF, Rate-Limit, Error-Boundaries, i18n, Constraints, Orphans, Trigger, Plugin Lifecycle, Migrationen, Response-Formate, OpenAPI, Dependencies, Query-Performance)
This commit is contained in:
@@ -1091,6 +1091,204 @@
|
||||
|
||||
---
|
||||
|
||||
## 56. Zirkuläre Abhängigkeiten (Circular Dependencies)
|
||||
- [ ] Python: Module A importiert Module B, Module B importiert Module A → Endlosschleife
|
||||
- [ ] Services die sich gegenseitig importieren
|
||||
- [ ] Models die sich gegenseitig referenzieren (ohne string-based FK)
|
||||
- [ ] Frontend: Components die sich gegenseitig importieren
|
||||
- [ ] Prüfung: `pydeps` oder `pycycle` für Python, `madge` für Frontend
|
||||
|
||||
## 57. Tote Code-Erkennung (Dead Code)
|
||||
- [ ] Python-Module die von niemandem importiert werden
|
||||
- [ ] Funktionen/Methoden die nie aufgerufen werden
|
||||
- [ ] Frontend-Components die nie verwendet werden (von 169 Components)
|
||||
- [ ] Frontend-API-Clients die nie aufgerufen werden (von 52 Clients)
|
||||
- [ ] Frontend-Stores die nie verwendet werden (von 19 Stores)
|
||||
- [ ] Frontend-Hooks die nie verwendet werden (von 11 Hooks)
|
||||
- [ ] Routes die im Frontend nie verlinkt sind
|
||||
- [ ] Prüfung: `vulture` (Python), `knip` (Frontend)
|
||||
|
||||
## 58. Layer-Verletzungen (Layer Violations)
|
||||
- [ ] Routes importieren aus anderen Routes (sollten über Services gehen)
|
||||
- [ ] Services importieren aus Routes (sollte nie passieren)
|
||||
- [ ] Models importieren aus Services (sollte nie passieren)
|
||||
- [ ] Models importieren aus Routes (sollte nie passieren)
|
||||
- [ ] Schemas importieren aus Services (sollte nie passieren)
|
||||
- [ ] Core importiert aus Plugins (sollte nie passieren)
|
||||
- [ ] Prüfung: Statische Analyse der Import-Richtung
|
||||
|
||||
## 59. God Objects / Zu große Dateien
|
||||
- [ ] Python-Dateien > 500 Zeilen → aufteilen
|
||||
- [ ] Frontend-Dateien > 500 Zeilen → aufteilen
|
||||
- [ ] Klassen mit > 20 Methoden → aufteilen
|
||||
- [ ] Funktionen mit > 50 Zeilen → refactoren
|
||||
- [ ] Prüfung: `wc -l` für alle Dateien, sortiert nach Größe
|
||||
|
||||
## 60. Duplikate Code-Erkennung
|
||||
- [ ] Python: Gleiche Logik in mehreren Services → Base-Service erstellen
|
||||
- [ ] Frontend: Gleiche Components mit leicht unterschiedlichen Props → vereinheitlichen
|
||||
- [ ] Gleiche CRUD-Logik in mehreren Plugins → Generic CRUD Base nutzen
|
||||
- [ ] Gleiche Permission-Checks in mehreren Routes → Dependency nutzen
|
||||
- [ ] Prüfung: `flake8-duplicates`, `jscpd` (Frontend)
|
||||
|
||||
## 61. Fehlende Tenant-Isolation
|
||||
- [ ] Tabellen die tenant_id haben sollten aber nicht haben
|
||||
- [ ] Queries die nicht nach tenant_id filtern
|
||||
- [ ] Routes die `set_tenant_context()` nicht aufrufen
|
||||
- [ ] Background-Jobs die tenant_id nicht setzen
|
||||
- [ ] Prüfung: SQL-Scan aller Queries auf tenant_id Filter
|
||||
|
||||
## 62. Fehlende Indexes
|
||||
- [ ] Foreign Key Spalten ohne Index → langsame JOINs
|
||||
- [ ] Häufig gefilterte Spalten ohne Index → langsame Queries
|
||||
- [ ] tenant_id Spalten ohne Index → langsame RLS-Queries
|
||||
- [ ] Prüfung: `scripts/check_indexes.py` gegen Produktion
|
||||
|
||||
## 63. N+1 Query Problemen
|
||||
- [ ] Routes die in einer Schleife Queries ausführen
|
||||
- [ ] List-Endpoints die pro Item eine weitere Query machen
|
||||
- [ ] Frontend das pro List-Item einen API-Call macht
|
||||
- [ ] Prüfung: SQLAlchemy `echo=True` + Query-Count pro Request
|
||||
|
||||
## 64. Fehlende Error-Handling
|
||||
- [ ] Routes ohne try/except bei externen Calls (IMAP, AI, File-IO)
|
||||
- [ ] Services die Exceptions verschlucken (bare except)
|
||||
- [ ] Background-Jobs ohne Error-Handling → Worker crasht
|
||||
- [ ] Frontend ohne ErrorBoundary → weiße Seite bei JS-Fehler
|
||||
- [ ] Prüfung: Statische Analyse + manuelle Code-Durchsicht
|
||||
|
||||
## 65. Fehlende Validierung
|
||||
- [ ] Routes die Input nicht mit Pydantic validieren
|
||||
- [ ] Schemas die keine Field-Constraints haben (min_length, max_length, regex)
|
||||
- [ ] Frontend-Forms ohne Zod-Validierung
|
||||
- [ ] File-Uploads ohne MIME-Type-Check
|
||||
- [ ] Prüfung: OpenAPI Schema auf fehlende Validierung prüfen
|
||||
|
||||
## 66. Hardcoded Values
|
||||
- [ ] Hardcoded URLs (sollten env vars sein)
|
||||
- [ ] Hardcoded Datenbank-Verbindungen
|
||||
- [ ] Hardcoded API-Keys/Secrets
|
||||
- [ ] Hardcoded Limits (pagination, rate limit)
|
||||
- [ ] Magic Numbers ohne Konstanten
|
||||
- [ ] Prüfung: `grep -rn 'http://\|https://\|localhost\|127.0.0.1' app/ --include='*.py'`
|
||||
|
||||
## 67. Fehlende Type Hints
|
||||
- [ ] Python-Funktionen ohne Return-Type-Hints
|
||||
- [ ] Python-Funktionen ohne Parameter-Type-Hints
|
||||
- [ ] Frontend: `any` Types verwenden
|
||||
- [ ] Frontend: Missing TypeScript interfaces
|
||||
- [ ] Prüfung: `mypy` (Python), `tsc --noEmit` (Frontend)
|
||||
|
||||
## 68. Async/Sync Mixing
|
||||
- [ ] Sync I/O in async Functions (z.B. `open()` statt `aiofiles.open()`)
|
||||
- [ ] `time.sleep()` in async Functions (sollte `asyncio.sleep()` sein)
|
||||
- [ ] Sync DB-Queries in async Routes
|
||||
- [ ] Blocking calls in Event Loop
|
||||
- [ ] Prüfung: `grep -rn 'time.sleep\|open(\|requests.get' app/ --include='*.py'`
|
||||
|
||||
## 69. Fehlende Audit-Logs
|
||||
- [ ] POST/PATCH/DELETE Routes die keinen Audit-Log erstellen
|
||||
- [ ] Bulk-Operationen die nicht auditiert werden
|
||||
- [ ] Background-Jobs die nicht auditiert werden
|
||||
- [ ] Prüfung: Audit-Log nach CRUD-Operation prüfen
|
||||
|
||||
## 70. Fehlende Soft-Delete
|
||||
- [ ] DELETE Routes die hard-delete machen ohne `?gdpr=true`
|
||||
- [ ] Models ohne `deleted_at` Spalte
|
||||
- [ ] Queries die `deleted_at IS NOT NULL` nicht filtern
|
||||
- [ ] Prüfung: DELETE ausführen → prüfen ob deleted_at gesetzt wurde
|
||||
|
||||
## 71. SQL Injection Risiken
|
||||
- [ ] Raw SQL Queries ohne Parameterisierung
|
||||
- [ ] `f-string` SQL Queries
|
||||
- [ ] User-Input direkt in SQL verwendet
|
||||
- [ ] Prüfung: `grep -rn 'execute(.*f"\|execute(.*+\|text(' app/ --include='*.py'`
|
||||
|
||||
## 72. Fehlende CSRF-Protection
|
||||
- [ ] POST/PUT/PATCH/DELETE Routes ohne CSRF-Dependency
|
||||
- [ ] Webhook-Endpoints ohne CSRF (sollten Token-basiert sein)
|
||||
- [ ] Prüfung: POST ohne X-CSRF-Token → sollte 403 geben
|
||||
|
||||
## 73. Fehlende Rate-Limiting
|
||||
- [ ] AI Streaming ohne Rate-Limit → Kostenschutz
|
||||
- [ ] Login ohne Rate-Limit → Brute-Force möglich
|
||||
- [ ] File-Upload ohne Rate-Limit → DoS möglich
|
||||
- [ ] Search ohne Rate-Limit → DoS möglich
|
||||
- [ ] Prüfung: Rate-Limit überschreiten → sollte 429 geben
|
||||
|
||||
## 74. Frontend: Unbenutzte Abhängigkeiten
|
||||
- [ ] npm-Packages die nicht mehr verwendet werden
|
||||
- [ ] Python-Packages die nicht mehr verwendet werden
|
||||
- [ ] Prüfung: `npm prune`, `pip-audit`
|
||||
|
||||
## 75. Frontend: Fehlende Error-Boundaries
|
||||
- [ ] Jede Page hat ErrorBoundary
|
||||
- [ ] Jede Page hat Loading-State (Skeleton)
|
||||
- [ ] Jede Page hat Empty-State (EmptyState Component)
|
||||
- [ ] Jede Page hat Error-State (Fehlermeldung)
|
||||
- [ ] Prüfung: Browser-Test: Network-Error simulieren
|
||||
|
||||
## 76. Frontend: Fehlende i18n
|
||||
- [ ] Hardcoded deutsche Strings ohne `t()`
|
||||
- [ ] Hardcoded englische Strings ohne `t()`
|
||||
- [ ] Fehlende Übersetzungen in `locales/de.json` oder `locales/en.json`
|
||||
- [ ] Prüfung: `grep -rn '"[A-Z][a-z].*[a-z]"' frontend/src/ --include='*.tsx' | grep -v 't(\|import\|export\|const\|type\|interface'`
|
||||
|
||||
## 77. Datenbank: Fehlende Constraints
|
||||
- [ ] Spalten die NOT NULL sein sollten aber nullable sind
|
||||
- [ ] Spalten die UNIQUE sein sollten aber nicht sind
|
||||
- [ ] CHECK-Constraints fehlen (z.B. status IN ('open','done'))
|
||||
- [ ] Prüfung: Schema-Analyse aller Tabellen
|
||||
|
||||
## 78. Datenbank: Orphaned Records
|
||||
- [ ] Records mit Foreign Key der auf nicht existierende Records zeigt
|
||||
- [ ] Records ohne tenant_id (sollten nicht existieren)
|
||||
- [ ] Soft-deleted Records die noch in Queries auftauchen
|
||||
- [ ] Prüfung: SQL-Queries für Daten-Integrität
|
||||
|
||||
## 79. Datenbank: Fehlende Trigger
|
||||
- [ ] `updated_at` wird nicht auto-updatet bei UPDATE
|
||||
- [ ] `search_tsv` wird nicht auto-updatet bei INSERT/UPDATE
|
||||
- [ ] Prüfung: Record updaten → prüfen ob updated_at sich ändert
|
||||
|
||||
## 80. Plugin: Fehlende on_deactivate
|
||||
- [ ] Plugins die Hooks registrieren aber nicht deregistrieren
|
||||
- [ ] Plugins die Background-Jobs starten aber nicht stoppen
|
||||
- [ ] Plugins die WebSocket-Verbindungen öffnen aber nicht schließen
|
||||
- [ ] Prüfung: Plugin aktivieren → deaktivieren → prüfen ob alles cleanuppt wurde
|
||||
|
||||
## 81. Plugin: Fehlende Migrationen
|
||||
- [ ] Plugins mit Models aber ohne Migration-Dateien
|
||||
- [ ] Migration-Dateien die nicht zum Model-Schema passen
|
||||
- [ ] Prüfung: `alembic check` + Model-Schema vergleichen
|
||||
|
||||
## 82. API: Inkonsistente Response-Formate
|
||||
- [ ] List-Endpoints: manche return Array, manche return {items: [...]}
|
||||
- [ ] Error-Responses: manche haben {detail: "..."}, manche {code, detail, field}
|
||||
- [ ] Success-Responses: manche return Entity, manche return {data: Entity}
|
||||
- [ ] Prüfung: Alle Endpunkte durchgehen und Response-Struktur vergleichen
|
||||
|
||||
## 83. API: Fehlende OpenAPI-Dokumentation
|
||||
- [ ] Endpunkte ohne Beschreibung (`description` field)
|
||||
- [ ] Endpunkte ohne Response-Beispiele
|
||||
- [ ] Endpunkte ohne Error-Codes dokumentiert
|
||||
- [ ] Schemas ohne Beispiele
|
||||
- [ ] Prüfung: `GET /openapi.json` analysieren
|
||||
|
||||
## 84. Security: Dependency Vulnerabilities
|
||||
- [ ] Python: `pip-audit` → bekannte Vulnerabilities
|
||||
- [ ] Frontend: `npm audit` → bekannte Vulnerabilities
|
||||
- [ ] Veraltete Dependencies → Update verfügbar
|
||||
- [ ] Prüfung: `pip-audit` und `npm audit` ausführen
|
||||
|
||||
## 85. Performance: Query-Analyse
|
||||
- [ ] Langsame Queries (> 100ms) identifizieren
|
||||
- [ ] Full Table Scans identifizieren
|
||||
- [ ] Queries ohne Index-Nutzung
|
||||
- [ ] Prüfung: `EXPLAIN ANALYZE` auf häufige Queries
|
||||
|
||||
---
|
||||
|
||||
## Ausführungs-Reihenfolge
|
||||
|
||||
1. Smoke Tests (1.) — schnell, prüft ob System läuft
|
||||
|
||||
Reference in New Issue
Block a user