diff --git a/docs/test-plan-complete.md b/docs/test-plan-complete.md index a7cea08..99ef50b 100644 --- a/docs/test-plan-complete.md +++ b/docs/test-plan-complete.md @@ -993,6 +993,104 @@ --- +## 55. Architektur-Compliance Tests + +### 55.1 Cross-Plugin Import Check +- [ ] Kein Plugin importiert direkt aus einem anderen Plugin (außer über Contracts) +- [ ] `scripts/check_cross_plugin_imports.py` läuft clean (0 violations) +- [ ] wiki/plugin.py: Cross-Plugin Imports aus unified_search entfernen → Contracts verwenden +- [ ] Alle 25 Plugins auf direkte Imports aus anderen Plugins prüfen +- [ ] Plugin-Deaktivierung: Wenn Plugin A deaktiviert wird, darf Plugin B nicht crashen + +### 55.2 Contract-Verwendung +- [ ] Jedes Plugin das mit anderen Plugins kommuniziert, nutzt Contracts +- [ ] `get_contract("plugin_name")` wird verwendet statt direkter Imports +- [ ] Contracts sind in `app/plugins/builtins/contracts.py` definiert +- [ ] Contract-Functions haben type hints und docstrings +- [ ] Contract-Versionierung: Wenn sich ein Contract ändert, wird die Version erhöht + +### 55.3 Plugin-Isolation +- [ ] Jedes Plugin kann unabhängig aktiviert/deaktiviert werden +- [ ] Plugin-Deaktivierung entfernt alle Routes, Models, Hooks +- [ ] Plugin-Reaktivierung stellt alles wieder her +- [ ] Kein Plugin hat Hard-Dependencies auf andere Plugins (außer über Contracts) +- [ ] Plugin-Migration-Runner läuft isoliert pro Plugin + +### 55.4 Model-Abhängigkeiten +- [ ] Kein Model importiert aus einem anderen Plugin-Model +- [ ] Foreign Keys zwischen Plugin-Tabellen gehen über Core-Tabellen (nicht direkt) +- [ ] Model-Tabellen haben tenant_id (TenantMixin) +- [ ] Model-Tabellen haben owner_id (OwnedMixin) wo erforderlich +- [ ] Keine zirkulären Model-Abhängigkeiten + +### 55.5 Service-Abhängigkeiten +- [ ] Services importieren nicht aus Plugin-Modulen (nur aus Core und eigenen Plugin) +- [ ] Services haben keine zirkulären Abhängigkeiten +- [ ] Services nutzen Dependency Injection (FastAPI Depends) +- [ ] Services sind async (keine sync I/O in async Routes) + +### 55.6 Route-Abhängigkeiten +- [ ] Routes nutzen `require_permission` Dependency für Auth +- [ ] Routes nutzen `get_current_user` Dependency für User-Context +- [ ] Routes nutzen `get_db` Dependency für DB-Session +- [ ] Routes validieren Input mit Pydantic Schemas +- [ ] Routes erstellen Audit-Log-Einträge bei Mutationen +- [ ] Routes haben korrekte HTTP-Status-Codes (200/201/204/400/403/404/422/500) + +### 55.7 Hook-Registrierung +- [ ] Alle Hooks sind in `plugin.py on_activate` registriert +- [ ] Hooks werden in `on_deactivate` deregistriert +- [ ] Hook-Namen sind eindeutig (keine Namens-Kollisionen zwischen Plugins) +- [ ] Hooks haben korrekte Signaturen (async, korrekte Parameter) + +### 55.8 ARQ Worker-Registrierung +- [ ] Alle Background-Jobs sind in `worker.py` registriert +- [ ] Job-Namen sind eindeutig +- [ ] Jobs haben retry-logic konfiguriert +- [ ] Jobs sind async +- [ ] Job-Queue wird korrekt verarbeitet + +### 55.9 Middleware-Kette +- [ ] CORS Middleware korrekt konfiguriert +- [ ] CSRF Middleware korrekt konfiguriert +- [ ] Security Headers Middleware korrekt konfiguriert +- [ ] Rate Limit Middleware korrekt konfiguriert +- [ ] Request Logging Middleware korrekt konfiguriert +- [ ] Circuit Breaker Middleware korrekt konfiguriert +- [ ] Middleware-Reihenfolge ist korrekt + +### 55.10 Plugin-Manifest-Validierung +- [ ] Jedes Plugin hat ein gültiges `manifest.py` +- [ ] Manifest hat: name, version, description, author, dependencies +- [ ] Manifest-Dependencies sind erfüllt (abhängige Plugins sind aktiv) +- [ ] Manifest-Version folgt Semantic Versioning +- [ ] Plugin-Signature ist validiert (falls Signature-Checking aktiv) + +### 55.11 Datenbank-Architektur +- [ ] Alle Tabellen haben `tenant_id` (außer System-Tabellen) +- [ ] Alle Tabellen haben `created_at` und `updated_at` +- [ ] Alle Tabellen haben `deleted_at` (Soft-Delete) +- [ ] UUID Primary Keys (keine Integer Auto-Increment) +- [ ] TIMESTAMPTZ (keine naive datetime) +- [ ] JSONB für flexible Felder (metadata, config, applicable_to) +- [ ] RLS Policies auf allen Tenant-Tabellen +- [ ] Indexes auf häufig gefilterten Spalten +- [ ] Foreign Keys mit ON DELETE CASCADE wo appropriate + +### 55.12 Frontend-Architektur +- [ ] Keine Class Components (nur Functional Components) +- [ ] Keine inline Styles (nur Tailwind) +- [ ] Keine hardcoded Strings (nur `t()` i18n) +- [ ] Keine `any` Types (TypeScript strict) +- [ ] Keine manual fetch/axios (nur TanStack Query) +- [ ] Keine Server-Data in Zustand (nur Client-State) +- [ ] Keine `dangerouslySetInnerHTML` ohne Sanitization +- [ ] ARIA Attributes auf allen interaktiven Elementen +- [ ] Touch Targets ≥ 44px +- [ ] React Hook Form + Zod für alle Forms + +--- + ## Ausführungs-Reihenfolge 1. Smoke Tests (1.) — schnell, prüft ob System läuft