fix: release() absichern, DATABASE_URL Startup-Check, execute-Test hinzugefügt
This commit is contained in:
@@ -1,5 +1,9 @@
|
||||
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 })
|
||||
|
||||
pool.on('error', (err) => {
|
||||
|
||||
@@ -53,13 +53,15 @@ describe('withTenant', () => {
|
||||
).rejects.toThrow('Ungültige tenantId')
|
||||
})
|
||||
|
||||
it('gibt dieselbe Client-Instanz an fn weiter (Connection-Isolation)', async () => {
|
||||
let capturedClient: unknown
|
||||
await withTenant('tenant1', async (client) => {
|
||||
capturedClient = client
|
||||
})
|
||||
// Client muss nach withTenant released worden sein
|
||||
it('released PoolClient nach Ausführung', async () => {
|
||||
await withTenant('tenant1', async () => {})
|
||||
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')
|
||||
})
|
||||
})
|
||||
|
||||
@@ -29,6 +29,10 @@ export async function withTenant<T>(
|
||||
} catch (resetErr) {
|
||||
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 })
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user