*/ private array $envBackup = []; /** @var array */ private array $putenvBackup = []; protected function setUp(): void { $this->workspace = sys_get_temp_dir() . '/netslim-bootstrapper-' . bin2hex(random_bytes(8)); mkdir($this->workspace, 0777, true); foreach (['APP_ENV', 'APP_URL', 'TIMEZONE'] as $key) { $this->envBackup[$key] = $_ENV[$key] ?? null; $this->putenvBackup[$key] = getenv($key); unset($_ENV[$key], $_SERVER[$key]); putenv($key); } } protected function tearDown(): void { foreach ($this->envBackup as $key => $value) { if ($value === null) { unset($_ENV[$key], $_SERVER[$key]); } else { $_ENV[$key] = $value; $_SERVER[$key] = $value; } $previous = $this->putenvBackup[$key] ?? false; if ($previous === false) { putenv($key); } else { putenv($key . '=' . $previous); } } $this->removeDirectory($this->workspace); parent::tearDown(); } public function testBootstrapCreatesRuntimeDirectoriesLoadsEnvironmentAndMemoizesContainer(): void { $this->writeEnvFile([ 'APP_ENV=development', 'APP_URL=http://localhost', 'ADMIN_USERNAME=admin', 'ADMIN_EMAIL=admin@example.test', 'ADMIN_PASSWORD=secret123456', 'TIMEZONE=Europe/Paris', ]); $definitionsPath = $this->writeDefinitionsFile(); $bootstrapper = new InfrastructureBootstrapper($this->workspace, $definitionsPath); $container = $bootstrapper->bootstrap(); $sameContainer = $bootstrapper->bootstrap(); self::assertInstanceOf(ContainerInterface::class, $container); self::assertSame($container, $sameContainer); self::assertSame('from-test-definitions', $container->get('bootstrap.flag')); self::assertSame('Europe/Paris', date_default_timezone_get()); foreach ([ 'var/cache/twig', 'var/cache/htmlpurifier', 'var/cache/di', 'var/logs', 'database', 'public/media', ] as $directory) { self::assertDirectoryExists($this->workspace . '/' . $directory); } } public function testBootstrapFailsWhenEnvironmentFileIsMissing(): void { $bootstrapper = new InfrastructureBootstrapper($this->workspace, $this->writeDefinitionsFile()); $this->expectException(\RuntimeException::class); $this->expectExceptionMessage('Fichier .env introuvable'); $bootstrapper->bootstrap(); } public function testBootstrapNoLongerRequiresIdentityProvisioningVariables(): void { $this->writeEnvFile([ 'APP_ENV=production', 'APP_URL=https://example.test', ]); $bootstrapper = new InfrastructureBootstrapper($this->workspace, $this->writeDefinitionsFile()); $container = $bootstrapper->bootstrap(); self::assertInstanceOf(ContainerInterface::class, $container); } private function writeEnvFile(array $lines): void { file_put_contents($this->workspace . '/.env', implode(PHP_EOL, $lines) . PHP_EOL); } private function writeDefinitionsFile(): string { $definitionsPath = $this->workspace . '/definitions.php'; file_put_contents($definitionsPath, <<<'PHP' 'from-test-definitions', ]; PHP); return $definitionsPath; } private function removeDirectory(string $directory): void { if (!is_dir($directory)) { return; } $iterator = new \RecursiveIteratorIterator( new \RecursiveDirectoryIterator($directory, \FilesystemIterator::SKIP_DOTS), \RecursiveIteratorIterator::CHILD_FIRST, ); foreach ($iterator as $fileInfo) { if ($fileInfo->isDir()) { rmdir($fileInfo->getPathname()); continue; } unlink($fileInfo->getPathname()); } rmdir($directory); } }