89 lines
4.5 KiB
JavaScript
89 lines
4.5 KiB
JavaScript
import { test } from 'node:test'
|
||
import assert from 'node:assert/strict'
|
||
import { readFileSync } from 'node:fs'
|
||
import vm from 'node:vm'
|
||
|
||
// Reine Kalenderlogik des Widgets public/embed/unterkunft.js (Task 16): Datei per node:vm laden, data-test="1" macht WKU_LOGIK als __wkuLogik sichtbar.
|
||
const QUELLE = readFileSync(new URL('../public/embed/unterkunft.js', import.meta.url), 'utf8')
|
||
function lade() {
|
||
const doc = { readyState: 'complete', currentScript: { dataset: { test: '1' } }, querySelectorAll: () => [], addEventListener() {} }
|
||
const ctx = vm.createContext({ document: doc, console })
|
||
vm.runInContext(QUELLE, ctx, { filename: 'unterkunft.js' })
|
||
return ctx.__wkuLogik
|
||
}
|
||
const L = lade()
|
||
|
||
test('ohne data-test bleibt die Logik verborgen', () => {
|
||
const doc = { readyState: 'complete', currentScript: { dataset: {} }, querySelectorAll: () => [], addEventListener() {} }
|
||
const ctx = vm.createContext({ document: doc })
|
||
vm.runInContext(QUELLE, ctx)
|
||
assert.equal(ctx.__wkuLogik, undefined)
|
||
})
|
||
|
||
test('monatsRaster: Montag zuerst, 1.11.2026 (Sonntag) hat 6 Leerfelder, 30 Tage', () => {
|
||
const r = L.monatsRaster(2026, 11)
|
||
assert.equal(r.length % 7, 0)
|
||
assert.ok(r.slice(0, 6).every((z) => z.tag === null))
|
||
assert.equal(r[6].tag, '2026-11-01')
|
||
assert.equal(r.filter((z) => z.tag).length, 30)
|
||
assert.equal(L.monatsRaster(2026, 2).filter((z) => z.tag).length, 28)
|
||
assert.equal(L.monatsRaster(2028, 2).filter((z) => z.tag).length, 29)
|
||
assert.equal(L.monatsRaster(2026, 12)[1].tag, '2026-12-01') // 1.12.2026 ist Dienstag
|
||
})
|
||
|
||
test('nachtBelegt: Nacht von von (inklusive) bis bis (exklusive)', () => {
|
||
const b = [{ von: '2026-11-10', bis: '2026-11-12' }]
|
||
assert.equal(L.nachtBelegt('2026-11-09', b), false)
|
||
assert.equal(L.nachtBelegt('2026-11-10', b), true)
|
||
assert.equal(L.nachtBelegt('2026-11-11', b), true)
|
||
assert.equal(L.nachtBelegt('2026-11-12', b), false)
|
||
})
|
||
|
||
test('waehle: Anreise, Abreise, Neustart', () => {
|
||
const b = [{ von: '2026-11-20', bis: '2026-11-25' }]
|
||
let z = L.waehle({}, '2026-11-12', b, 1)
|
||
assert.deepEqual({ von: z.von, bis: z.bis }, { von: '2026-11-12', bis: null })
|
||
z = L.waehle(z, '2026-11-15', b, 1)
|
||
assert.deepEqual({ von: z.von, bis: z.bis }, { von: '2026-11-12', bis: '2026-11-15' })
|
||
z = L.waehle(z, '2026-11-14', b, 1) // dritter Klick = neue Anreise
|
||
assert.deepEqual({ von: z.von, bis: z.bis }, { von: '2026-11-14', bis: null })
|
||
z = L.waehle(z, '2026-11-10', b, 1) // Klick vor Anreise
|
||
assert.deepEqual({ von: z.von, bis: z.bis }, { von: '2026-11-10', bis: null })
|
||
})
|
||
|
||
test('waehle: belegte Nacht dazwischen -> neue Anreise; Abreise am Anreisetag eines Fremdbuchers erlaubt', () => {
|
||
const b = [{ von: '2026-11-20', bis: '2026-11-25' }]
|
||
let z = L.waehle({ von: '2026-11-18', bis: null }, '2026-11-27', b, 1)
|
||
assert.deepEqual({ von: z.von, bis: z.bis }, { von: '2026-11-27', bis: null })
|
||
z = L.waehle({ von: '2026-11-18', bis: null }, '2026-11-20', b, 1) // Nacht 18., 19. frei, Abreise am 20.
|
||
assert.deepEqual({ von: z.von, bis: z.bis }, { von: '2026-11-18', bis: '2026-11-20' })
|
||
z = L.waehle({ von: '2026-11-18', bis: null }, '2026-11-21', b, 1)
|
||
assert.deepEqual({ von: z.von, bis: z.bis }, { von: '2026-11-18', bis: null }) // Nacht 20. belegt, 21. selbst belegt: weder Abreise noch Anreise, Zustand bleibt
|
||
})
|
||
|
||
test('waehle: Anreise auf belegter Nacht nicht moeglich; Anreise am Abreisetag eines Fremdbuchers moeglich', () => {
|
||
const b = [{ von: '2026-11-20', bis: '2026-11-25' }]
|
||
const z1 = L.waehle({}, '2026-11-22', b, 1)
|
||
assert.equal(z1.von, null)
|
||
const z2 = L.waehle({}, '2026-11-25', b, 1)
|
||
assert.equal(z2.von, '2026-11-25')
|
||
})
|
||
|
||
test('waehle: unter den Mindestnaechten -> Hinweis-Zustand, Anreise bleibt', () => {
|
||
const z = L.waehle({ von: '2026-11-12', bis: null }, '2026-11-13', [], 3)
|
||
assert.equal(z.fehler, 'mindestnaechte')
|
||
assert.equal(z.von, '2026-11-12')
|
||
assert.equal(z.bis, null)
|
||
const ok = L.waehle({ von: '2026-11-12', bis: null }, '2026-11-15', [], 3)
|
||
assert.equal(ok.bis, '2026-11-15')
|
||
assert.equal(ok.fehler, undefined)
|
||
})
|
||
|
||
test('zusammenfassung', () => {
|
||
assert.equal(L.zusammenfassung('2026-11-12', '2026-11-30'), '12.–30. Nov. · 18 Nächte')
|
||
assert.equal(L.zusammenfassung('2026-11-28', '2026-12-03'), '28. Nov. – 3. Dez. · 5 Nächte')
|
||
assert.equal(L.zusammenfassung('2026-11-12', '2026-11-13'), '12.–13. Nov. · 1 Nacht')
|
||
assert.equal(L.zusammenfassung('2026-12-30', '2027-01-02'), '30. Dez. 2026 – 2. Jan. 2027 · 3 Nächte')
|
||
assert.equal(L.zusammenfassung('2026-03-01', '2026-03-05').slice(0, 18), '1.–5. März · 4 Näc')
|
||
})
|