Files
craftvia/scripts/test-backup-download.ts
T
msolarczekandClaude Opus 5 1701db0a62 Fundament: Doku, Testanpassungen, Restbereinigung
- AGENTS.md und README.md auf Craftvia umgeschrieben (Regeln, Andockpunkte,
  Stack mit Garage, tsx-Tests, Gate, Demo-Logins)
- ISMS-Dokumente entfernt (SPEC, Prototypen, Lane-Prompts, Übergaben, Konzepte
  Incidents/Framework); Fundament-Doku (Deploy, Sicherheit, Backup, Identity) bleibt
- Fundament-Tests an Craftvia-Rollen/Branding angepasst, Resttreffer
  certvia/isms in Skripten und Kommentaren bereinigt

Gate: prisma generate, migrate status, tsc, lint, build, 22/22 Testskripte grün.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 11:44:58 +02:00

30 lines
1.5 KiB
TypeScript

// Direkt-Download-Pfad: exportTenant(persist:false) liefert das verschlüsselte
// Artefakt als Buffer OHNE Store-Roundtrip (Grundlage der /api/platform/backup/download-Route).
// Lauf: npx tsx scripts/test-backup-download.ts (nutzt lokale Craftvia-DB)
import "dotenv/config";
import { prisma } from "../src/server/db";
import { exportTenant } from "../src/server/backup/export";
let failures = 0;
const ok = (cond: boolean, msg: string) => {
console.log(`${cond ? "✓" : "✗ FEHLER"} ${msg}`);
if (!cond) failures++;
};
async function main() {
const demo = await prisma.tenant.findFirst({ where: { slug: "demo" }, select: { id: true } });
if (!demo) throw new Error("Mandant 'demo' fehlt — bitte seeden.");
const res = await exportTenant(demo.id, { persist: false });
ok(res.artifact.length > 1000, `Artefakt hat Bytes (${res.artifact.length})`);
ok(res.artifact.subarray(0, 4).toString("utf8") === "CVB1", `verschlüsselter Kopf „CVB1" (hex ${res.artifact.subarray(0, 4).toString("hex")})`);
ok(res.artifactKey === null, "persist:false → NICHT im Store abgelegt (artifactKey === null)");
ok((res.manifest.totalRows ?? 0) > 0, `Manifest: Zeilen > 0 (${res.manifest.totalRows})`);
ok(res.snapshotId.length > 0, `snapshotId für den Dateinamen vorhanden (${res.snapshotId})`);
await prisma.$disconnect();
console.log(failures === 0 ? "\nAlle grün." : `\n${failures} FEHLER`);
process.exit(failures === 0 ? 0 : 1);
}
main().catch((e) => { console.error(e); process.exit(1); });