import { PrismaPg } from "@prisma/adapter-pg"; import { PrismaClient } from "@/generated/prisma/client"; const url = process.env["TEST_DATABASE_URL"] ?? process.env["DATABASE_URL"]; /** * Ohne Testdatenbank ueberspringen sich die Datenbanktests, damit ein schneller * Durchlauf ohne Docker moeglich bleibt. * * In CI waere das gefaehrlich: `pnpm test` ist das Tor vor jedem Commit, und ein * lautloses Ueberspringen saehe genauso gruen aus wie ein bestandener Lauf. * Deshalb dort lieber hart abbrechen. */ if (!url && process.env["CI"]) { throw new Error("TEST_DATABASE_URL fehlt. In CI duerfen die Datenbanktests nicht uebersprungen werden."); } export const datenbankVerfuegbar = Boolean(url); export const testPrisma = new PrismaClient({ adapter: new PrismaPg({ connectionString: url ?? "postgresql://localhost:5432/laufzettel_test", }), }); /** Leert alle Tabellen; die Reihenfolge spielt dank CASCADE keine Rolle. */ export async function datenbankLeeren(): Promise { const tabellen = await testPrisma.$queryRaw<{ tablename: string }[]>` SELECT tablename FROM pg_tables WHERE schemaname = 'public' AND tablename NOT LIKE '_prisma%' `; if (tabellen.length === 0) return; const liste = tabellen.map((t) => `"public"."${t.tablename}"`).join(", "); await testPrisma.$executeRawUnsafe(`TRUNCATE ${liste} RESTART IDENTITY CASCADE`); }