Files
craftvia/scripts/test-assessment-iso.ts
T
msolarczekandClaude Opus 5 c8e6f30a27
CI / build-and-check (push) Canceled after 0s
CI / audit (push) Canceled after 0s
CI / sbom (push) Canceled after 0s
Basis: Certvia dev@a48c5fb als Fundament für Craftvia
Unveränderter Stand von certvia/dev (a48c5fb) plus Craftvia-Spezifikation
und Brandbook unter docs/craftvia/. ISMS-Module werden im Folgecommit entfernt.

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

61 lines
3.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// B1 Schritt 5/6 — ISO-Bewertung über buildAssessment("ISO_27001"). Prüft Scope (SoA-
// Anwendbarkeit + Klauseln 4–10), Umsetzungsgrad-Kennzahl, leere-SoA-Hinweis und dass
// KEIN TISAX-Vokabular (Reifegrad/AL) in der ISO-Zusammenfassung auftaucht.
//
// Lauf: npx tsx scripts/test-assessment-iso.ts
import "dotenv/config";
import { prisma, dbForTenant } from "../src/server/db";
import { buildAssessment } from "../src/server/assessment";
import { ensureSoaEntries } from "../src/server/soa-statement";
let failures = 0;
const ok = (c: boolean, m: string) => { console.log(`${c ? "✓" : "✗ FEHLER"} ${m}`); if (!c) failures++; };
const SLUG = "b1-test-iso";
async function cleanup() {
const t = await prisma.tenant.findUnique({ where: { slug: SLUG }, select: { id: true } });
if (!t) return;
await prisma.soaEntry.deleteMany({ where: { tenantId: t.id } });
await prisma.tenant.delete({ where: { id: t.id } });
}
async function main() {
await cleanup();
const tenant = await prisma.tenant.create({ data: { name: "B1 ISO", slug: SLUG } });
const t = tenant.id;
const db = dbForTenant(t);
// ── A) Leere SoA → „Anwendbarkeit offen", nicht 0 % ─────────────────────────
const empty = await buildAssessment(db, t, "ISO_27001");
ok(empty.summary.band === "Anwendbarkeit offen" && empty.summary.metricValue === "—", "leere SoA meldet Anwendbarkeit-noch-nicht-erklaert (nicht 0 Prozent)");
// ── B) SoA vorbefüllen → Bewertung rechnet ──────────────────────────────────
await ensureSoaEntries(db, t);
const asm = await buildAssessment(db, t, "ISO_27001");
const clauses = asm.rows.filter((r) => !r.control.startsWith("A."));
const annex = asm.rows.filter((r) => r.control.startsWith("A."));
ok(clauses.length >= 20, `Klauseln 4–10 immer im Scope (${clauses.length})`);
ok(annex.length > 0, `anwendbare Annex-A-Controls im Scope (${annex.length})`);
ok(asm.rows.every((r) => r.verdict.kind === "status"), "jede ISO-Bewertung ist ein Status-Verdict (kein Reifegrad)");
ok(asm.summary.metricLabel === "Umsetzungsgrad" && asm.summary.metricValue.endsWith("%"), `Kennzahl ist der Umsetzungsgrad (${asm.summary.metricValue})`);
// ── C) Einige anwendbare Controls „umgesetzt" → fulfilled steigt ────────────
const applicableAnnex = await prisma.soaEntry.findMany({ where: { tenantId: t, framework: "ISO_27001", applicable: true }, select: { id: true }, take: 5 });
await prisma.soaEntry.updateMany({ where: { id: { in: applicableAnnex.map((s) => s.id) } }, data: { implementationStatus: "umgesetzt" } });
const asm2 = await buildAssessment(db, t, "ISO_27001");
ok(asm2.summary.fulfilled >= 5, `bestätigte Umsetzungen zählen in den Umsetzungsgrad (${asm2.summary.fulfilled} umgesetzt)`);
// ── Kein TISAX-Vokabular in der ISO-Sicht ───────────────────────────────────
const vocab = `${asm2.summary.band} ${asm2.summary.metricLabel} ${asm2.summary.text}`;
ok(!/Reifegrad|AL2|AL3|Prüfziel|Assessment-reif/.test(vocab), "keine Reifegrad-/AL-/Prüfziel-Begriffe in der ISO-Zusammenfassung");
await cleanup();
console.log("\n✓ aufgeräumt (Wegwerf-Mandant entfernt)");
}
main()
.then(() => { console.log(failures === 0 ? "\nISO-Bewertung grün." : `\n${failures} Prüfung(en) fehlgeschlagen.`); process.exit(failures === 0 ? 0 : 1); })
.catch(async (e) => { console.error(e); await cleanup().catch(() => {}); process.exit(1); })
.finally(() => prisma.$disconnect());