docs: Test-Plan Kategorie 55 — Architektur-Compliance Tests (Cross-Plugin Imports, Contracts, Plugin-Isolation, Model/Service/Route Dependencies, Hooks, Worker, Middleware, Manifests, DB-Architektur, Frontend-Architektur)
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user