Archiv/Rechte: Review-Punkte

- archiviertes Projekt bleibt unter Funktionen sichtbar, solange dort eine
  Funktion bestellt/eingerichtet/aktiv ist (z. B. Terminbuchungen)
- auf archivierten Projekten nichts neu bestellen oder einschalten
- Projekttyp Vorlage nur fuer Admins; repo-readme nur fuer bekannte Projekte

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Opus 5.5 committed 2026-10-04 15:11:54 +00:00
1 parent 3156bb790a
commit 4fc4c70b7d
5 files changed
+52 -6

No files matched your search

+28 -1
View File
@@ -9,14 +9,20 @@ import { useTestEnv } from './support/testEnv.js'
const aw = await startAppwriteMock()
const st = await startFakeStripe()
useTestEnv({ appwriteUrl: aw.url, stripeUrl: st.url })
const { startTestApp, rawGet, get, sessionCookie } = await import('./support/testApp.js')
const { startTestApp, rawGet, get, send, sessionCookie } = await import('./support/testApp.js')
const { default: projectsRouter } = await import('../server/routes/projects.js')
const { default: servicesRouter } = await import('../server/routes/admin/services.js')
const { default: customersRouter } = await import('../server/routes/admin/customers.js')
const { default: websiteProjectsRouter } = await import('../server/routes/admin/websiteProjects.js')
const { default: giteaRouter } = await import('../server/routes/admin/gitea.js')
const { default: funktionenRouter } = await import('../server/routes/funktionen.js')
const app = await startTestApp({
'/api/projects': projectsRouter,
'/api/admin/services': servicesRouter,
'/api/admin/customers': customersRouter,
'/api/admin/website-projects': websiteProjectsRouter,
'/api/admin/gitea': giteaRouter,
'/api/funktionen': funktionenRouter,
})
after(() => Promise.all([aw.close(), st.close(), app.close()]))
@@ -58,3 +64,24 @@ test('Funktionen: Kunde sieht archivierte Projekte nicht, die Mitarbeiter-Ansich
['p_aktiv', 'p_archiv']
)
})
test('Funktionen: archiviertes Projekt mit laufender Funktion bleibt fuer den Kunden sichtbar (Buchungen verwalten)', async () => {
const { listCustomerFeatures } = await import('../server/services/siteFeatures.js')
const docs = [{ customerId: 'c1', projectId: 'p_archiv', featureKey: 'termine', state: 'active' }]
assert.deepEqual((await listCustomerFeatures('c1', { docs })).map((p) => p.projectId).sort(), ['p_aktiv', 'p_archiv'])
const aus = [{ customerId: 'c1', projectId: 'p_archiv', featureKey: 'termine', state: 'off' }]
assert.deepEqual((await listCustomerFeatures('c1', { docs: aus })).map((p) => p.projectId), ['p_aktiv'])
})
test('Neu bestellen auf archiviertem Projekt geht nicht', async () => {
const r = await send('POST', '/api/funktionen/news/checkout', { ...kunde, body: { projectId: 'p_archiv', consent: true } })
assert.equal(r.status, 409)
assert.match(r.body.error, /archiviert/)
})
test('Vorlage bleibt Admin-Sache; README nur fuer bekannte Projekte', async () => {
const t = await send('PATCH', '/api/admin/website-projects/p_aktiv', { ...bearer('jwt-staff'), body: { projectType: 'template' } })
assert.equal(t.status, 403)
const fremd = await rawGet('/api/admin/gitea/repo-readme?repoFullName=JUSN/tickte-system', bearer('jwt-staff'))
assert.equal(fremd.status, 404)
})