Vier Sachen aus der Durchsicht. **Der Statusfilter zeigte fünf von sieben Zuständen.** DRAFT und SEALED fehlten - ausgerechnet die beiden, die in der Liste am häufigsten standen; man konnte nach dem, was man sah, gerade nicht filtern. Das erklärt auch die Frage, was „In Prüfung" und „Ruhend" bedeuten: die Zustände standen nirgends in der Oberfläche. Jetzt alle sieben in der Reihenfolge des Lebenszyklus, mit einer Erklärung als title, und Versiegelt nur für den, der Versiegeltes lesen darf. Ein Test verlangt zu jedem Zustand einen Namen und eine Erklärung. **Beliebig viele Beteiligte beim Anlegen.** Das Formular kannte genau eine „betroffene Person", und die Rolle war auf SUBJECT festgelegt. Jetzt beliebig viele Zeilen mit je einer Rolle, Konten und Personalakten in einer Auswahl, wie auf der Aktenseite. Die Zerlegung steht als parseParticipantDrafts in lib/cases/terms.ts und nicht in der Server Action: seit die Rolle über den Zugriff entscheidet, darf eine erfundene Rolle nicht durchrutschen. **Die Filterleisten sind Knöpfe** wie überall sonst, mit gefülltem aktivem Filter. **Keine leere Kennungsspalte mehr.** In „Zuletzt geöffnet" stand bei einer Person nichts, wo sonst das Aktenzeichen steht - jetzt steht dort „Personalakte". Nebenbei zwei Stellen zurückgenommen, an denen die Spaltenklasse im Seitenkopf gelandet war statt in einer Zeile.
68 lines
2.3 KiB
TypeScript
68 lines
2.3 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import {
|
|
MAX_PARTICIPANT_DRAFTS,
|
|
parseParticipantDrafts,
|
|
CASE_STATUSES,
|
|
} from '@/lib/cases/terms'
|
|
import { caseText } from '@/lib/i18n/cases'
|
|
|
|
/**
|
|
* Die Zerlegung der Beteiligtenzeilen aus dem Formular „Neue Fallakte".
|
|
*
|
|
* Sie entscheidet, wer mit welcher Rolle in eine Akte kommt — und seit die
|
|
* Rolle über den Zugriff entscheidet (nur Arbeitsrollen öffnen die Akte, siehe
|
|
* lib/cases/terms.ts), darf eine erfundene Rolle hier nicht durchrutschen.
|
|
*/
|
|
describe('Beteiligte beim Anlegen', () => {
|
|
it('nimmt Konten und Personalakten mit ihrer Rolle', () => {
|
|
expect(
|
|
parseParticipantDrafts(['user:123|LEAD', 'file:abc|SUSPECT']),
|
|
).toEqual([
|
|
{ kind: 'user', id: '123', role: 'LEAD' },
|
|
{ kind: 'file', id: 'abc', role: 'SUSPECT' },
|
|
])
|
|
})
|
|
|
|
it('lässt Unsinn weg, statt die Akte scheitern zu lassen', () => {
|
|
expect(
|
|
parseParticipantDrafts([
|
|
'user:123|ERFUNDEN', // Rolle gibt es nicht
|
|
'irgendwas:1|LEAD', // Art gibt es nicht
|
|
'user:|LEAD', // keine Kennung
|
|
'user:1', // keine Rolle
|
|
'',
|
|
42,
|
|
null,
|
|
]),
|
|
).toEqual([])
|
|
})
|
|
|
|
it('nimmt dieselbe Person in zwei Rollen, aber nicht zweimal in derselben', () => {
|
|
// Zeuge und Betroffener zugleich kommt vor. Zweimal Zeuge ist ein Versehen.
|
|
expect(
|
|
parseParticipantDrafts(['file:a|WITNESS', 'file:a|SUBJECT', 'file:a|WITNESS']),
|
|
).toEqual([
|
|
{ kind: 'file', id: 'a', role: 'WITNESS' },
|
|
{ kind: 'file', id: 'a', role: 'SUBJECT' },
|
|
])
|
|
})
|
|
|
|
it('nimmt nicht beliebig viele', () => {
|
|
const viele = Array.from({ length: 80 }, (_, i) => `file:p${i}|WITNESS`)
|
|
expect(parseParticipantDrafts(viele)).toHaveLength(MAX_PARTICIPANT_DRAFTS)
|
|
})
|
|
})
|
|
|
|
describe('Zustände einer Fallakte', () => {
|
|
it('hat für jeden Zustand einen Namen und eine Erklärung', () => {
|
|
// Der Filter zeigte fünf von sieben Zuständen — ausgerechnet „Entwurf" und
|
|
// „Versiegelt" fehlten, also die beiden häufigsten in der Liste. Diese
|
|
// Prüfung fällt auf, wenn wieder einer vergessen wird.
|
|
for (const status of CASE_STATUSES) {
|
|
expect(caseText.statusNames[status], status).toBeTruthy()
|
|
expect(caseText.statusHints[status], status).toBeTruthy()
|
|
}
|
|
expect(CASE_STATUSES).toHaveLength(7)
|
|
})
|
|
})
|