// 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());