/** * Smoke-Checks für Teilaufgabe 04 (Kalenderregeln). * Bündelt die echten Module via esbuild und prüft die Abnahmekriterien. */ import { execSync } from "node:child_process"; import { mkdirSync, rmSync, writeFileSync } from "node:fs"; import { dirname, join } from "node:path"; import { fileURLToPath, pathToFileURL } from "node:url"; const __dirname = dirname(fileURLToPath(import.meta.url)); const webRoot = join(__dirname, ".."); const outDir = join(__dirname, ".tmp-verify"); const entry = join(outDir, "entry.mjs"); const bundle = join(outDir, "bundle.mjs"); function assert(cond, msg) { if (!cond) throw new Error(`FAIL: ${msg}`); } mkdirSync(outDir, { recursive: true }); writeFileSync( entry, ` export { feiertagActivityLine, firstOpenDay, getDayType, getPublicHoliday, getWeekNumber, isInSchoolHoliday, isWeekend, weekNeedsSchool, weekWorkdays, } from "../../src/lib/calendar.ts"; export { createEmptyWeek } from "../../src/lib/storage.ts"; export { pickRandomSuggestions } from "../../src/lib/suggest.ts"; export { buildActivityLines, buildSchoolTopics } from "../../src/lib/weekExport.ts"; `, ); execSync( `npx esbuild "${entry}" --bundle --platform=node --format=esm --outfile="${bundle}"`, { cwd: webRoot, stdio: "inherit" }, ); const m = await import(pathToFileURL(bundle).href); // 1) Normale Schulwoche nach Osterferien const schoolWeek = "2026-04-13"; assert( JSON.stringify(m.weekWorkdays(schoolWeek).map(m.getDayType)) === JSON.stringify(["betrieb", "schule", "betrieb", "schule", "betrieb"]), "Schulwoche 13.04.2026: Di/Do = Schule", ); assert(m.weekNeedsSchool(schoolWeek) === true, "Schulwoche braucht Schule"); // 2) Ferien → Betrieb auch Di/Do assert(m.isInSchoolHoliday("2026-04-07") === "Osterferien", "Di in Osterferien"); assert(m.getDayType("2026-04-07") === "betrieb", "Di Ferien = Betrieb"); assert(m.getDayType("2026-04-09") === "betrieb", "Do Ferien = Betrieb"); // 3) Wochenende überspringen assert(m.isWeekend("2026-04-11") && m.isWeekend("2026-04-12"), "Sa/So"); assert( !m.weekWorkdays("2026-04-06").includes("2026-04-11"), "Sa nicht in Workdays", ); // 4) Abnahme Woche 79 const w79 = "2026-04-06"; assert(m.getWeekNumber(w79) === 79, "Wochennummer 79"); assert(m.firstOpenDay() === "2026-04-06", "Starttag nach Heft 78"); assert(m.getDayType(w79) === "feiertag", "Ostermontag Feiertag"); assert(m.getPublicHoliday(w79) === "Ostermontag", "Ostermontag Name"); assert( m.weekWorkdays(w79).slice(1).every((d) => m.getDayType(d) === "betrieb"), "Rest Woche 79 = Betrieb", ); assert(m.weekNeedsSchool(w79) === false, "Woche 79 keine Schule"); assert( JSON.stringify(m.createEmptyWeek(w79).schoolTopics) === JSON.stringify(["Ferien"]), "Berufsschule-Feld = Ferien", ); assert(m.feiertagActivityLine(w79) === "Montag Feiertag", "Feiertag-Zeile"); // 5) Export-Zeilen const week = m.createEmptyWeek(w79); week.activities = ["Reifenlager inventarisiert"]; assert( JSON.stringify(m.buildActivityLines(week)) === JSON.stringify(["Reifenlager inventarisiert", "Montag Feiertag"]), "Export enthält Montag Feiertag", ); assert( JSON.stringify(m.buildSchoolTopics(week)) === JSON.stringify(["Ferien"]), "Export Schule = Ferien", ); // 6) Vorschlags-Pool const ferienPool = m.pickRandomSuggestions(w79, 8, [], []); assert( ferienPool.every((s) => s.type === "betrieb"), "Ferienwoche: nur Betrieb-Vorschläge", ); const schulPool = m.pickRandomSuggestions(schoolWeek, 8, [], []); assert( schulPool.some((s) => s.type === "schule") && schulPool.some((s) => s.type === "betrieb"), "Schulwoche: Betrieb + Schule im Pool", ); // 7) Wochennummern relativ zu 78 assert(m.getWeekNumber("2026-03-30") === 78, "Woche 78"); assert(m.getWeekNumber("2026-04-13") === 80, "Woche 80"); // 8) Pflicht-Feiertage 2026 for (const iso of [ "2026-01-01", "2026-01-06", "2026-04-03", "2026-04-06", "2026-05-01", "2026-05-14", "2026-05-25", "2026-06-04", "2026-10-03", "2026-11-01", "2026-12-25", "2026-12-26", ]) { assert(Boolean(m.getPublicHoliday(iso)), `Feiertag ${iso}`); assert(m.getDayType(iso) === "feiertag", `Typ Feiertag ${iso}`); } rmSync(outDir, { recursive: true, force: true }); console.log("OK – alle Kalender-Smoke-Checks bestanden.");