*/ private array $envBackup; protected function setUp(): void { $this->db = new PDO('sqlite::memory:', options: [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]); $this->db->sqliteCreateFunction('strip_tags', 'strip_tags', 1); $this->lockPath = dirname(__DIR__, 2) . '/database/.provision.lock'; $this->lockExistedBefore = file_exists($this->lockPath); $this->envBackup = [ 'ADMIN_USERNAME' => $_ENV['ADMIN_USERNAME'] ?? '', 'ADMIN_EMAIL' => $_ENV['ADMIN_EMAIL'] ?? '', 'ADMIN_PASSWORD' => $_ENV['ADMIN_PASSWORD'] ?? '', ]; $_ENV['ADMIN_USERNAME'] = 'shared-admin'; $_ENV['ADMIN_EMAIL'] = 'shared-admin@example.com'; $_ENV['ADMIN_PASSWORD'] = 'strong-secret'; } protected function tearDown(): void { foreach ($this->envBackup as $key => $value) { $_ENV[$key] = $value; } if (!$this->lockExistedBefore && file_exists($this->lockPath)) { @unlink($this->lockPath); } } public function testRunAppliesMigrationsSeedsAdminAndCreatesLockFile(): void { Provisioner::run($this->db); self::assertFileExists($this->lockPath); $migrationCount = (int) $this->db->query('SELECT COUNT(*) FROM migrations')->fetchColumn(); self::assertGreaterThan(0, $migrationCount, 'Les migrations doivent ĂȘtre enregistrĂ©es'); $admin = $this->db->query("SELECT username, email, role FROM users WHERE username = 'shared-admin'")->fetch(); self::assertIsArray($admin); self::assertSame('shared-admin@example.com', $admin['email']); self::assertSame('admin', $admin['role']); } public function testRunIsIdempotentForAdminSeed(): void { Provisioner::run($this->db); Provisioner::run($this->db); $adminCount = (int) $this->db->query("SELECT COUNT(*) FROM users WHERE username = 'shared-admin'")->fetchColumn(); self::assertSame(1, $adminCount); } }