import path from 'path'; import { registerSharedWorker } from 'ava/plugin'; import { Client } from 'pg'; import { execSync } from 'child_process'; import { Data, MessageType } from './types'; import { createConnectionUrl } from '../../../database'; import { config } from '../../../config'; import { ExecutionContext } from 'ava'; import { DBTestContext } from '../get-db'; import { PrismaClient } from '@prisma/client'; const protocol = registerSharedWorker({ filename: path.join(__dirname, 'test-worker.mjs'), supportedProtocols: ['experimental'], initialData: { type: 'inital', rootConnection: { user: config.database.username, password: config.database.password, host: config.database.host, port: config.database.port, database: 'postgres', }, }, // teardown: tearDownTemplateDb, }); export async function getDb(t: ExecutionContext) { // Allow it to be called before the shared worker is availabe. await protocol.available; const message = protocol.publish({ type: MessageType.AQUIRE, }); for await (const reply of message.replies()) { if (reply.data.type === MessageType.DB_ACQUIRED) { console.log('db aquired:', reply.data.url); t.context.db = { client: new PrismaClient({ datasources: { db: { url: reply.data.url, } } }), teardown: () => { console.log('send teardown message'); reply.reply({ type: MessageType.DB_TEARDOWN }); } } return; } } } async function tearDownTemplateDb() { console.log('template teardown'); const dbName = 'test_template'; // create testing db if it doesnt exist const rootClient = new Client({ user: config.database.username, password: config.database.password, host: config.database.host, port: config.database.port, database: 'postgres', }); await rootClient.connect(); try { await rootClient.query(`ALTER DATABASE ${dbName} WITH is_template FALSE;`); await rootClient.query(`DROP DATABASE ${dbName};`); } catch (err) { console.log(err); // ignore 'db already exists' error if (err.code !== '42P04') throw err; } finally { await rootClient.end(); } }