import { describe, expect, it } from 'vitest' import { extractMentionNames, splitBody } from '@/lib/chat/mentions' import { extractCaseNumbers } from '@/lib/chat/view' describe('Erwähnungen und Aktenzeichen im Text', () => { it('findet Erwähnungen und normalisiert die Schreibweise', () => { expect(extractMentionNames('Hallo @Vogel und @vogel und @kranz_j')).toEqual([ 'vogel', 'kranz_j', ]) }) it('zerlegt den Text, statt HTML daraus zu bauen', () => { // Kein dangerouslySetInnerHTML für Nutzerinhalte, siehe docs/07. const stuecke = splitBody('Siehe AfiS-2026-0042, @vogel weiss mehr') expect(stuecke.map((s) => s.kind)).toEqual(['text', 'caseNumber', 'text', 'mention', 'text']) expect(stuecke[1]).toMatchObject({ kind: 'caseNumber', value: 'AfiS-2026-0042' }) }) it('lässt Auszeichnungszeichen als Text stehen', () => { const stuecke = splitBody('') expect(stuecke).toEqual([{ kind: 'text', value: '' }]) }) it('macht aus einer Überlappung nicht zwei Stücke', () => { // `@AfiS-2026-0001` ist beides. Der erste Treffer gewinnt, sonst stünde // ein Teil des Textes doppelt da. const stuecke = splitBody('@AfiS-2026-0001') const zusammen = stuecke.map((s) => s.value).join('') expect(zusammen).toBe('@AfiS-2026-0001') }) it('erkennt gewachsene Präfixe im Aktenzeichen', () => { expect(extractCaseNumbers('AKT-PA-2026-62843 und AfiS-2026-0007')).toEqual([ 'AKT-PA-2026-62843', 'AfiS-2026-0007', ]) }) it('hält Text ohne Treffer zusammen', () => { expect(splitBody('nur Text')).toEqual([{ kind: 'text', value: 'nur Text' }]) expect(extractCaseNumbers('kein Zeichen hier')).toEqual([]) }) })