diff --git a/tests/Feature/DeploymentPackageTest.php b/tests/Feature/DeploymentPackageTest.php index af0a25a..1b8c63d 100644 --- a/tests/Feature/DeploymentPackageTest.php +++ b/tests/Feature/DeploymentPackageTest.php @@ -68,13 +68,34 @@ function deploymentGit(string $path, array $arguments): string } /** - * Determinisztikus teszt-repó: átnevezés, törlés, ékezetes fájlnév és migráció is van benne. + * A minta-repó útvonala. A PID azért van benne, hogy párhuzamos futásnál (paratest) + * minden processznek saját mintája legyen. + */ +function deploymentTemplatePath(): string +{ + return sys_get_temp_dir().DIRECTORY_SEPARATOR.'deployment-package-minta-'.getmypid(); +} + +/** + * Determinisztikus minta-repó: átnevezés, törlés, ékezetes fájlnév és migráció is van benne. + * + * A 12 git parancs futásonként EGYSZER fut le - Windowson a processzindítás olyan drága, + * hogy tesztenként újraépítve ez önmagában ~4 mp lenne. A tesztek másolatot kapnak. * * @return array{path:string, commits:array} */ -function deploymentTestRepository(): array +function deploymentRepositoryTemplate(): array { - $path = sys_get_temp_dir().DIRECTORY_SEPARATOR.'deployment-package-test-'.uniqid(); + static $template = null; + + if ($template !== null) { + return $template; + } + + $path = deploymentTemplatePath(); + + // Egy korábbi, megszakadt futás azonos PID-ű maradványa nem szennyezheti a mintát. + deploymentDeleteDirectory($path); File::makeDirectory($path.'/app', 0777, true); File::makeDirectory($path.'/database/migrations', 0777, true); @@ -106,26 +127,66 @@ function deploymentTestRepository(): array $log = trim(deploymentGit($path, ['log', '--reverse', '--pretty=format:%H'])); + // A mintából minden teszt másol, tehát tilos beleírni - a sample hookokat viszont + // felesleges körbemásolni, azokra a git nem támaszkodik. + deploymentDeleteDirectory($path.'/.git/hooks'); + + return $template = ['path' => $path, 'commits' => explode("\n", $log)]; +} + +/** + * A teszt saját, írható másolata a mintáról: a builder és a "working tree elrontása" + * tesztek beleírnak a repóba, ezért nem oszthatnak közös példányt. + * + * @return array{path:string, commits:array} + */ +function deploymentTestRepository(): array +{ + $template = deploymentRepositoryTemplate(); + + $path = sys_get_temp_dir().DIRECTORY_SEPARATOR.'deployment-package-test-'.uniqid(); + + File::copyDirectory($template['path'], $path); + Config::set('deployment.repo_path', $path); Config::set('deployment.output_path', $path.DIRECTORY_SEPARATOR.'_kimenet'); - return ['path' => $path, 'commits' => explode("\n", $log)]; + return ['path' => $path, 'commits' => $template['commits']]; +} + +/** + * Facade nélküli törlés: az afterAll a booteolt alkalmazáson kívül is fut. + */ +function deploymentDeleteDirectory(string $path): void +{ + if (! is_dir($path)) { + return; + } + + $items = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS), + RecursiveIteratorIterator::CHILD_FIRST + ); + + foreach ($items as $item) { + // A .git/objects tartalma Windowson csak olvasható, ezért törlés előtt fel kell oldani. + @chmod($item->getPathname(), 0777); + + $item->isDir() ? @rmdir($item->getPathname()) : @unlink($item->getPathname()); + } + + @rmdir($path); } function deploymentCleanup(string $path): void { - // A .git/objects tartalma Windowson csak olvasható, ezért törlés előtt fel kell oldani. - foreach (File::allFiles($path, true) as $file) { - @chmod($file->getPathname(), 0777); - } - - try { - File::deleteDirectory($path); - } catch (Throwable) { - // A takarítás nem futtathat el tesztet - a temp mappa maradványa nem befolyásol semmit. - } + deploymentDeleteDirectory($path); } +afterAll(function () { + deploymentDeleteDirectory(deploymentTemplatePath()); +}); + test('a kikapcsolt env kapcsoló mindenkitől elveszi a hozzáférést', function () { deploymentAllowEnvironment(); Config::set('deployment.enabled', false);