CluPilotCloud/tests/Feature/InstallerWritesHostsTest.php

66 lines
2.4 KiB
PHP

<?php
use Symfony\Component\Process\Process;
/**
* Der Installer fragte nach den Hostnamen und schrieb sie nicht.
*
* Und er rief `optional_env` dreizehn Zeilen vor ihrer Definition auf. In bash
* ist eine Funktion erst ab ihrer Definition bekannt; unter `set -euo pipefail`
* ist der Aufruf davor ein Exit 127, der die Installation beendet. Das ist der
* Fehler, der hier festgehalten wird — nicht die Schreibweise.
*/
function installerSource(): string
{
return file_get_contents(base_path('deploy/install.sh'));
}
it('ist syntaktisch gültiges bash', function () {
$process = new Process(['bash', '-n', base_path('deploy/install.sh')]);
$process->run();
expect($process->getExitCode())->toBe(0, $process->getErrorOutput());
});
it('definiert jede Hilfsfunktion, bevor sie gebraucht wird', function () {
$source = installerSource();
foreach (['set_env', 'optional_env'] as $function) {
$definedAt = strpos($source, " {$function}() {");
expect($definedAt)->not->toBeFalse("{$function}() wird nicht mehr definiert.");
// Der erste Aufruf ist der erste Treffer, der KEINE Definition ist.
$calledAt = preg_match(
'/^\s+'.preg_quote($function, '/').' [A-Z]/m',
$source,
$matches,
PREG_OFFSET_CAPTURE,
) ? $matches[0][1] : false;
expect($calledAt)->not->toBeFalse("{$function} wird nirgends aufgerufen.");
expect($definedAt)->toBeLessThan(
$calledAt,
"{$function}() wird vor seiner Definition aufgerufen — unter set -e ist das Exit 127.",
);
}
});
it('schreibt jeden Hostnamen, nach dem es fragt', function () {
$source = installerSource();
// Gefragt wird nach allen fünf …
foreach (['APP_DOMAIN', 'WWW_DOMAIN', 'STATUS_DOMAIN', 'FILES_DOMAIN', 'ADMIN_DOMAIN'] as $asked) {
expect($source)->toMatch('/^ask\s+'.$asked.'\s/m', "Es wird nicht mehr nach {$asked} gefragt.");
}
// … und jede Antwort landet auch in der .env. Genau das fehlte: die Fragen
// standen da, die Werte wurden nie geschrieben, und die Trennung war
// deshalb auf keiner Installation eingeschaltet.
foreach (['APP_HOST', 'SITE_HOST', 'STATUS_HOST', 'FILES_HOST'] as $written) {
expect($source)->toMatch(
'/^\s+(set_env|optional_env)\s+'.$written.'\s/m',
"{$written} wird nicht in die .env geschrieben.",
);
}
});