66 lines
2.4 KiB
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.",
|
|
);
|
|
}
|
|
});
|