Funktionen: Terminplaner als zweite Funktion (Team-Route, Kundenansicht)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
ae1886c030
commit
9e8fd33713
12 files changed
+434
-33
No files matched your search
@@ -162,3 +162,105 @@ test('bezahlt_und_abgelaufen_gleichzeitig_bleiben_stimmig', async () => {
|
||||
assert.equal(tickets().length, ticketsBefore)
|
||||
}
|
||||
})
|
||||
|
||||
// ---------------------------------------------------------------- Terminplaner als zweite Funktion ---
|
||||
test('termine_ist_zweite_funktion: Schluessel und Bezeichnungen', () => {
|
||||
// erst hier angelegt: die aelteren Tests oben zaehlen die Projekte von c1
|
||||
aw.seed('websiteProjects', { $id: 'pt1', customerId: 'c1', projectName: 'Salon' })
|
||||
aw.seed('websiteProjects', { $id: 'pt2', customerId: 'c1', projectName: 'Studio' })
|
||||
aw.seed('websiteProjects', { $id: 'pt3', customerId: 'c2', projectName: 'Fremder Salon' })
|
||||
assert.deepEqual(sf.FEATURE_KEYS, ['news', 'termine'])
|
||||
assert.deepEqual(sf.FEATURE_LABELS, {
|
||||
news: { name: 'News-Pinnwand', keine: 'keine News-Pinnwand' },
|
||||
termine: { name: 'Terminplaner', keine: 'keinen Terminplaner' },
|
||||
})
|
||||
})
|
||||
|
||||
test('liste_zeigt_termine_je_projekt_ohne_dokument_als_off', async () => {
|
||||
const list = await sf.listCustomerFeatures('c1')
|
||||
const p = list.find((x) => x.projectId === 'pt1')
|
||||
assert.deepEqual(Object.keys(p.features), ['news', 'termine'])
|
||||
assert.equal(p.features.termine.state, 'off')
|
||||
assert.equal(p.features.termine.siteKey, null)
|
||||
assert.equal(p.features.termine.ticketWoid, null)
|
||||
})
|
||||
|
||||
test('termine_wird_aktiviert_und_bekommt_eigenen_sitekey_und_eigenes_dokument', async () => {
|
||||
const doc = await sf.adminActivate('c1', 'pt1', 'termine', { by: 'kenso' })
|
||||
assert.equal(doc.featureKey, 'termine')
|
||||
assert.equal(doc.state, 'active')
|
||||
assert.equal(doc.enabled, true)
|
||||
assert.equal(doc.unlockedByPurchase, false)
|
||||
assert.match(doc.siteKey, /^[a-z2-7]{16}$/)
|
||||
assert.equal(await sf.getFeatureDoc('c1', 'pt1', 'news'), null, 'News bleibt unberuehrt')
|
||||
const view = (await sf.listCustomerFeatures('c1')).find((x) => x.projectId === 'pt1').features
|
||||
assert.equal(view.termine.state, 'active')
|
||||
assert.equal(view.termine.siteKey, doc.siteKey)
|
||||
assert.equal(view.news.state, 'off')
|
||||
await assert.rejects(() => sf.adminActivate('c1', 'pt1', 'kalender', {}), { status: 400 })
|
||||
})
|
||||
|
||||
test('findActiveBySiteKey: Vorgabe ist news, termine nur mit zweitem Argument, nie der andere Schluessel', async () => {
|
||||
const termine = await sf.getFeatureDoc('c1', 'pt1', 'termine')
|
||||
assert.equal((await sf.findActiveBySiteKey(termine.siteKey, 'termine')).$id, termine.$id)
|
||||
assert.equal(await sf.findActiveBySiteKey(termine.siteKey), null, 'ohne zweites Argument = news')
|
||||
assert.equal(await sf.findActiveBySiteKey(termine.siteKey, 'news'), null)
|
||||
const news = await sf.adminActivate('c1', 'pt2', 'news', { by: 'kenso' })
|
||||
assert.equal((await sf.findActiveBySiteKey(news.siteKey)).$id, news.$id)
|
||||
assert.equal((await sf.findActiveBySiteKey(news.siteKey, 'news')).$id, news.$id)
|
||||
assert.equal(await sf.findActiveBySiteKey(news.siteKey, 'termine'), null)
|
||||
assert.equal(await sf.findActiveBySiteKey('zzzzzzzzzzzzzzzz', 'termine'), null)
|
||||
assert.equal(await sf.findActiveBySiteKey('KURZ', 'termine'), null)
|
||||
})
|
||||
|
||||
test('abgeschaltet_ist_nicht_auffindbar_und_wieder_aktivieren_leert_disabledAt (R36)', async () => {
|
||||
const doc = await sf.getFeatureDoc('c1', 'pt1', 'termine')
|
||||
const off = await sf.disable(doc.$id, { by: 'kenso' })
|
||||
assert.equal(off.state, 'disabled')
|
||||
assert.ok(Math.abs(Date.parse(off.disabledAt) - Date.now()) < 5000)
|
||||
assert.equal(await sf.findActiveBySiteKey(doc.siteKey, 'termine'), null)
|
||||
const on = await sf.activate(doc.$id, { by: 'kenso' })
|
||||
assert.equal(on.state, 'active')
|
||||
assert.equal(on.disabledAt, null, 'sonst koennte der 30-Tage-Loeschlauf eine wieder eingeschaltete Funktion treffen')
|
||||
assert.equal((await sf.getFeatureDoc('c1', 'pt1', 'termine')).disabledAt, null)
|
||||
assert.equal((await sf.findActiveBySiteKey(doc.siteKey, 'termine')).$id, doc.$id)
|
||||
})
|
||||
|
||||
test('activate gilt fuer jede Funktion gleich: News verliert disabledAt ebenfalls', async () => {
|
||||
const news = await sf.getFeatureDoc('c1', 'pt2', 'news')
|
||||
assert.equal((await sf.disable(news.$id, {})).state, 'disabled')
|
||||
assert.equal((await sf.activate(news.$id, {})).disabledAt, null)
|
||||
})
|
||||
|
||||
test('activateClosedTickets bleibt bei News (TP2): ein termine-Dokument im Zustand setup wird nicht angefasst', async () => {
|
||||
aw.seed('portalFeatures', { $id: 'f_setup_termine', customerId: 'c1', projectId: 'pt2', featureKey: 'termine', state: 'setup', enabled: false, siteKey: 'bbbbbbbbbbbbbbbb', ticketId: 't_closed' })
|
||||
aw.seed('workorders', { $id: 't_closed', woid: 'WO-9', status: 'Closed' })
|
||||
const done = await sf.activateClosedTickets({ customerId: 'c1' })
|
||||
assert.deepEqual(done.map((d) => d.featureKey), [])
|
||||
assert.equal(aw.docs('portalFeatures').get('f_setup_termine').state, 'setup')
|
||||
const { deleteDocument } = await import('../server/services/appwriteAdmin.js')
|
||||
const { config } = await import('../server/config.js')
|
||||
await deleteDocument(config.collections.portalFeatures, 'f_setup_termine')
|
||||
})
|
||||
|
||||
test('disableCustomerFeatures: schaltet nur die genannte Funktion des Kunden ab, mit Notiz', async () => {
|
||||
const mine = await sf.getFeatureDoc('c1', 'pt1', 'termine')
|
||||
const other = await sf.adminActivate('c2', 'pt3', 'termine', { by: 'kenso' })
|
||||
const news = await sf.getFeatureDoc('c1', 'pt2', 'news')
|
||||
await sf.activate(news.$id, {})
|
||||
const done = await sf.disableCustomerFeatures('c1', 'termine', { adminNote: 'Kunde gelöscht' })
|
||||
assert.deepEqual(done.map((d) => d.$id), [mine.$id])
|
||||
const after = await sf.getFeatureDoc('c1', 'pt1', 'termine')
|
||||
assert.equal(after.state, 'disabled')
|
||||
assert.equal(after.enabled, false)
|
||||
assert.equal(after.adminNote, 'Kunde gelöscht')
|
||||
assert.ok(after.disabledAt)
|
||||
assert.equal((await sf.getFeatureDoc('c2', 'pt3', 'termine')).state, 'active', 'anderer Kunde')
|
||||
assert.equal(other.state, 'active')
|
||||
assert.equal((await sf.getFeatureDoc('c1', 'pt2', 'news')).state, 'active', 'andere Funktion')
|
||||
// schon abgeschaltet: disabledAt (Beginn der 30 Tage) bleibt
|
||||
const marker = after.disabledAt
|
||||
assert.deepEqual(await sf.disableCustomerFeatures('c1', 'termine', { adminNote: 'Kunde gelöscht' }), [])
|
||||
assert.equal((await sf.getFeatureDoc('c1', 'pt1', 'termine')).disabledAt, marker)
|
||||
await assert.rejects(() => sf.disableCustomerFeatures('c1', 'kalender', {}), { status: 400 })
|
||||
})
|
||||
Reference in new issue
Block a user