DittoPglite: test that queries reject after it's closed

This commit is contained in:
Alex Gleason 2025-03-05 13:37:24 -06:00
parent 4e0479f7c8
commit 0b72533b05
No known key found for this signature in database
GPG key ID: 7211D1F99744FBB7
2 changed files with 24 additions and 6 deletions

View file

@ -1,14 +1,22 @@
import { assertEquals } from '@std/assert'; import { assertEquals, assertRejects } from '@std/assert';
import { DittoPglite } from './DittoPglite.ts'; import { DittoPglite } from './DittoPglite.ts';
Deno.test('DittoPglite', async () => { Deno.test('DittoPglite', async () => {
const db = new DittoPglite('memory://'); await using db = new DittoPglite('memory://');
await db.migrate(); await db.migrate();
assertEquals(db.poolSize, 1); assertEquals(db.poolSize, 1);
assertEquals(db.availableConnections, 1); assertEquals(db.availableConnections, 1);
});
await db.kysely.destroy();
await new Promise((resolve) => setTimeout(resolve, 100)); Deno.test('DittoPglite query after closing', async () => {
const db = new DittoPglite('memory://');
await db[Symbol.asyncDispose]();
await assertRejects(
() => db.kysely.selectFrom('nostr_events').selectAll().execute(),
Error,
'PGlite is closed',
);
}); });

View file

@ -47,6 +47,16 @@ export class DittoPglite implements DittoDB {
} }
async [Symbol.asyncDispose](): Promise<void> { async [Symbol.asyncDispose](): Promise<void> {
try {
// FIXME: `kysely.destroy()` calls `pglite.close()` internally, but it doesn't work.
await this.pglite.close();
await this.kysely.destroy(); await this.kysely.destroy();
} catch (e) {
if (e instanceof Error && e.message === 'PGlite is closed') {
// Make dispose idempotent.
} else {
throw e;
}
}
} }
} }