fix: add PrismaPg adapter for PostgreSQL and fix GRANT statements
Pull Request / unit-tests (pull_request) Failing after 1m28s
Pull Request / acceptance-tests (pull_request) Failing after 1m28s
Pull Request / analyze-bump-type (pull_request) Has been skipped

This commit is contained in:
2026-05-03 17:08:16 -07:00
parent 30ea4e4e86
commit f27efebd82
3 changed files with 23 additions and 9 deletions
+2
View File
@@ -15,6 +15,8 @@
/playwright/.auth/ /playwright/.auth/
/test-results /test-results
/cookies.txt /cookies.txt
.env.test
prisma/ci.db
# next.js # next.js
/.next/ /.next/
+10 -4
View File
@@ -5,6 +5,7 @@
import { chromium, type FullConfig } from '@playwright/test'; import { chromium, type FullConfig } from '@playwright/test';
import { PrismaClient } from '@prisma/client'; import { PrismaClient } from '@prisma/client';
import { PrismaPg } from '@prisma/adapter-pg';
import path from 'path'; import path from 'path';
import fs from 'fs'; import fs from 'fs';
@@ -40,6 +41,13 @@ if (isProductionDatabase()) {
process.exit(1); 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) { async function resetDatabaseSchema(prisma: PrismaClient) {
console.log('Resetting database schema...'); console.log('Resetting database schema...');
@@ -52,8 +60,6 @@ async function resetDatabaseSchema(prisma: PrismaClient) {
await prisma.$executeRawUnsafe(` await prisma.$executeRawUnsafe(`
DROP SCHEMA public CASCADE; DROP SCHEMA public CASCADE;
CREATE SCHEMA public; CREATE SCHEMA public;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
`); `);
console.log(`Dropped ${tables.length} tables`); console.log(`Dropped ${tables.length} tables`);
} }
@@ -133,7 +139,7 @@ async function createTestUsers(config: FullConfig) {
await page.waitForTimeout(2000); await page.waitForTimeout(2000);
const prisma = new PrismaClient(); const prisma = createPrismaClient();
const user = await prisma.user.findUnique({ where: { email: adminEmail } }); const user = await prisma.user.findUnique({ where: { email: adminEmail } });
if (user) { if (user) {
@@ -169,7 +175,7 @@ export default async function globalSetup(config: FullConfig) {
if (isCIDatabase()) { if (isCIDatabase()) {
console.log('CI environment detected - will reset database schema'); console.log('CI environment detected - will reset database schema');
const prisma = new PrismaClient(); const prisma = createPrismaClient();
await resetDatabaseSchema(prisma); await resetDatabaseSchema(prisma);
await prisma.$disconnect(); await prisma.$disconnect();
} else if (!isProductionDatabase()) { } else if (!isProductionDatabase()) {
+11 -5
View File
@@ -8,6 +8,7 @@
import { type FullConfig } from '@playwright/test'; import { type FullConfig } from '@playwright/test';
import { PrismaClient } from '@prisma/client'; import { PrismaClient } from '@prisma/client';
import { PrismaPg } from '@prisma/adapter-pg';
import { execSync } from 'child_process'; import { execSync } from 'child_process';
const TEST_PATTERNS = { const TEST_PATTERNS = {
@@ -61,6 +62,13 @@ function buildEmailLikeClause(patterns: string[]): string {
return patterns.map(p => `email LIKE '${p}'`).join(' OR '); 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) { async function resetDatabaseSchema(prisma: PrismaClient) {
console.log('Resetting database schema...'); console.log('Resetting database schema...');
@@ -73,8 +81,6 @@ async function resetDatabaseSchema(prisma: PrismaClient) {
await prisma.$executeRawUnsafe(` await prisma.$executeRawUnsafe(`
DROP SCHEMA public CASCADE; DROP SCHEMA public CASCADE;
CREATE SCHEMA public; CREATE SCHEMA public;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
`); `);
console.log(`Dropped ${tables.length} tables`); console.log(`Dropped ${tables.length} tables`);
} }
@@ -109,16 +115,16 @@ export default async function globalTeardown(config: FullConfig) {
if (isCIDatabase()) { if (isCIDatabase()) {
console.log('CI environment - resetting database schema'); console.log('CI environment - resetting database schema');
const prisma = new PrismaClient(); const prisma = createPrismaClient();
await resetDatabaseSchema(prisma); await resetDatabaseSchema(prisma);
await prisma.$disconnect(); await prisma.$disconnect();
} else if (isProductionDatabase()) { } else if (isProductionDatabase()) {
console.log('Production environment - selective cleanup of test records'); console.log('Production environment - selective cleanup of test records');
const prisma = new PrismaClient(); const prisma = createPrismaClient();
await cleanupTestRecords(prisma); await cleanupTestRecords(prisma);
} else { } else {
console.log('Development environment - selective cleanup of test records'); console.log('Development environment - selective cleanup of test records');
const prisma = new PrismaClient(); const prisma = createPrismaClient();
await cleanupTestRecords(prisma); await cleanupTestRecords(prisma);
} }