UNPKG

pgsql-test

Version:

pgsql-test offers isolated, role-aware, and rollback-friendly PostgreSQL environments for integration tests — giving developers realistic test coverage without external state pollution

74 lines (73 loc) 2.3 kB
import { getConnEnvOptions } from '@launchql/env'; import { randomUUID } from 'crypto'; import { teardownPgPools } from 'pg-cache'; import { getPgEnvOptions, } from 'pg-env'; import { DbAdmin } from './admin'; import { PgTestConnector } from './manager'; import { seed } from './seed'; let manager; export const getPgRootAdmin = (connOpts = {}) => { const opts = getPgEnvOptions({ database: connOpts.rootDb }); const admin = new DbAdmin(opts); return admin; }; const getConnOopts = (cn = {}) => { const connect = getConnEnvOptions(cn.db); const config = getPgEnvOptions({ database: `${connect.prefix}${randomUUID()}`, ...cn.pg }); return { pg: config, db: connect }; }; export const getConnections = async (cn = {}, seedAdapters = [seed.launchql()]) => { cn = getConnOopts(cn); const config = cn.pg; const connOpts = cn.db; const root = getPgRootAdmin(connOpts); await root.createUserRole(connOpts.connection.user, connOpts.connection.password, connOpts.rootDb); const admin = new DbAdmin(config); if (process.env.TEST_DB) { config.database = process.env.TEST_DB; } else if (connOpts.template) { admin.createFromTemplate(connOpts.template, config.database); } else { admin.create(config.database); admin.installExtensions(connOpts.extensions); } await admin.grantConnect(connOpts.connection.user, config.database); manager = PgTestConnector.getInstance(); const pg = manager.getClient(config); const teardown = async () => { manager.beginTeardown(); await teardownPgPools(); await manager.closeAll(); }; if (seedAdapters.length) { try { await seed.compose(seedAdapters).seed({ connect: connOpts, admin, config: config, pg: manager.getClient(config) }); } catch (error) { await teardown(); throw error; } } const db = manager.getClient({ ...config, user: connOpts.connection.user, password: connOpts.connection.password }); db.setContext({ role: 'anonymous' }); return { pg, db, teardown, manager, admin }; };