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