Files
AfiS-Aktensystem/packages/db/tests/auslieferungszustand.test.ts
T
HarlekinandClaude Opus 5 dbca57cedf Rollenstruktur und englische Fachbegriffe festgelegt
Der Discord-Server hat drei Sorten Rollen, die Dokumente kannten nur eine:
Zugehörigkeit (AfiS, Personalabteilung) als Türsteher, Rangrollen für die
Rechte, Zugangsrollen für die Freigabestufe. Das bestehende RoleMapping trägt
das fast, es fehlt nur der Türsteher. Die beiden Felder dafür kommen mit
Phase 1, die Struktur ist in docs/13-entscheidungen.md festgehalten.

Die Freigabestufen heißen jetzt wie die Zugangsrollen: Unclassified,
Restricted Access, Confidential Access, Sensitive Access, Critical Operations,
Executive Oversight. Fachbegriffe der Domäne bleiben englisch, auch in einer
deutschen Oberfläche.

Die Bezeichnungen sind damit Daten in ClearanceLevelConfig, nicht mehr
Oberflächentext in lib/i18n/de.ts: sie sind im Adminbereich änderbar, und was
der Leiter ändern kann, gehört nicht in eine Übersetzungsdatei. StampMark
bekommt den Namen hereingereicht.

Vier neue Tests prüfen den Zustand, den der Seed herstellt, gegen die
Datenbank statt gegen eine Konstante im Code.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 18:50:07 +02:00

53 lines
1.9 KiB
TypeScript

import { afterAll, beforeAll, describe, expect, it } from 'vitest'
import { createPrismaClient, type PrismaClient } from '../src/index.js'
/**
* Prüft den Zustand, den `pnpm db:seed` herstellt. Das ist kein Testinhalt,
* sondern Konfiguration, ohne die die Anwendung nicht sinnvoll läuft.
*/
const url = process.env.DIRECT_DATABASE_URL ?? process.env.DATABASE_URL
const suite = url ? describe : describe.skip
let db: PrismaClient
suite('Auslieferungszustand', () => {
beforeAll(() => {
db = createPrismaClient(url)
})
afterAll(async () => {
await db.$disconnect()
})
it('kennt sechs Freigabestufen, benannt nach den Zugangsrollen', async () => {
const levels = await db.clearanceLevelConfig.findMany({ orderBy: { level: 'asc' } })
expect(levels.map((l) => l.level)).toEqual([0, 1, 2, 3, 4, 5])
expect(levels.map((l) => l.name)).toEqual([
'Unclassified',
'Restricted Access',
'Confidential Access',
'Sensitive Access',
'Critical Operations',
'Executive Oversight',
])
})
it('verbirgt die Existenz ab Stufe 3, darunter nicht', async () => {
const levels = await db.clearanceLevelConfig.findMany({ orderBy: { level: 'asc' } })
expect(levels.map((l) => l.hiddenBelow)).toEqual([false, false, false, true, true, true])
})
it('liefert die Änderungsrichtlinie mit Karenzzeit und ohne Markierung aus', async () => {
const setting = await db.appSetting.findUnique({ where: { id: 1 } })
expect(setting?.entryEditPolicy).toBe('GRACE_WINDOW')
expect(setting?.entryEditGraceMinutes).toBe(15)
expect(setting?.entryEditMarkGrace).toBe(false)
})
it('ordnet im Auslieferungszustand keiner Rolle Rechte zu', async () => {
// entry.edit_own, entry.edit_any und entry.retract schaltet der Leiter
// bewusst frei. Siehe docs/03-auth-und-rechte.md.
expect(await db.roleMapping.count()).toBe(0)
})
})