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:
Agent Zero
2026-08-21 21:51:46 +02:00
parent 00edc43e5c
commit 063e41e995
+198
View File
@@ -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