feat: SDLC database separation for CI/testing #35
@@ -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
@@ -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
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user