routeTopicLogChannelsToTestingLog(); } /** * Laravel ruft setUpTraits() direkt nach dem Bootstrap und VOR jedem * Datenbank-Trait auf (RefreshDatabase, DatabaseTruncation, …). Der * Guard muss hier stehen — in setUp() nach parent::setUp() käme er erst * an, wenn RefreshDatabase die falsche Datenbank schon geleert hat * (Umsetzungsaudit 25.09.2026, N22). */ protected function setUpTraits(): array { $this->assertTestDatabaseIsInMemorySqlite(); return parent::setUpTraits(); } /** * Prüft die Verbindung, die der DatabaseManager tatsächlich als Standard * auflösen wird — ohne sie zu öffnen. */ protected function assertTestDatabaseIsInMemorySqlite(): void { $default = (string) DB::getDefaultConnection(); $connection = (array) config('database.connections.'.$default, []); // Eine gesetzte `url` überschreibt Treiber und Datenbank erst beim // Verbindungsaufbau — dann wären die geprüften Rohwerte wertlos // (Umsetzungsaudit 02.10.2026, O02). if (! empty($connection['url'])) { throw new RuntimeException(sprintf( 'Tests laufen mit DB_URL-Override auf „%s“ — die Verbindung würde nicht SQLite :memory: sein. DB_URL für Tests leeren.', $default, )); } if ($default !== 'sqlite' || ($connection['driver'] ?? null) !== 'sqlite' || ($connection['database'] ?? null) !== ':memory:') { throw new RuntimeException(sprintf( 'Tests laufen gegen „%s“ (%s) statt SQLite :memory: — vermutlich liegt ein Config-Cache. `php artisan config:clear` und erneut starten.', $default, (string) ($connection['database'] ?? '?'), )); } } /** * Die Themen-Channels (`Log::channel('billing')` usw.) umgehen den * Default-Channel aus phpunit.xml und würden sonst in die echten * Themen-Dateien unter storage/logs schreiben. Alles, was die Suite loggt, * gehört nach testing-YYYY-MM-DD.log. `admin_slow` bleibt außen vor, weil * seine Tests den Pfad selbst setzen bzw. prüfen. */ private function routeTopicLogChannelsToTestingLog(): void { $testing = config('logging.channels.testing'); foreach (['billing', 'ki', 'monitoring', 'market', 'csp', 'spam'] as $channel) { config()->set("logging.channels.{$channel}", $testing); } } }