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
JavaScript
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;
;