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

68 lines (67 loc) 2.21 kB
import { DbAdmin } from './admin'; import { getPgEnvOptions, getConnEnvOptions } from '@launchql/types'; import { PgTestConnector } from './manager'; import { randomUUID } from 'crypto'; import { teardownPgPools } from '@launchql/server-utils'; 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); // Main admin client (optional unless needed elsewhere) manager = PgTestConnector.getInstance(); const pg = manager.getClient(config); if (seedAdapters.length) { await seed.compose(seedAdapters).seed({ connect: connOpts, admin, config: config, pg: manager.getClient(config) }); } // App user connection const db = manager.getClient({ ...config, user: connOpts.connection.user, password: connOpts.connection.password }); db.setContext({ role: 'anonymous' }); const teardown = async () => { await teardownPgPools(); await manager.closeAll(); }; return { pg, db, teardown, manager, admin }; };