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