164 lines
6.1 KiB
JavaScript
164 lines
6.1 KiB
JavaScript
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)
|
|
})
|