Tests schreiben nicht mehr in die Entwicklungsdatenbank
Die Testläufe hatten dort 70 erfundene Rollen, 112 Nutzer und 40 Akten hinterlassen. Die Rollenverwaltung zeigte deshalb "Gast" siebzehnmal, echte Rollen doppelt und in willkürlicher Reihenfolge. Aufräumen allein reicht nicht: CaseEntry, CaseEntryVersion und AuditLog lassen sich nach harter Regel 2 nicht löschen. Was ein Test dort anlegt, bleibt für immer stehen - in Phase 2 hätte das die Fallliste unbrauchbar gemacht. Tests laufen deshalb gegen <datenbank>_test auf demselben Server. pnpm test legt sie an, migriert und seedet sie vorher. Über TEST_DATABASE_URL lässt sich ein anderes Ziel setzen. Dazu die Abschnitte der Rollenverwaltung in der Reihenfolge, in der die Abteilung ihre Rollen aufzählt: Ränge, Zugehörigkeit, Zugang. Innerhalb eines Abschnitts entscheidet die Position auf dem Discord-Server, oben die höchste. Damit steht die Hierarchie an einer Stelle, die ohnehin gepflegt wird.
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
/**
|
||||
* Tests laufen gegen eine **eigene** Datenbank, nicht gegen die der
|
||||
* Entwicklung.
|
||||
*
|
||||
* Der Grund ist nicht Ordnungsliebe: `CaseEntry`, `CaseEntryVersion` und
|
||||
* `AuditLog` lassen sich nach Regel 2 aus CLAUDE.md 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
|
||||
}
|
||||
Reference in New Issue
Block a user