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.", ); } });