Files
2026-07-26 18:11:57 +02:00

138 lines
4.2 KiB
JavaScript
Raw Permalink 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.
/**
* 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.");