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([])
})
})