fix: release() absichern, DATABASE_URL Startup-Check, execute-Test hinzugefügt

This commit is contained in:
2026-04-17 08:33:07 +00:00
parent c01befa477
commit 4f739f7b1e
3 changed files with 18 additions and 8 deletions

View File

@@ -1,5 +1,9 @@
import { Pool, type QueryResultRow } from 'pg' import { Pool, type QueryResultRow } from 'pg'
if (!process.env.DATABASE_URL) {
throw new Error('DATABASE_URL muss gesetzt sein')
}
export const pool = new Pool({ connectionString: process.env.DATABASE_URL }) export const pool = new Pool({ connectionString: process.env.DATABASE_URL })
pool.on('error', (err) => { pool.on('error', (err) => {

View File

@@ -53,13 +53,15 @@ describe('withTenant', () => {
).rejects.toThrow('Ungültige tenantId') ).rejects.toThrow('Ungültige tenantId')
}) })
it('gibt dieselbe Client-Instanz an fn weiter (Connection-Isolation)', async () => { it('released PoolClient nach Ausführung', async () => {
let capturedClient: unknown await withTenant('tenant1', async () => {})
await withTenant('tenant1', async (client) => {
capturedClient = client
})
// Client muss nach withTenant released worden sein
expect(mockClient.release).toHaveBeenCalledOnce() expect(mockClient.release).toHaveBeenCalledOnce()
expect(capturedClient).toBeDefined() })
it('execute delegiert an den dedizierten PoolClient', async () => {
await withTenant('abc123', async (client) => {
await client.execute('DELETE FROM sessions WHERE expired = true')
})
expect(mockClient.query).toHaveBeenCalledWith('DELETE FROM sessions WHERE expired = true')
}) })
}) })

View File

@@ -29,6 +29,10 @@ export async function withTenant<T>(
} catch (resetErr) { } catch (resetErr) {
console.error({ msg: 'search_path reset failed', error: (resetErr as Error).message }) console.error({ msg: 'search_path reset failed', error: (resetErr as Error).message })
} }
client.release() try {
client.release()
} catch (releaseErr) {
console.error({ msg: 'Pool client release failed', error: (releaseErr as Error).message })
}
} }
} }