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

79 lines (78 loc) 2.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getConnections = exports.getPgRootAdmin = void 0; const env_1 = require("@launchql/env"); const crypto_1 = require("crypto"); const pg_cache_1 = require("pg-cache"); const pg_env_1 = require("pg-env"); const admin_1 = require("./admin"); const manager_1 = require("./manager"); const seed_1 = require("./seed"); let manager; const getPgRootAdmin = (connOpts = {}) => { const opts = (0, pg_env_1.getPgEnvOptions)({ database: connOpts.rootDb }); const admin = new admin_1.DbAdmin(opts); return admin; }; exports.getPgRootAdmin = getPgRootAdmin; const getConnOopts = (cn = {}) => { const connect = (0, env_1.getConnEnvOptions)(cn.db); const config = (0, pg_env_1.getPgEnvOptions)({ database: `${connect.prefix}${(0, crypto_1.randomUUID)()}`, ...cn.pg }); return { pg: config, db: connect }; }; const getConnections = async (cn = {}, seedAdapters = [seed_1.seed.launchql()]) => { cn = getConnOopts(cn); const config = cn.pg; const connOpts = cn.db; const root = (0, exports.getPgRootAdmin)(connOpts); await root.createUserRole(connOpts.connection.user, connOpts.connection.password, connOpts.rootDb); const admin = new admin_1.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 = manager_1.PgTestConnector.getInstance(); const pg = manager.getClient(config); const teardown = async () => { manager.beginTeardown(); await (0, pg_cache_1.teardownPgPools)(); await manager.closeAll(); }; if (seedAdapters.length) { try { await seed_1.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 }; }; exports.getConnections = getConnections;