From 11918b608da23c41f954327bd6732ea74779bdb3 Mon Sep 17 00:00:00 2001 From: E98Developer Date: Mon, 17 Aug 2026 08:45:05 +0200 Subject: [PATCH] =?UTF-8?q?FIX=20DeploymentPackageTest=20git=20fixture=20?= =?UTF-8?q?=C3=BAjrahasznos=C3=ADt=C3=A1s=20=C3=A9s=20temp=20takar=C3=ADt?= =?UTF-8?q?=C3=A1s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A temp git repó eddig tesztenként épült újra 12 git processzel, ami Windowson önmagában ~4 mp volt tesztenként. Mostantól futásonként EGYSZER épül fel, a tesztek pedig másolatot kapnak róla (0,138 mp másolás + 0,177 mp takarítás). Minden teszt saját, írható példányon dolgozik, így a "working tree elrontása" és a builder-tesztek továbbra is írhatnak a repóba. Mérés a teljes fájlon, azonos gépen, 28/28 zölddel: 384,05 mp -> 268,38 mp. A régi deploymentCleanup a Windows read-only .git/objects fájljain elbukott és a hibát csendben elnyelte, ezért árva mappákat hagyott a temp-ben (164 gyűlt össze). Az új, facade nélküli deploymentDeleteDirectory nem hagy maga után semmit, és az afterAll a booteolt alkalmazáson kívül is tud takarítani. A minta útvonalában getmypid() van, hogy a tervezett --parallel futásnál is processzenként külön mintát használjunk. Co-Authored-By: Claude Opus 5 --- tests/Feature/DeploymentPackageTest.php | 89 +++++++++++++++++++++---- 1 file changed, 75 insertions(+), 14 deletions(-) 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);