diff --git a/docs/superpowers/plans/2026-08-04-hostnamen-trennung.md b/docs/superpowers/plans/2026-08-04-hostnamen-trennung.md index e181025..291bc5c 100644 --- a/docs/superpowers/plans/2026-08-04-hostnamen-trennung.md +++ b/docs/superpowers/plans/2026-08-04-hostnamen-trennung.md @@ -115,12 +115,21 @@ function hostSeparationTable(): array 'ADMIN_HOST_EXCLUSIVE' => 'true', ]; - // Gemerkt und zurückgestellt, nicht bloß gelöscht: phpunit.xml setzt - // FILES_HOST und ADMIN_HOSTS für den ganzen Lauf, und ein Test, der sie - // hinterher entfernt, kippt die Tests nach ihm. + // Alle drei Kanäle einzeln, und das ist kein Übereifer: phpunit.xml legt + // seine -Werte in $_ENV und putenv() ab, NIE in $_SERVER. Wer nur + // $_SERVER sichert, bekommt null zurück, löscht beim Zurückstellen + // ADMIN_HOSTS und FILES_HOST — und jeder Test NACH diesem liest sie dann + // aus der echten .env des Containers. Genau so sind ImpersonationTest und + // PublicSiteGateTest gefallen, mit einem Fehlerbild, das nach einer + // Reihenfolge-Abhängigkeit der Suite aussieht und keine ist. $previous = []; foreach ($env as $key => $value) { - $previous[$key] = $_SERVER[$key] ?? null; + $previous[$key] = [ + 'env' => array_key_exists($key, $_ENV) ? $_ENV[$key] : null, + 'server' => array_key_exists($key, $_SERVER) ? $_SERVER[$key] : null, + 'putenv' => getenv($key), + ]; + putenv("{$key}={$value}"); $_ENV[$key] = $value; $_SERVER[$key] = $value; @@ -147,14 +156,23 @@ function hostSeparationTable(): array Model::setConnectionResolver($original['db']); Model::setEventDispatcher($original['events']); - foreach ($previous as $key => $value) { - if ($value === null) { + foreach ($previous as $key => $was) { + if ($was['putenv'] === false) { putenv($key); - unset($_ENV[$key], $_SERVER[$key]); } else { - putenv("{$key}={$value}"); - $_ENV[$key] = $value; - $_SERVER[$key] = $value; + putenv("{$key}={$was['putenv']}"); + } + + if ($was['env'] === null) { + unset($_ENV[$key]); + } else { + $_ENV[$key] = $was['env']; + } + + if ($was['server'] === null) { + unset($_SERVER[$key]); + } else { + $_SERVER[$key] = $was['server']; } } } @@ -292,11 +310,23 @@ In `config/filesystems.php`, Zeile 36, `'serve' => true` ersetzen durch: Run: `docker exec clupilot-app-1 php artisan test --filter=HostSeparation` Expected: PASS, drei Tests. -- [ ] **Step 5: Die Nachbartests laufen lassen** +- [ ] **Step 5: Den VOLLEN Testlauf fahren — nicht nur die Nachbarn** -Run: `docker exec clupilot-app-1 php artisan test --filter="PortalHost|FilesHost|Welcome|OfficialDomains"` -Expected: PASS. Das prüft, dass das Zurückstellen der Anwendungsinstanz sauber -ist und dass `serve => false` nichts anderes trifft. +Run: `docker exec clupilot-app-1 php artisan test` +Expected: alles grün, **0 failed**. + +Ein Filterlauf genügt hier nicht, und das ist keine Vorsicht, sondern Erfahrung: +dieser Test verändert Prozesszustand, den *andere* Tests lesen. Ein Filter über +die naheliegenden Nachbarn war grün, während die volle Suite an zwei ganz +anderen Stellen fiel (`ImpersonationTest`, `PublicSiteGateTest`) — weil das +Zurückstellen der Umgebungsvariablen `$_SERVER` sicherte, phpunit seine Werte +aber in `$_ENV` und `putenv()` hält. Wer nur filtert, sieht genau diese Klasse +von Fehler nie. + +Zur Kontrolle, falls etwas fällt: derselbe Lauf **ohne** die beiden geänderten +Dateien muss grün sein. Erst der Vergleich sagt, ob ein Fehlschlag von dieser +Aufgabe kommt oder schon vorher da war — „sieht unverwandt aus" ist keine +Antwort auf diese Frage. - [ ] **Step 6: Commit**