Integrationstests gegen eine Postgres-Instanz im Speicher

Die Tests starten Postgres per PGlite und sprechen es ueber einen lokalen Port
an, laufen also ohne Docker und ohne installierte Datenbank.

Abgedeckt sind die Guthaben-Regeln, der CC-Lebenszyklus samt Reaktivierung,
Stornos und Ruecknahmen, Anmeldung mit CSRF- und Rollenpruefung sowie der
Import mit Dedup.
This commit is contained in:
2026-09-18 11:37:43 +02:00
parent 245666d363
commit b988a82765
4 changed files with 813 additions and 0 deletions
+36
View File
@@ -0,0 +1,36 @@
import { readFileSync } from 'node:fs';
import { dirname, join } from 'node:path';
import { fileURLToPath } from 'node:url';
import { PGlite } from '@electric-sql/pglite';
import { PGLiteSocketServer } from '@electric-sql/pglite-socket';
const here = dirname(fileURLToPath(import.meta.url));
const MIGRATION = join(here, '..', 'prisma', 'migrations', '20250101000000_init', 'migration.sql');
export interface TestDatabase {
url: string;
stop: () => Promise<void>;
}
/**
* Startet eine Postgres-Instanz im Speicher und stellt sie ueber einen lokalen
* Port bereit, damit Prisma sich wie an eine echte Datenbank verbindet.
* So laufen die Tests ohne Docker oder installiertes Postgres.
*/
export async function startTestDatabase(port: number): Promise<TestDatabase> {
const db = await PGlite.create();
await db.exec(readFileSync(MIGRATION, 'utf8'));
const server = new PGLiteSocketServer({ db, port, host: '127.0.0.1' });
await server.start();
return {
// connection_limit=1, weil die Testinstanz immer nur eine Verbindung
// gleichzeitig bedient. Echtes Postgres braucht die Einschraenkung nicht.
url: `postgresql://postgres:postgres@127.0.0.1:${port}/postgres?connection_limit=1`,
stop: async () => {
await server.stop();
await db.close();
},
};
}