# Vorbestehende Test-Suite-Fehler (Diagnose) **Datum:** 2026-06-11 **Branch bei Aufnahme:** `payment/phase-r-payone-refactoring` **Status:** Nur dokumentiert — keine Codeänderung vorgenommen. ## Ausgangslage `php artisan test --compact` meldet aktuell **93 failed, 1 skipped, 448 passed**. Diese Fehler sind **nicht** durch die Abo-„Extern erledigt"-Funktion oder durch diesen Branch verursacht. ### Beweis, dass die Fehler von `master` geerbt sind - Der einzige test-relevante Commit dieses Branches (`8593dbe`, Payment Phase R) ändert an `phpunit.xml` nur **eine** Zeile: `PAYONE_KEY_HASH` (DB-Config unberührt). - `DB_DATABASE=":memory:"` mit `force="true"` steht bereits auf `master`. - Legacy-Factory `database/factories/UserFactory.php` (`$factory->define`) und alle betroffenen Testdateien existieren unverändert bereits auf `master`. - Gegenprobe per `git stash`: dasselbe Test-Subset scheitert mit und ohne die Änderungen dieses Branches identisch. ## Vier unabhängige Ursachen ### 1. Legacy-Factories + fehlendes `HasFactory` (~20 Tests) - **Symptom:** `Call to undefined method App\User::factory()` - **Ursache:** `App\User` nutzt das `HasFactory`-Trait nicht; `UserFactory.php` ist im alten `$factory->define()`-Stil (Laravel ≤6) statt klassenbasiert (`extends Factory`). Die Tests rufen die neue API `User::factory()`. - **Betroffen:** `Unit/BusinessPlan/BusinessUserItemOptimizedTest`, `Unit/BusinessPlan/BusinessUserRepositoryTest`, Teile von `Unit/Incentive/IncentiveTrackerTest`. - **Fix (sicher, hoher Hebel):** `App\User` → `use HasFactory` + `newFactory()` (nötig, weil das Model unter `App\` statt `App\Models\` liegt); `UserFactory` auf `class UserFactory extends Factory { protected $model = \App\User::class; … }` umstellen. ### 2. `DatabaseTransactions` auf `:memory:`-SQLite (~32 Tests) - **Symptom:** `SQLSTATE … no such table: settings` (o. ä.) - **Ursache:** Das Trait `DatabaseTransactions` führt **keine** Migrationen aus, sondern setzt ein bereits migriertes Schema voraus. Bei `:memory:` startet jede Connection leer → Tabellen fehlen. (`RefreshDatabase`-Tests migrieren und laufen daher grün.) - **Betroffen:** `Unit/Services/InvoiceServiceTest`, `Feature/Payment/ConcurrentPaymentTest`, `Feature/Payment/PayoneRaceConditionTest`. - **Fix (Entscheidung nötig):** entweder Trait auf `RefreshDatabase` umstellen, **oder** Test-DB-Strategie ändern (persistente, vorab migrierte SQLite-Datei statt `:memory:`). Architekturentscheidung — Race-Condition-/Concurrency-Tests können bewusst eine persistente DB erwarten. ### 3. Domain-aware Routen in Unit-Tests nicht geladen (~10 Tests) - **Symptom:** `Route [modal_load] not defined.` - **Ursache:** Die Anwendung lädt Routen host-abhängig (siehe CLAUDE.md, Multi-Tenant Routing). In Unit-Tests ohne Host sind die `routes/domains/*`-Routen nicht registriert; `TreeHtmlRenderer` erzeugt aber HTML mit `route('modal_load')`. - **Betroffen:** `Unit/BusinessPlan/TreeHtmlRendererTest`. - **Fix (mittel):** Routen im Test-Setup laden bzw. den Renderer von der Route-Generierung entkoppeln (URL injizieren). ### 4. Tests veraltet ggü. refaktoriertem Konstruktor (~19 Tests) - **Symptom:** `TreeCalcBotOptimized::__construct(): Argument #4 ($forceLiveCalculation) must be of type bool, …BusinessUserRepository given` - **Ursache:** Die Konstruktor-Signatur von `App\Services\BusinessPlan\TreeCalcBotOptimized` wurde geändert; der Test (`TreeCalcBotOptimizedTest`) übergibt die Argumente noch in alter Reihenfolge. - **Betroffen:** `Unit/BusinessPlan/TreeCalcBotOptimizedTest`. - **Fix (mittel, reine Teständerung):** Konstruktor-Aufrufe im Test an die aktuelle Signatur anpassen. ### Rest Einzelne Folgefehler/Sonderfälle: `Feature/ExampleTest`, `Feature/FrenchLocalizationTest`, `Feature/AboOneTimeWindowTest`, `Feature/Incentive/IncentiveTeaserPageTest`. ## Empfehlung Eigenständige Aufräum-Aufgabe in separatem Branch, **nicht** in den Payment-Branch mischen. Sinnvolle Reihenfolge nach Risiko/Nutzen: **1 → 4 → 3 → 2** (Ursache 2 zuletzt, da Architekturentscheidung zur Test-DB nötig).