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.
45 lines
1.7 KiB
TypeScript
45 lines
1.7 KiB
TypeScript
/**
|
|
* 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
|
|
}
|