import { test, beforeEach, afterEach } from 'node:test' import assert from 'node:assert/strict' import { config } from '../server/config.js' import { unterkunftFuerKunde, unterkunftModus } from '../server/services/unterkunft/schalter.js' const UK_ENV = [ 'UNTERKUNFT_ENABLED', 'UNTERKUNFT_PILOT_EMAILS', 'UNTERKUNFT_FORM_MIN_SEKUNDEN', 'UNTERKUNFT_MIN_ANTWORT_MS', 'APPWRITE_COLLECTION_UK_UNTERKUENFTE', 'APPWRITE_COLLECTION_UK_PREISE', 'APPWRITE_COLLECTION_UK_SPERREN', 'APPWRITE_COLLECTION_UK_ANFRAGEN', 'APPWRITE_COLLECTION_UK_RECHNUNGEN', 'APPWRITE_COLLECTION_UK_EINSTELLUNGEN', ] let original beforeEach(() => { original = { ...config.unterkunft } }) afterEach(() => { Object.assign(config.unterkunft, original) }) /** Frische config.js-Instanz mit genau diesen Umgebungsvariablen (alle anderen des Moduls entfernt). */ let freshCounter = 0 async function freshConfig(env = {}) { const saved = Object.fromEntries(UK_ENV.map((key) => [key, process.env[key]])) for (const key of UK_ENV) delete process.env[key] Object.assign(process.env, env) try { freshCounter += 1 return (await import(`../server/config.js?uk-test=${freshCounter}`)).config } finally { for (const key of UK_ENV) { if (saved[key] === undefined) delete process.env[key] else process.env[key] = saved[key] } } } test('Konfiguration: Vorgaben ohne Umgebungsvariablen', async () => { const fresh = await freshConfig() assert.deepEqual(fresh.unterkunft, { mode: 'off', pilotEmails: [], fassung: '2026-10-07', formMinSekunden: 3, minAntwortMs: 300, icalIntervallMin: 15, icalMaxBytes: 1_000_000, icalTimeoutMs: 10_000, icalFehlerStunden: 6, horizontMonate: 18, maxPosten: 30, postenTextMax: 200, nachrichtMax: 2000, anfragenJeSiteStunde: 30, ipHashTage: 30, unverbindlichMonate: 6, neuVerfallTage: 60, aufbewahrungDeckel: 500, anonymisierenJahre: 3, rechnungJahre: 8, loeschTageNachAbschalten: 90, }) assert.equal(fresh.collections.ukUnterkuenfte, 'ukUnterkuenfte') assert.equal(fresh.collections.ukPreise, 'ukPreise') assert.equal(fresh.collections.ukSperren, 'ukSperren') assert.equal(fresh.collections.ukAnfragen, 'ukAnfragen') assert.equal(fresh.collections.ukRechnungen, 'ukRechnungen') assert.equal(fresh.collections.ukEinstellungen, 'ukEinstellungen') }) test('Konfiguration: Umgebungsvariablen werden gelesen und bereinigt', async () => { const fresh = await freshConfig({ UNTERKUNFT_ENABLED: ' Pilot ', UNTERKUNFT_PILOT_EMAILS: ' Kenso.Gri@Gmail.com, ,justin@webklar.com ', UNTERKUNFT_FORM_MIN_SEKUNDEN: '0', UNTERKUNFT_MIN_ANTWORT_MS: '0', APPWRITE_COLLECTION_UK_UNTERKUENFTE: 'u1', APPWRITE_COLLECTION_UK_PREISE: 'u2', APPWRITE_COLLECTION_UK_SPERREN: 'u3', APPWRITE_COLLECTION_UK_ANFRAGEN: 'u4', APPWRITE_COLLECTION_UK_RECHNUNGEN: 'u5', APPWRITE_COLLECTION_UK_EINSTELLUNGEN: 'u6', }) assert.equal(fresh.unterkunft.mode, 'pilot') assert.deepEqual(fresh.unterkunft.pilotEmails, ['kenso.gri@gmail.com', 'justin@webklar.com']) assert.equal(fresh.unterkunft.formMinSekunden, 0) assert.equal(fresh.unterkunft.minAntwortMs, 0) const c = fresh.collections assert.deepEqual([c.ukUnterkuenfte, c.ukPreise, c.ukSperren, c.ukAnfragen, c.ukRechnungen, c.ukEinstellungen], ['u1', 'u2', 'u3', 'u4', 'u5', 'u6']) }) test('Konfiguration: leerer oder unbekannter Schalter ist off', async () => { for (const value of ['', ' ', 'banane', 'true', '1', 'ON ']) { const fresh = await freshConfig({ UNTERKUNFT_ENABLED: value }) assert.equal(fresh.unterkunft.mode, value.trim().toLowerCase() === 'on' ? 'on' : 'off', `UNTERKUNFT_ENABLED=${JSON.stringify(value)}`) } }) test('Konfiguration: Katalogeintrag unterkunftSetup', () => { assert.deepEqual(config.unterkunftSetup, { key: 'unterkunftSetup', name: 'Buchungskalender (Einrichtung)', amountCents: 19900, lookupKey: 'webklar_unterkunft_einrichtung_19900', oneTime: true, priceNickname: 'Buchungskalender-Einrichtung 199 €', }) }) test('unterkunftModus: leer und unbekannt sind off, pilot und on bleiben, Aenderung wirkt sofort', () => { for (const value of [undefined, null, '', 'banane', 'PILOT', 'true']) { config.unterkunft.mode = value assert.equal(unterkunftModus(), 'off', `mode=${JSON.stringify(value)}`) } config.unterkunft.mode = 'pilot' assert.equal(unterkunftModus(), 'pilot') config.unterkunft.mode = 'on' assert.equal(unterkunftModus(), 'on') config.unterkunft.mode = 'off' assert.equal(unterkunftModus(), 'off') }) test('unterkunftFuerKunde: off sperrt alle, auch mit Stern in der Liste', () => { config.unterkunft.mode = 'off' config.unterkunft.pilotEmails = ['*', 'kenso.gri@gmail.com'] assert.equal(unterkunftFuerKunde('kenso.gri@gmail.com'), false) assert.equal(unterkunftFuerKunde('jemand@example.com'), false) }) test('unterkunftFuerKunde: pilot erlaubt nur Adressen der Liste, Schreibweise egal', () => { config.unterkunft.mode = 'pilot' config.unterkunft.pilotEmails = ['kenso.gri@gmail.com'] assert.equal(unterkunftFuerKunde('kenso.gri@gmail.com'), true) assert.equal(unterkunftFuerKunde(' Kenso.Gri@Gmail.com '), true) assert.equal(unterkunftFuerKunde('jemand@example.com'), false) assert.equal(unterkunftFuerKunde(''), false) assert.equal(unterkunftFuerKunde(undefined), false) assert.equal(unterkunftFuerKunde(null), false) }) test('unterkunftFuerKunde: pilot mit leerer Liste laesst niemanden durch, Stern alle', () => { config.unterkunft.mode = 'pilot' config.unterkunft.pilotEmails = [] assert.equal(unterkunftFuerKunde('kenso.gri@gmail.com'), false) config.unterkunft.pilotEmails = ['*'] assert.equal(unterkunftFuerKunde('jemand@example.com'), true) assert.equal(unterkunftFuerKunde(''), true) }) test('unterkunftFuerKunde: on erlaubt alle Kunden; unbekannter Modus gilt als off', () => { config.unterkunft.mode = 'on' config.unterkunft.pilotEmails = [] assert.equal(unterkunftFuerKunde('jemand@example.com'), true) config.unterkunft.mode = 'banane' config.unterkunft.pilotEmails = ['*'] assert.equal(unterkunftFuerKunde('kenso.gri@gmail.com'), false) })