24 lines
1.1 KiB
TypeScript
24 lines
1.1 KiB
TypeScript
import {before,after} from 'node:test';
|
|
import {randomUUID} from 'node:crypto';
|
|
import {Pool} from 'pg';
|
|
import {closeDatabase} from '../lib/store.ts';
|
|
|
|
export function useTestDatabase(label:string){
|
|
let url:string,schema:string;
|
|
before(async()=>{
|
|
if(!process.env.TEST_DATABASE_URL)throw new Error('Tests require a dedicated local TEST_DATABASE_URL');
|
|
const target=new URL(process.env.TEST_DATABASE_URL);
|
|
if(!['127.0.0.1','localhost'].includes(target.hostname)||target.pathname!=='/sverka_test')throw new Error('Tests must use the isolated local sverka_test database');
|
|
schema='sverka_test_'+label+'_'+randomUUID().replaceAll('-','');url=target.href;
|
|
const admin=new Pool({connectionString:url});
|
|
try{await admin.query(`CREATE SCHEMA "${schema}"`);}finally{await admin.end();}
|
|
target.searchParams.set('options','-c search_path='+schema);process.env.DATABASE_URL=target.href;
|
|
});
|
|
after(async()=>{
|
|
await closeDatabase();
|
|
if(!url||!schema)return;
|
|
const admin=new Pool({connectionString:url});
|
|
try{await admin.query(`DROP SCHEMA "${schema}" CASCADE`);}finally{await admin.end();}
|
|
});
|
|
}
|