Files
Webklar-Kundenbereich/test/unterkunftSchalter.test.js
T

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)
})