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.
55 lines
1.8 KiB
JavaScript
55 lines
1.8 KiB
JavaScript
import { execFileSync } from 'node:child_process'
|
|
import { createRequire } from 'node:module'
|
|
import { fileURLToPath } from 'node:url'
|
|
import pg from 'pg'
|
|
import { loadEnvFromRepoRoot } from '../dist/loadEnv.js'
|
|
import { resolveTestDatabaseUrl } from '../dist/testDatabase.js'
|
|
|
|
/**
|
|
* Legt die Testdatenbank an, falls sie fehlt, und bringt sie auf den aktuellen
|
|
* Migrationsstand. Wird von `pnpm test` vorgeschaltet.
|
|
*
|
|
* Läuft nur in der Entwicklung und in der CI, nie im Betrieb.
|
|
*/
|
|
loadEnvFromRepoRoot()
|
|
|
|
const testUrl = resolveTestDatabaseUrl()
|
|
const dbName = new URL(testUrl).pathname.replace(/^\//, '')
|
|
|
|
const maintenance = new URL(testUrl)
|
|
maintenance.pathname = '/postgres'
|
|
|
|
const client = new pg.Client({ connectionString: maintenance.toString() })
|
|
await client.connect()
|
|
try {
|
|
const { rowCount } = await client.query('SELECT 1 FROM pg_database WHERE datname = $1', [dbName])
|
|
if (rowCount === 0) {
|
|
// Bezeichner lassen sich nicht als Parameter binden, deshalb quotiert.
|
|
await client.query(`CREATE DATABASE "${dbName.replace(/"/g, '""')}"`)
|
|
console.log(`[test-db] ${dbName} angelegt`)
|
|
}
|
|
} finally {
|
|
await client.end()
|
|
}
|
|
|
|
const require = createRequire(import.meta.url)
|
|
const prismaCli = require.resolve('prisma/build/index.js')
|
|
|
|
const testEnv = { ...process.env, DATABASE_URL: testUrl, DIRECT_DATABASE_URL: testUrl }
|
|
|
|
execFileSync(process.execPath, [prismaCli, 'migrate', 'deploy'], {
|
|
stdio: 'inherit',
|
|
env: testEnv,
|
|
})
|
|
|
|
// Der Auslieferungszustand gehört auch in die Testdatenbank: Freigabestufen und
|
|
// Änderungsrichtlinie werden von Tests vorausgesetzt. Der Seed ist idempotent.
|
|
const tsxCli = require.resolve('tsx/cli')
|
|
execFileSync(process.execPath, [tsxCli, 'prisma/seed.ts'], {
|
|
stdio: 'inherit',
|
|
cwd: fileURLToPath(new URL('..', import.meta.url)),
|
|
env: testEnv,
|
|
})
|
|
|
|
console.log(`[test-db] ${dbName} ist auf Stand`)
|