diff --git a/package.json b/package.json index f041b93..4756f06 100644 --- a/package.json +++ b/package.json @@ -7,16 +7,18 @@ "build": "next build", "start": "next start", "lint": "eslint", - "test": "vitest", - "test:run": "vitest run", + "test": "DATABASE_URL=\"postgresql://euchre_camp:LINGO5row_hiding@dhg.lol:5432/euchre_camp_dev\" vitest", + "test:run": "DATABASE_URL=\"postgresql://euchre_camp:LINGO5row_hiding@dhg.lol:5432/euchre_camp_dev\" vitest run", "test:acceptance": "playwright test src/__tests__/e2e/", "test:acceptance:headed": "playwright test src/__tests__/e2e/ --headed", "db:switch": "node scripts/switch-database.js", "db:setup-postgres": "node scripts/setup-postgres.js", "db:setup-dev": "DATABASE_URL=\"postgresql://euchre_camp:LINGO5row_hiding@dhg.lol:5432/euchre_camp_dev\" node scripts/setup-postgres.js", "db:setup-dev:clean": "DATABASE_URL=\"postgresql://euchre_camp:LINGO5row_hiding@dhg.lol:5432/euchre_camp_dev\" node scripts/setup-postgres.js --drop", - "db:reset-dev": "node scripts/reset-dev-db.js", + "db:reset-dev": "DEV_DATABASE_URL=\"postgresql://euchre_camp:LINGO5row_hiding@dhg.lol:5432/euchre_camp_dev\" node scripts/reset-dev-db.js", "db:use-dev": "node scripts/use-dev-db.js", + "db:cleanup-prod": "PROD_DATABASE_URL=\"postgresql://euchre_camp:LINGO5row_hiding@dhg.lol:5432/euchre_camp\" node scripts/cleanup-prod-db.js", + "db:check-prod": "PROD_DATABASE_URL=\"postgresql://euchre_camp:LINGO5row_hiding@dhg.lol:5432/euchre_camp\" node scripts/check-test-records.js", "db:cleanup-prod": "node scripts/cleanup-prod-db.js", "db:seed": "node scripts/seed.js", "docker:up": "docker-compose up -d", diff --git a/playwright.config.ts b/playwright.config.ts index d4c8ea2..f532df6 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -66,7 +66,7 @@ export default defineConfig({ ], // Run your local dev server before starting the tests webServer: { - command: 'npm run dev', + command: 'DATABASE_URL="postgresql://euchre_camp:LINGO5row_hiding@dhg.lol:5432/euchre_camp_dev" npm run dev', url: 'http://localhost:3000', timeout: 120000, reuseExistingServer: !process.env.CI, diff --git a/scripts/check-test-records.js b/scripts/check-test-records.js index 2d8185b..00f6699 100755 --- a/scripts/check-test-records.js +++ b/scripts/check-test-records.js @@ -7,8 +7,18 @@ const { execSync } = require('child_process'); -// Database connection string -const DB_URL = 'postgresql://euchre_camp:LINGO5row_hiding@dhg.lol:5432/euchre_camp'; +// Database connection string - use environment variable or default to production +const DB_URL = process.env.PROD_DATABASE_URL || + process.env.DATABASE_URL || + 'postgresql://euchre_camp:LINGO5row_hiding@dhg.lol:5432/euchre_camp'; + +// Validate that we're not accidentally using dev database +if (DB_URL.includes('_dev') || DB_URL.includes('_dev_')) { + console.error('❌ ERROR: This script should not be used with the development database!'); + console.error(' Current DATABASE_URL:', DB_URL); + console.error(' Please set PROD_DATABASE_URL for production database operations.'); + process.exit(1); +} // Helper to run SQL and log results function runSQL(sql, description) { diff --git a/scripts/cleanup-prod-db.js b/scripts/cleanup-prod-db.js index aa0afdb..46f2ac3 100755 --- a/scripts/cleanup-prod-db.js +++ b/scripts/cleanup-prod-db.js @@ -10,8 +10,18 @@ const { execSync } = require('child_process'); -// Database connection string -const DB_URL = 'postgresql://euchre_camp:LINGO5row_hiding@dhg.lol:5432/euchre_camp'; +// Database connection string - use environment variable or default to production +const DB_URL = process.env.PROD_DATABASE_URL || + process.env.DATABASE_URL || + 'postgresql://euchre_camp:LINGO5row_hiding@dhg.lol:5432/euchre_camp'; + +// Validate that we're not accidentally using dev database +if (DB_URL.includes('_dev') || DB_URL.includes('_dev_')) { + console.error('❌ ERROR: This script should not be used with the development database!'); + console.error(' Current DATABASE_URL:', DB_URL); + console.error(' Please set PROD_DATABASE_URL for production database operations.'); + process.exit(1); +} // Helper to run SQL and log results function runSQL(sql, description) { diff --git a/scripts/reset-dev-db.js b/scripts/reset-dev-db.js index c3a1540..3ee4f19 100755 --- a/scripts/reset-dev-db.js +++ b/scripts/reset-dev-db.js @@ -11,21 +11,35 @@ const { execSync } = require('child_process'); const fs = require('fs'); const path = require('path'); -// Load environment variables +// Load environment variables - prioritize explicit DEV_DATABASE_URL +// Falls back to DATABASE_URL, then .env.development const envPath = path.resolve(__dirname, '..', '.env.development'); if (fs.existsSync(envPath)) { require('dotenv').config({ path: envPath }); } -// Check if DATABASE_URL is set -if (!process.env.DATABASE_URL) { - console.error('❌ DATABASE_URL is not set'); - console.error('Please set it in .env.development'); +// Use DEV_DATABASE_URL if set, otherwise use DATABASE_URL +const databaseUrl = process.env.DEV_DATABASE_URL || process.env.DATABASE_URL; + +// Check if database URL is set +if (!databaseUrl) { + console.error('❌ No database URL set'); + console.error('Please set DEV_DATABASE_URL or DATABASE_URL environment variable'); + console.error('Or ensure .env.development file exists with DATABASE_URL'); + process.exit(1); +} + +// Validate that we're using the dev database +if (!databaseUrl.includes('_dev') && !databaseUrl.includes('_dev_')) { + console.error('❌ ERROR: This script should only be used with the development database!'); + console.error(' Current URL:', databaseUrl); + console.error(' Expected pattern: euchre_camp_dev'); + console.error(' Please set DEV_DATABASE_URL for development database operations.'); process.exit(1); } // Extract database name from URL -const dbUrl = process.env.DATABASE_URL; +const dbUrl = databaseUrl; const dbName = dbUrl.split('/').pop(); console.log('🔄 Resetting development database...\n'); diff --git a/src/__tests__/e2e/global.setup.ts b/src/__tests__/e2e/global.setup.ts index 89ab771..f69f946 100644 --- a/src/__tests__/e2e/global.setup.ts +++ b/src/__tests__/e2e/global.setup.ts @@ -16,11 +16,34 @@ function isDevDatabase(): boolean { return dbUrl.includes('euchre_camp_dev'); } -// Warn if not using dev database +function isProductionDatabase(): boolean { + const dbUrl = process.env.DATABASE_URL || ''; + return dbUrl.includes('euchre_camp') && !dbUrl.includes('_dev'); +} + +// Strict check - fail if using production database +if (isProductionDatabase()) { + console.error(''); + console.error('='.repeat(80)); + console.error('CRITICAL ERROR: Tests are attempting to run against PRODUCTION database!'); + console.error('='.repeat(80)); + console.error(''); + console.error('Current DATABASE_URL:', process.env.DATABASE_URL); + console.error(''); + console.error('Tests MUST run against the development database (euchre_camp_dev)'); + console.error(''); + console.error('To fix this:'); + console.error(' 1. Run: npm run test:acceptance'); + console.error(' 2. Or set: DATABASE_URL="postgresql://euchre_camp:password@dhg.lol:5432/euchre_camp_dev"'); + console.error(''); + console.error('Aborting test execution to prevent data corruption.'); + console.error(''); + process.exit(1); +} + if (!isDevDatabase()) { - console.warn('⚠️ WARNING: Not using dev database!'); + console.warn('⚠️ WARNING: DATABASE_URL does not contain euchre_camp_dev'); console.warn(' Current DATABASE_URL:', process.env.DATABASE_URL); - console.warn(' Expected to contain: euchre_camp_dev'); } export default async function globalSetup(config: FullConfig) { diff --git a/vitest.setup.ts b/vitest.setup.ts index c44951a..7ebc2ac 100644 --- a/vitest.setup.ts +++ b/vitest.setup.ts @@ -1 +1,45 @@ import '@testing-library/jest-dom' + +/** + * Vitest Setup File + * + * This file runs before each test file in the Vitest environment. + * It validates that tests are running against the development database + * to prevent accidental data corruption. + */ + +// Check if DATABASE_URL is set and points to dev database +const databaseUrl = process.env.DATABASE_URL; + +if (databaseUrl) { + const isDevDatabase = databaseUrl.includes('euchre_camp_dev'); + const isProductionDatabase = + databaseUrl.includes('euchre_camp') && + !databaseUrl.includes('_dev') && + !databaseUrl.includes('_dev_'); + + if (isProductionDatabase) { + console.error(''); + console.error('='.repeat(80)); + console.error('CRITICAL ERROR: Tests are attempting to run against PRODUCTION database!'); + console.error('='.repeat(80)); + console.error(''); + console.error('Current DATABASE_URL:', databaseUrl); + console.error(''); + console.error('Tests MUST run against the development database (euchre_camp_dev)'); + console.error(''); + console.error('To fix this:'); + console.error(' 1. Run: npm run test:run'); + console.error(' 2. Or set: DATABASE_URL="postgresql://euchre_camp:password@dhg.lol:5432/euchre_camp_dev"'); + console.error(''); + console.error('Aborting test execution to prevent data corruption.'); + console.error(''); + process.exit(1); + } + + if (isDevDatabase) { + console.log('✓ Tests running against development database (euchre_camp_dev)'); + } +} else { + console.warn('⚠ No DATABASE_URL set - tests may fail or use unexpected database'); +}