53 lines
1.7 KiB
TypeScript
53 lines
1.7 KiB
TypeScript
// IMPORTANT: this file runs before each test file's imports execute.
|
|
// We rewrite DATABASE_URL and REDIS_URL here so per-worker isolation is
|
|
// applied before any service module constructs a Prisma/Redis client.
|
|
|
|
import dotenv from 'dotenv';
|
|
import path from 'path';
|
|
import {afterAll, afterEach, beforeAll, vi} from 'vitest';
|
|
|
|
dotenv.config({path: path.resolve(__dirname, '../.env')});
|
|
|
|
// Vitest assigns each worker a 1-based pool id; defaults to "1" for single-worker runs.
|
|
const workerId = process.env.VITEST_POOL_ID || '1';
|
|
|
|
if (process.env.DATABASE_URL) {
|
|
const url = new URL(process.env.DATABASE_URL);
|
|
const baseDb = url.pathname.replace(/^\//, '') || 'plunk_test';
|
|
url.pathname = `/${baseDb}_w${workerId}`;
|
|
process.env.DATABASE_URL = url.toString();
|
|
// Mirror onto DIRECT_DATABASE_URL so prisma migrate uses the same worker DB.
|
|
if (process.env.DIRECT_DATABASE_URL) {
|
|
const direct = new URL(process.env.DIRECT_DATABASE_URL);
|
|
direct.pathname = `/${baseDb}_w${workerId}`;
|
|
process.env.DIRECT_DATABASE_URL = direct.toString();
|
|
}
|
|
}
|
|
|
|
if (process.env.REDIS_URL) {
|
|
const url = new URL(process.env.REDIS_URL);
|
|
url.pathname = `/${(parseInt(workerId, 10) - 1) % 16}`;
|
|
process.env.REDIS_URL = url.toString();
|
|
}
|
|
|
|
process.env.NODE_ENV = 'test';
|
|
process.env.JWT_SECRET = process.env.JWT_SECRET || 'test-jwt-secret-key-for-testing';
|
|
|
|
// Static import is safe: database.ts only reads env in initialize(), which runs
|
|
// in beforeAll — well after the env mutations above.
|
|
import {testDatabase} from './helpers/database';
|
|
|
|
beforeAll(async () => {
|
|
await testDatabase.initialize();
|
|
});
|
|
|
|
afterEach(async () => {
|
|
vi.clearAllMocks();
|
|
vi.useRealTimers();
|
|
await testDatabase.cleanup();
|
|
});
|
|
|
|
afterAll(async () => {
|
|
await testDatabase.disconnect();
|
|
});
|