Skip to content

Commit 8723543

Browse files
authored
Merge pull request #1175 from jotel-dev/837-backend-pg-pool-created-without-max-idle-connection-statement-timeout-settings
837 backend pg pool created without max idle connection statement timeout settings
2 parents 5d285d0 + 2d070e9 commit 8723543

3 files changed

Lines changed: 58 additions & 10 deletions

File tree

backend/src/lib/pg-pool.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,16 @@ const parsePositiveIntegerEnv = (name: string, defaultValue: number): number =>
1010
return Number.isInteger(parsedValue) && parsedValue > 0 ? parsedValue : defaultValue;
1111
};
1212

13-
export const createPgPoolConfig = (): pg.PoolConfig => ({
13+
export const createPgPoolConfig = (overrides?: Partial<pg.PoolConfig>): pg.PoolConfig => ({
1414
connectionString: process.env.DATABASE_URL,
1515
max: parsePositiveIntegerEnv('PG_POOL_MAX', 10),
1616
idleTimeoutMillis: parsePositiveIntegerEnv('PG_IDLE_TIMEOUT_MS', 30_000),
1717
connectionTimeoutMillis: parsePositiveIntegerEnv('PG_CONNECTION_TIMEOUT_MS', 5_000),
1818
statement_timeout: parsePositiveIntegerEnv('PG_STATEMENT_TIMEOUT_MS', 30_000),
19+
...overrides,
1920
});
2021

21-
export const createPgPool = () => new pg.Pool(createPgPoolConfig());
22+
export const createPgPool = (overrides?: Partial<pg.PoolConfig>) => new pg.Pool(createPgPoolConfig(overrides));
2223

2324
export interface PoolMetrics {
2425
totalCount: number;

backend/tests/integration/stream-lifecycle.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,8 +251,9 @@ describe("Stream Lifecycle Integration Tests", () => {
251251
const { PrismaClient } = await import(
252252
"../../src/generated/prisma/index.js"
253253
);
254+
const { createPgPool } = await import("../../src/lib/pg-pool.js");
254255
const connectionString = resolveTestDatabaseUrl();
255-
testPool = new pg.Pool({ connectionString });
256+
testPool = createPgPool({ connectionString });
256257
const testAdapter = new PrismaPg(testPool);
257258
testPrisma = new PrismaClient({
258259
adapter: testAdapter,

backend/tests/pg-pool.test.ts

Lines changed: 53 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,25 +23,71 @@ describe('pg-pool', () => {
2323
vi.unstubAllEnvs();
2424
});
2525

26-
it('createPgPoolConfig reflects an overridden DATABASE_URL', async () => {
27-
vi.stubEnv('DATABASE_URL', 'postgresql://test:test@localhost:5432/test_db');
26+
it('createPgPoolConfig returns sane default pool settings when env vars are unset', async () => {
27+
const { createPgPoolConfig } = await import('../src/lib/pg-pool.js');
28+
const config = createPgPoolConfig();
29+
30+
expect(config.max).toBe(10);
31+
expect(config.idleTimeoutMillis).toBe(30_000);
32+
expect(config.connectionTimeoutMillis).toBe(5_000);
33+
expect(config.statement_timeout).toBe(30_000);
34+
});
35+
36+
it('createPgPoolConfig reflects custom env variable overrides', async () => {
37+
vi.stubEnv('PG_POOL_MAX', '25');
38+
vi.stubEnv('PG_IDLE_TIMEOUT_MS', '60000');
39+
vi.stubEnv('PG_CONNECTION_TIMEOUT_MS', '10000');
40+
vi.stubEnv('PG_STATEMENT_TIMEOUT_MS', '15000');
2841

2942
const { createPgPoolConfig } = await import('../src/lib/pg-pool.js');
43+
const config = createPgPoolConfig();
3044

31-
expect(createPgPoolConfig().connectionString).toBe(
32-
'postgresql://test:test@localhost:5432/test_db',
33-
);
45+
expect(config.max).toBe(25);
46+
expect(config.idleTimeoutMillis).toBe(60_000);
47+
expect(config.connectionTimeoutMillis).toBe(10_000);
48+
expect(config.statement_timeout).toBe(15_000);
49+
});
50+
51+
it('createPgPoolConfig falls back to defaults when env variables are invalid or non-positive', async () => {
52+
vi.stubEnv('PG_POOL_MAX', 'invalid_number');
53+
vi.stubEnv('PG_IDLE_TIMEOUT_MS', '-5000');
54+
vi.stubEnv('PG_CONNECTION_TIMEOUT_MS', '0');
55+
vi.stubEnv('PG_STATEMENT_TIMEOUT_MS', 'abc');
56+
57+
const { createPgPoolConfig } = await import('../src/lib/pg-pool.js');
58+
const config = createPgPoolConfig();
59+
60+
expect(config.max).toBe(10);
61+
expect(config.idleTimeoutMillis).toBe(30_000);
62+
expect(config.connectionTimeoutMillis).toBe(5_000);
63+
expect(config.statement_timeout).toBe(30_000);
3464
});
3565

36-
it('createPgPool constructs pg.Pool with the configured DATABASE_URL without opening a real connection', async () => {
66+
it('createPgPool constructs pg.Pool with default pool configuration settings', async () => {
3767
vi.stubEnv('DATABASE_URL', 'postgresql://test:test@localhost:5432/test_db');
3868

3969
const { createPgPool } = await import('../src/lib/pg-pool.js');
4070
createPgPool();
4171

72+
expect(poolCtorSpy).toHaveBeenCalledWith({
73+
connectionString: 'postgresql://test:test@localhost:5432/test_db',
74+
max: 10,
75+
idleTimeoutMillis: 30_000,
76+
connectionTimeoutMillis: 5_000,
77+
statement_timeout: 30_000,
78+
});
79+
});
80+
81+
it('createPgPool applies config overrides when provided', async () => {
82+
const { createPgPool } = await import('../src/lib/pg-pool.js');
83+
createPgPool({ max: 5, statement_timeout: 5000 });
84+
4285
expect(poolCtorSpy).toHaveBeenCalledWith(
4386
expect.objectContaining({
44-
connectionString: 'postgresql://test:test@localhost:5432/test_db',
87+
max: 5,
88+
statement_timeout: 5000,
89+
idleTimeoutMillis: 30_000,
90+
connectionTimeoutMillis: 5_000,
4591
}),
4692
);
4793
});

0 commit comments

Comments
 (0)