import dotenv from "dotenv"; const ENV_TEST_PATH = ".env.test"; // vitest.config.ts already loads .env.test with override:true; we reload here so // the setup file is self-contained when run directly. dotenv.config({ path: ENV_TEST_PATH }); /** * Safety guard: the suite hits a REAL MySQL database (no Prisma mocks) and * MUTATES it, so it must never run against a dev/production DB. We require the * configured database name to contain "test" (the committed `.env.test` points * at the throwaway `app_test`); anything else is a HARD FAILURE before any test * runs, so a stray DATABASE_URL can't silently corrupt dev/prod data. */ function extractDbName(url: string | undefined): string | null { if (!url) return null; try { // mysql://user:pass@host:3306/dbname?params → "dbname" const afterAuthority = url.replace(/^[a-z]+:\/\/[^/]+\//i, ""); const dbName = afterAuthority.split("?")[0].split("/")[0]; return dbName || null; } catch { return null; } } const dbUrl = process.env.DATABASE_URL; const dbName = extractDbName(dbUrl); if (!dbUrl) { throw new Error( "[test-setup] DATABASE_URL is not set. The suite mutates a real database — " + `point ${ENV_TEST_PATH} at a dedicated TEST database (e.g. app_test).`, ); } if (dbName == null || !/test/i.test(dbName)) { throw new Error( `[test-setup] Refusing to run: DATABASE_URL targets database "${dbName ?? "unknown"}", ` + `whose name does not contain "test". The suite mutates the database — point ` + `${ENV_TEST_PATH} at a throwaway TEST database (e.g. app_test), never dev/production.`, ); }