Plan: das Zurueckstellen der Umgebung war falsch, und die Pruefhuerde zu niedrig

Der Testcode im Plan sicherte $_SERVER und stellte daraus zurueck. phpunit haelt
seine <env>-Werte aber in $_ENV und putenv() — gemessen: ADMIN_HOSTS und
FILES_HOST fehlen in $_SERVER voellig. Das Zurueckstellen loeschte sie damit,
und jeder Test danach las ADMIN_HOSTS aus der echten .env des Containers. Die
Suite fiel an zwei Stellen, die mit Hostnamen nichts zu tun haben.

Gefunden hat es nicht der Filterlauf, den der Plan verlangte — der war gruen.
Gefunden hat es der Vergleich zweier voller Laeufe, mit und ohne die Aenderung:
2939 gruen gegen zwei Fehlschlaege. Deshalb verlangt Schritt 5 jetzt den vollen
Lauf und nennt den Kontrollversuch beim Namen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
feat/versandtakt
nexxo 2026-08-04 14:37:16 +02:00
parent 4f57435c4d
commit 9d3f3c27b5
1 changed files with 44 additions and 14 deletions

View File

@ -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 <env>-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**