Buchungskalender: Abgleich – Testprotokoll der Mails und Config-Vorgaben

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
knsoandClaude Opus 5.5 committed 2026-10-07 14:51:44 +00:00
1 parent 83cdab405b
commit d27f6d5ddb
2 files changed
+16 -5

No files matched your search

+15 -5
View File
@@ -5,6 +5,7 @@ import { startAppwriteMock } from './support/appwriteMock.js'
import { startFakeStripe } from './support/fakeStripe.js'
import { useTestEnv } from './support/testEnv.js'
import { schemaKeys } from './support/schema.js'
import { mailSink } from './support/mailSink.js'
// Buchungskalender Task 9: iCal-Parser/-Export (ical.js), Abruf + Abgleich (icalAbgleich.js), Export-Route (unterkunftSeite.js)
const NAMEN = ['portalFeatures', 'ukEinstellungen', 'ukUnterkuenfte', 'ukSperren', 'ukAnfragen', 'customers', 'websiteProjects']
@@ -20,17 +21,20 @@ const { config } = await import('../server/config.js')
const { startTestApp, rawGet } = await import('./support/testApp.js')
const { deleteDocument, updateDocument } = await import('../server/services/appwriteAdmin.js')
const mails = await import('../server/services/unterkunft/mails.js')
const { setMailTransportForTests } = await import('../server/services/mailer.js')
const { warteAufVersand } = await import('../server/services/termine/outbox.js')
const { parseIcs, baueIcs } = await import('../server/services/unterkunft/ical.js')
const { holeIcs, gleicheAb, gleicheAlleAb, istPrivateAdresse } = await import('../server/services/unterkunft/icalAbgleich.js')
const { viertelstundenJob } = await import('../server/services/unterkunft/jobs.js')
const { unterkunftSeiteRouter } = await import('../server/routes/unterkunftSeite.js')
const { ladeUnterkunft, listeSperren, ladeEinstellungen } = await import('../server/services/unterkunft/speicher.js')
const app = await startTestApp({ '/': unterkunftSeiteRouter() })
after(() => Promise.all([app.close(), aw.close(), st.close()]))
after(() => { setMailTransportForTests(null); return Promise.all([app.close(), aw.close(), st.close()]) })
const fx = (n) => readFileSync(new URL(`./fixtures/ical/${n}`, import.meta.url), 'utf8')
const FEATURE = 'f_p1_unterkunft'
const vorher = { ...config.unterkunft }
let sink
const OPT = { heute: '2026-11-07', horizontTage: 540 }
const antwort = (text, status = 200, headers = {}) => new Response(text, { status, headers })
const oeffentlich = async () => [{ address: '93.184.216.34', family: 4 }]
@@ -39,6 +43,9 @@ beforeEach(async () => {
for (const c of NAMEN) for (const id of [...aw.docs(c).keys()]) await deleteDocument(config.collections[c], id)
Object.assign(config.unterkunft, vorher, { mode: 'on' })
mails._aufrufe.length = 0
config.smtp.from = 'noreply@webklar.com'
sink = mailSink()
setMailTransportForTests(sink)
aw.seed('portalFeatures', { $id: FEATURE, customerId: 'c1', projectId: 'p1', featureKey: 'unterkunft', siteKey: 'abcdefghijklmnop', state: 'active', enabled: true })
aw.seed('customers', { $id: 'c1', email: 'mimi@example.com' })
aw.seed('websiteProjects', { $id: 'p1', customerId: 'c1', projectName: 'Donau' })
@@ -220,10 +227,13 @@ test('K33: erst nach icalFehlerStunden ohne Erfolg, danach hoechstens 1x je 24 h
assert.equal(K33().length, 0, 'nach 5 h noch keine Mail')
await lauf(new Date(NOW.getTime() + 2 * 3600e3))
assert.equal(K33().length, 1, 'nach 7 h Mail')
assert.deepEqual(Object.keys(K33()[0].values).sort(), ['quelle', 'seit', 'unterkunft'])
assert.equal(K33()[0].values.quelle, 'Booking.com')
assert.equal(K33()[0].values.unterkunft, 'Erste')
assert.match(K33()[0].values.seit, /^07\.11\.2026, 06:00$/)
// das Testprotokoll haelt keine Werte mehr fest (nur {an, template, anfrageId}); die Platzhalter prueft unterkunftMails.test.js
assert.deepEqual(Object.keys(K33()[0]).sort(), ['an', 'anfrageId', 'template'])
await warteAufVersand()
const k33 = sink.sent.find((m) => /Erste/.test(m.text ?? ''))
assert.ok(k33, 'Mail nennt die Unterkunft (K33 kennt keine Platzhalter quelle/seit)')
assert.deepEqual(k33.to.map((x) => x.address), ['mimi@example.com'])
assert.ok(!JSON.stringify(k33).includes('geheim'))
assert.ok(!JSON.stringify(K33()[0]).includes('geheim'))
assert.ok((await ladeEinstellungen(FEATURE)).icalFehlerMailAt)
await lauf(new Date(NOW.getTime() + 10 * 3600e3))
+1
View File
@@ -61,6 +61,7 @@ test('Konfiguration: Vorgaben ohne Umgebungsvariablen', async () => {
ipHashTage: 30,
unverbindlichMonate: 6,
neuVerfallTage: 60,
aufbewahrungDeckel: 500,
anonymisierenJahre: 3,
rechnungJahre: 8,
loeschTageNachAbschalten: 90,