From 063e41e995bf7eae9c5c105cf07db7b439d7470e Mon Sep 17 00:00:00 2001 From: Agent Zero Date: Fri, 21 Aug 2026 21:51:46 +0200 Subject: [PATCH] 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) --- docs/test-plan-complete.md | 198 +++++++++++++++++++++++++++++++++++++ 1 file changed, 198 insertions(+) diff --git a/docs/test-plan-complete.md b/docs/test-plan-complete.md index 99ef50b..625c54d 100644 --- a/docs/test-plan-complete.md +++ b/docs/test-plan-complete.md @@ -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