Buchungskalender: Website-Widget mit Kalender und Anfrageformular

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
knsoandClaude Opus 5.5 committed 2026-10-07 14:06:53 +00:00
1 parent d7b5b98187
commit 9b509fefbc
5 files changed
+688

No files matched your search

+88
View File
@@ -0,0 +1,88 @@
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')
})