/** * Tests laufen gegen eine **eigene** Datenbank, nicht gegen die der * Entwicklung. * * Der Grund ist nicht Ordnungsliebe: `CaseEntry`, `CaseEntryVersion` und * `AuditLog` lassen sich nach Zusicherung 2 der README nicht löschen. Was ein Test * dort anlegt, bleibt für immer stehen. In einer gemeinsamen Datenbank * verstopfen die Testakten binnen weniger Läufe die Fallliste, und aufräumen * lässt sich das nicht mehr. * * Ohne `TEST_DATABASE_URL` wird der Name der Entwicklungsdatenbank um `_test` * ergänzt. Sie liegt also auf demselben Server, aber getrennt. */ export function resolveTestDatabaseUrl(source = process.env.DATABASE_URL): string { const explicit = process.env.TEST_DATABASE_URL if (explicit) return explicit if (!source) { throw new Error('Konfiguration unvollständig: DATABASE_URL oder TEST_DATABASE_URL fehlt') } const url = new URL(source) const name = url.pathname.replace(/^\//, '') if (!name) throw new Error(`DATABASE_URL nennt keine Datenbank: ${source}`) if (name.endsWith('_test')) return url.toString() url.pathname = `/${name}_test` // pgbouncer im Transaktionsmodus taugt nicht zum Anlegen von Datenbanken // und nicht für LISTEN. Für Tests wird direkt verbunden. url.searchParams.delete('pgbouncer') return url.toString() } /** * Setzt die Umgebung eines Testlaufs auf die Testdatenbank um. Muss laufen, * bevor irgendein Modul einen Prisma-Client baut - deshalb gehört der Aufruf * in die `setupFiles` von Vitest, nicht in eine einzelne Testdatei. */ export function switchToTestDatabase(): string { const url = resolveTestDatabaseUrl() process.env.DATABASE_URL = url process.env.DIRECT_DATABASE_URL = url return url }