oeffentlich.js baut die Antwort für das Website-Skript (Pläne mit Woche, 60 Tagen
und Statuswechseln, Hinweise, Kontakt-Leiste, JSON-LD, Firma, Team) und merkt sie
30 Sekunden je siteKey. Ungültige Schlüssel und ausgeschalteter Schalter lösen
weder eine Abfrage noch einen Cache-Eintrag aus; die Funktion antwortet schon in
setup. findActiveBySiteKey nimmt dafür { states } entgegen (Vorgabe wie bisher
nur active).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
81 lines
4.3 KiB
JavaScript
81 lines
4.3 KiB
JavaScript
import { test, after, beforeEach } from 'node:test'
|
|
import assert from 'node:assert/strict'
|
|
import { startAppwriteMock } from './support/appwriteMock.js'
|
|
import { schemaKeys } from './support/schema.js'
|
|
import { useTestEnv } from './support/testEnv.js'
|
|
|
|
// findActiveBySiteKey(siteKey, featureKey, { states }): Vorgabe nur 'active' (News und Terminplaner unveraendert); die
|
|
// Oeffnungszeiten fragen mit states ['setup', 'active'], damit das Team die Leisten schon vor dem Schliessen des Tickets pruefen kann.
|
|
const aw = await startAppwriteMock({ schema: { portalFeatures: schemaKeys('portalFeatures') }, defaultLimit: 25 })
|
|
after(() => aw.close())
|
|
useTestEnv({ appwriteUrl: aw.url, stripeUrl: 'http://127.0.0.1:1' })
|
|
|
|
const { findActiveBySiteKey } = await import('../server/services/siteFeatures.js')
|
|
|
|
const STATES = ['off', 'ordered', 'setup', 'active', 'disabled']
|
|
const KEYS = { off: 'aaaaaaaaaaaaaaaa', ordered: 'bbbbbbbbbbbbbbbb', setup: 'cccccccccccccccc', active: 'dddddddddddddddd', disabled: 'eeeeeeeeeeeeeeee' }
|
|
|
|
beforeEach(() => {
|
|
for (const state of STATES) {
|
|
aw.seed('portalFeatures', {
|
|
$id: `f_${state}_zeiten`,
|
|
customerId: 'c_kunde01',
|
|
projectId: `p_${state}`,
|
|
featureKey: 'zeiten',
|
|
state,
|
|
enabled: state === 'active',
|
|
siteKey: KEYS[state],
|
|
})
|
|
}
|
|
aw.seed('portalFeatures', { $id: 'f_news', customerId: 'c_kunde01', projectId: 'p_news', featureKey: 'news', state: 'setup', enabled: false, siteKey: 'ffffffffffffffff' })
|
|
aw.resetListCalls()
|
|
})
|
|
|
|
test('findActiveBySiteKey: Vorgabe nur active, mit states auch setup', async () => {
|
|
assert.equal((await findActiveBySiteKey(KEYS.active, 'zeiten'))?.$id, 'f_active_zeiten')
|
|
assert.equal(await findActiveBySiteKey(KEYS.setup, 'zeiten'), null, 'ohne states zaehlt setup nicht')
|
|
|
|
const mitSetup = { states: ['setup', 'active'] }
|
|
assert.equal((await findActiveBySiteKey(KEYS.setup, 'zeiten', mitSetup))?.$id, 'f_setup_zeiten')
|
|
assert.equal((await findActiveBySiteKey(KEYS.active, 'zeiten', mitSetup))?.$id, 'f_active_zeiten')
|
|
for (const state of ['off', 'ordered', 'disabled']) {
|
|
assert.equal(await findActiveBySiteKey(KEYS[state], 'zeiten', mitSetup), null, state)
|
|
}
|
|
})
|
|
|
|
test('states ersetzt die Vorgabe vollstaendig und die Liste geht als eine equal-Abfrage an Appwrite', async () => {
|
|
assert.equal((await findActiveBySiteKey(KEYS.disabled, 'zeiten', { states: ['disabled'] }))?.$id, 'f_disabled_zeiten')
|
|
assert.equal(await findActiveBySiteKey(KEYS.active, 'zeiten', { states: ['disabled'] }), null)
|
|
|
|
aw.resetListCalls()
|
|
await findActiveBySiteKey(KEYS.setup, 'zeiten', { states: ['setup', 'active'] })
|
|
const [aufruf] = aw.listCalls('portalFeatures')
|
|
const zustand = aufruf.queries.filter((q) => q.method === 'equal' && q.attribute === 'state')
|
|
assert.equal(zustand.length, 1)
|
|
assert.deepEqual(zustand[0].values, ['setup', 'active'])
|
|
})
|
|
|
|
test('ohne Optionen und mit leerem Objekt bleibt es bei active (bestehende Aufrufer unveraendert)', async () => {
|
|
assert.equal(await findActiveBySiteKey(KEYS.setup, 'zeiten', {}), null)
|
|
assert.equal((await findActiveBySiteKey(KEYS.active, 'zeiten', {}))?.$id, 'f_active_zeiten')
|
|
aw.resetListCalls()
|
|
await findActiveBySiteKey(KEYS.active, 'zeiten')
|
|
const [aufruf] = aw.listCalls('portalFeatures')
|
|
assert.deepEqual(aufruf.queries.find((q) => q.attribute === 'state').values, ['active'])
|
|
})
|
|
|
|
test('die Funktion bleibt Teil der Abfrage: ein News-Schluessel ist kein Zeiten-Schluessel, auch mit setup', async () => {
|
|
assert.equal(await findActiveBySiteKey('ffffffffffffffff', 'zeiten', { states: ['setup', 'active'] }), null)
|
|
assert.equal((await findActiveBySiteKey('ffffffffffffffff', 'news', { states: ['setup'] }))?.$id, 'f_news')
|
|
})
|
|
|
|
test('ungueltiger Schluessel, unbekannte Funktion oder leere Zustandsliste: null ohne Abfrage', async () => {
|
|
const mitSetup = { states: ['setup', 'active'] }
|
|
for (const key of ['', 'KURZ', 'dddddddddddddddd1', 'ddddddddddddddd1', 'ddddddddddddddd0', 'DDDDDDDDDDDDDDDD', undefined, null, 5, {}, ['dddddddddddddddd']]) {
|
|
assert.equal(await findActiveBySiteKey(key, 'zeiten', mitSetup), null, String(key))
|
|
}
|
|
assert.equal(await findActiveBySiteKey(KEYS.active, 'kalender', mitSetup), null)
|
|
assert.equal(await findActiveBySiteKey(KEYS.active, 'zeiten', { states: [] }), null, 'eine leere Liste ist in Appwrite ungueltig und passt auf nichts')
|
|
assert.equal(aw.listCalls('portalFeatures').length, 0)
|
|
})
|