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