From f27efebd825c429bce20952907337d682bf305ca Mon Sep 17 00:00:00 2001 From: David Gwilliam Date: Sun, 3 May 2026 17:08:16 -0700 Subject: [PATCH] fix: add PrismaPg adapter for PostgreSQL and fix GRANT statements --- .gitignore | 2 ++ e2e/global.setup.ts | 14 ++++++++++---- e2e/global.teardown.ts | 16 +++++++++++----- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index 1d25ec2..cb831b1 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,8 @@ /playwright/.auth/ /test-results /cookies.txt +.env.test +prisma/ci.db # next.js /.next/ diff --git a/e2e/global.setup.ts b/e2e/global.setup.ts index f7aea99..42422a7 100644 --- a/e2e/global.setup.ts +++ b/e2e/global.setup.ts @@ -5,6 +5,7 @@ import { chromium, type FullConfig } from '@playwright/test'; import { PrismaClient } from '@prisma/client'; +import { PrismaPg } from '@prisma/adapter-pg'; import path from 'path'; import fs from 'fs'; @@ -40,6 +41,13 @@ if (isProductionDatabase()) { process.exit(1); } +function createPrismaClient() { + const databaseUrl = process.env.DATABASE_URL; + if (!databaseUrl) throw new Error('DATABASE_URL is required'); + const adapter = new PrismaPg({ connectionString: databaseUrl }); + return new PrismaClient({ adapter }); +} + async function resetDatabaseSchema(prisma: PrismaClient) { console.log('Resetting database schema...'); @@ -52,8 +60,6 @@ async function resetDatabaseSchema(prisma: PrismaClient) { await prisma.$executeRawUnsafe(` DROP SCHEMA public CASCADE; CREATE SCHEMA public; - GRANT ALL ON SCHEMA public TO postgres; - GRANT ALL ON SCHEMA public TO public; `); console.log(`Dropped ${tables.length} tables`); } @@ -133,7 +139,7 @@ async function createTestUsers(config: FullConfig) { await page.waitForTimeout(2000); - const prisma = new PrismaClient(); + const prisma = createPrismaClient(); const user = await prisma.user.findUnique({ where: { email: adminEmail } }); if (user) { @@ -169,7 +175,7 @@ export default async function globalSetup(config: FullConfig) { if (isCIDatabase()) { console.log('CI environment detected - will reset database schema'); - const prisma = new PrismaClient(); + const prisma = createPrismaClient(); await resetDatabaseSchema(prisma); await prisma.$disconnect(); } else if (!isProductionDatabase()) { diff --git a/e2e/global.teardown.ts b/e2e/global.teardown.ts index b5e41f9..43c7949 100644 --- a/e2e/global.teardown.ts +++ b/e2e/global.teardown.ts @@ -8,6 +8,7 @@ import { type FullConfig } from '@playwright/test'; import { PrismaClient } from '@prisma/client'; +import { PrismaPg } from '@prisma/adapter-pg'; import { execSync } from 'child_process'; const TEST_PATTERNS = { @@ -61,6 +62,13 @@ function buildEmailLikeClause(patterns: string[]): string { return patterns.map(p => `email LIKE '${p}'`).join(' OR '); } +function createPrismaClient() { + const databaseUrl = process.env.DATABASE_URL; + if (!databaseUrl) throw new Error('DATABASE_URL is required'); + const adapter = new PrismaPg({ connectionString: databaseUrl }); + return new PrismaClient({ adapter }); +} + async function resetDatabaseSchema(prisma: PrismaClient) { console.log('Resetting database schema...'); @@ -73,8 +81,6 @@ async function resetDatabaseSchema(prisma: PrismaClient) { await prisma.$executeRawUnsafe(` DROP SCHEMA public CASCADE; CREATE SCHEMA public; - GRANT ALL ON SCHEMA public TO postgres; - GRANT ALL ON SCHEMA public TO public; `); console.log(`Dropped ${tables.length} tables`); } @@ -109,16 +115,16 @@ export default async function globalTeardown(config: FullConfig) { if (isCIDatabase()) { console.log('CI environment - resetting database schema'); - const prisma = new PrismaClient(); + const prisma = createPrismaClient(); await resetDatabaseSchema(prisma); await prisma.$disconnect(); } else if (isProductionDatabase()) { console.log('Production environment - selective cleanup of test records'); - const prisma = new PrismaClient(); + const prisma = createPrismaClient(); await cleanupTestRecords(prisma); } else { console.log('Development environment - selective cleanup of test records'); - const prisma = new PrismaClient(); + const prisma = createPrismaClient(); await cleanupTestRecords(prisma); }