@clickup/ent-framework
Version:
A PostgreSQL graph-database-alike library with microsharding and row-level security
76 lines (69 loc) • 2.09 kB
text/typescript
import range from "lodash/range";
import { MASTER } from "../../abstract/Shard";
import { mapJoin } from "../../internal/misc";
import { PgClientPool, type PgClientPoolOptions } from "../PgClientPool";
import { testCluster } from "./test-utils";
let options: PgClientPoolOptions;
beforeEach(async () => {
options = (await testCluster.globalShard().client(MASTER)).options;
});
test("acquireConn does not leak when release() is called", async () => {
await mapJoin(range(1000), async (i) => {
let conn;
try {
const shard = testCluster.shardByNo(2);
const master = await shard.client(MASTER);
conn = await master.acquireConn();
const res = await conn.query("SELECT $1 AS i", [i]);
expect(res.rows[0].i).toEqual(i.toString());
} finally {
// If we comment this out, it will blow up.
conn?.release();
}
});
});
test("static role=master", async () => {
const client = new PgClientPool({
...options,
role: "master",
maxReplicationLagMs: undefined,
});
await client.query({
query: ["SELECT 1"],
isWrite: true,
annotations: [],
op: "",
table: "",
});
expect(client.options.maxReplicationLagMs).toBeLessThan(10000);
expect(await client.timelineManager.currentPos()).toEqual(BigInt(1));
expect(client.role()).toEqual("master");
});
test("static role=replica", async () => {
const client = new PgClientPool({
...options,
role: "replica",
maxReplicationLagMs: 20000,
});
await client.query({
query: ["SELECT 1"],
isWrite: false,
annotations: [],
op: "",
table: "",
});
expect(await client.timelineManager.currentPos()).toEqual(BigInt(0));
expect(client.role()).toEqual("replica");
});
test("dynamic role=unknown", async () => {
const client = new PgClientPool({ ...options, role: "unknown" });
await client.query({
query: ["SELECT 1"],
isWrite: false,
annotations: [],
op: "",
table: "",
});
expect(await client.timelineManager.currentPos()).toBeGreaterThan(BigInt(1));
expect(client.role()).toEqual("master");
});