import { execSync } from 'node:child_process'; import { createDB } from 'mysql-memory-server'; process.env.NODE_ENV ??= 'test'; process.env.LOG_LEVEL ??= 'silent'; process.env.CORS_ORIGIN ??= 'http://localhost:5173'; process.env.RATE_LIMIT_MAX ??= '10000'; process.env.AUTH_RATE_LIMIT_MAX ??= '10000'; process.env.AUTH_SESSION_TTL_HOURS ??= '168'; const DOCKER_TEST_URL = 'mysql://novya:novya@127.0.0.1:3306/novya_test'; type MemoryDb = Awaited>; const globalForTestDb = globalThis as unknown as { __novyaMemoryDb?: MemoryDb; }; function migrateDeploy(): void { execSync('npx prisma generate --schema=./prisma/schema.prisma', { stdio: 'inherit', env: process.env, }); execSync('npx prisma migrate deploy --schema=./prisma/schema.prisma', { stdio: 'inherit', env: process.env, }); } async function startTestDatabase(): Promise { const preferMemory = process.env.USE_MEMORY_MYSQL === 'true'; const dockerUrl = process.env.TEST_DATABASE_URL ?? DOCKER_TEST_URL; if (!preferMemory) { process.env.DATABASE_URL = dockerUrl; try { migrateDeploy(); return; } catch (err) { console.warn('Docker MySQL (novya_test) is not ready. Falling back if possible.'); console.warn(err instanceof Error ? err.message : err); } } if (process.env.SKIP_MEMORY_MYSQL === 'true') { process.env.DATABASE_URL = dockerUrl; return; } try { const db = await createDB({ version: '8.4.x', dbName: 'novya_test', username: 'root', xEnabled: 'OFF', logLevel: 'ERROR', downloadBinaryOnce: true, downloadRetries: 1, }); globalForTestDb.__novyaMemoryDb = db; process.env.DATABASE_URL = `mysql://root@127.0.0.1:${db.port}/novya_test`; migrateDeploy(); const stop = async () => { try { await db.stop(); } catch { // ignore shutdown races } }; process.once('exit', () => { void stop(); }); process.once('SIGINT', () => { void stop(); }); process.once('SIGTERM', () => { void stop(); }); } catch (err) { console.warn( 'MySQL is not running. Database tests will be skipped. Start Docker: docker compose -f docker-compose.dev.yml up -d', ); console.warn(err instanceof Error ? err.message : err); process.env.DATABASE_URL ??= dockerUrl; } } await startTestDatabase();