From 6cf3794a138e483efbd3cde5612e0e1debd413c1 Mon Sep 17 00:00:00 2001 From: Priya Raman Date: Thu, 27 Aug 2026 00:02:31 +0000 Subject: [PATCH] fix(server): close the postgres client before embedded-postgres teardown The native Codex vertical-slice suite stopped the embedded database before ending its own postgres.js client. Stopping the server tears the TCP connection down under the still-open client, and a batched write the driver scheduled via setImmediate can then fire after the socket dropped -- an unhandled "Cannot read properties of null (reading 'write')" that failed the run even though every test passed. Close the client first, matching the fix already applied to the cross-issue-cap postgres suite. Co-authored-by: Paperclip --- .../native-codex-runner.integration.test.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/server/src/services/native-runtime/native-codex-runner.integration.test.ts b/server/src/services/native-runtime/native-codex-runner.integration.test.ts index feafba78c4f..e90c419023c 100644 --- a/server/src/services/native-runtime/native-codex-runner.integration.test.ts +++ b/server/src/services/native-runtime/native-codex-runner.integration.test.ts @@ -90,6 +90,7 @@ describeEmbeddedPostgres("native Codex server vertical slice", () => { let temporary: Awaited> | null = null; let runtimeRoot: string | null = null; let server: Server | null = null; + let db: ReturnType | null = null; beforeAll(async () => { ensureRunnerTestBinaries(); @@ -107,13 +108,21 @@ describeEmbeddedPostgres("native Codex server vertical slice", () => { afterAll(async () => { runnerPrpWebSocketInternals.resetForTests(); await closeServer(server); + // Close the postgres.js pool before stopping the embedded server. Stopping + // the server first tears the TCP connection down under the still-open + // client, and a batched write the driver scheduled via setImmediate can + // then fire after the connection dropped its socket — an unhandled + // `Cannot read properties of null (reading 'write')` that fails the run + // even though every test passed. `end()` waits for in-flight queries and + // closes the sockets from the client side first. + await db?.$client.end(); await temporary?.cleanup(); if (runtimeRoot) await rm(runtimeRoot, { recursive: true, force: true }); }); it("returns a durable result and resumes the provider session on the next run", async () => { if (!temporary || !runtimeRoot) throw new Error("Vertical-slice fixture was not initialized"); - const db = createDb(temporary.connectionString); + db = createDb(temporary.connectionString); const companyId = randomUUID(); const agentId = randomUUID(); const issueId = randomUUID();