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'; @unlink($this->lockPath); $this->envBackup = [ 'ADMIN_USERNAME' => $_ENV['ADMIN_USERNAME'] ?? null, 'ADMIN_EMAIL' => $_ENV['ADMIN_EMAIL'] ?? null, 'ADMIN_PASSWORD' => $_ENV['ADMIN_PASSWORD'] ?? null, ]; $_ENV['ADMIN_USERNAME'] = 'Admin'; $_ENV['ADMIN_EMAIL'] = 'Admin@example.com'; $_ENV['ADMIN_PASSWORD'] = 'secret1234'; } protected function tearDown(): void { @unlink($this->lockPath); foreach ($this->envBackup as $key => $value) { if ($value === null) { unset($_ENV[$key]); } else { $_ENV[$key] = $value; } } } public function testRunCreatesProvisionLockAndSeedsAdminUser(): void { Provisioner::run($this->db); self::assertFileExists($this->lockPath); $row = $this->db->query('SELECT username, email, role FROM users')->fetch(); self::assertIsArray($row); self::assertSame('admin', $row['username']); self::assertSame('admin@example.com', $row['email']); self::assertSame('admin', $row['role']); } public function testRunIsIdempotent(): void { Provisioner::run($this->db); Provisioner::run($this->db); $count = (int) $this->db->query('SELECT COUNT(*) FROM users WHERE username = "admin"')->fetchColumn(); self::assertSame(1, $count); } }