Öffnungszeiten: öffentliche Antwort mit Cache
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>
This commit is contained in:
1 parent
7bf2ad2665
commit
1c9f773e97
4 files changed
+787
-4
No files matched your search
@@ -0,0 +1,80 @@
|
||||
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)
|
||||
})
|
||||
Reference in new issue
Block a user