import { describe, expect, it } from 'vitest' import { canStartRecording, mergeEndedEvent, mergeSnapshot, parseCallEvent, parseSnapshotLine, type CallEvent } from './protocol' describe('Aufnahmeprotokoll 10', () => { it('liest Anrufkennung und den bestätigten Aufnahmeauftrag', () => { const call = parseSnapshotLine({ line: 1, state: 'LSActive', callId: 42, recordingRequested: true })! expect(call.callId).toBe(42) expect(call.recordingRequested).toBe(true) expect(canStartRecording(call)).toBe(true) }) it.each(['LSWaitingForMedia', 'LSOnHold', 'LSRinging', 'unknown'])('startet nicht im Zustand %s', (state) => { expect(canStartRecording({ line: 1, event: 'connected', state })).toBe(false) }) it('unterscheidet dieselbe Rufnummer auf wiederverwendeter Leitung', () => { const old: CallEvent = { line: 1, event: 'connected', peerNumber: '123', callId: 41, direction: 'incoming' } const fresh: CallEvent = { line: 1, event: 'connected', peerNumber: '123', callId: 42 } const result = mergeSnapshot({ 1: old }, [fresh]) expect(result.events.map((call) => [call.event, call.callId])).toEqual([['ended', 41], ['connected', 42]]) expect(result.lines[1].direction).toBeUndefined() }) it('Aufnahmeänderung ist kein weiteres connected-Ereignis', () => { const call: CallEvent = { line: 1, event: 'connected', callId: 41, recordingRequested: false } const result = mergeSnapshot({ 1: call }, [{ ...call, recordingRequested: true }]) expect(result.events).toEqual([]) expect(result.lines[1].recordingRequested).toBe(true) }) it('liest ended und weist ungültige Meldungen ab', () => { expect(parseCallEvent({ type: 'call', event: 'ended', line: 1, callId: 41 })).toMatchObject({ event: 'ended', line: 1, callId: 41 }) expect(parseCallEvent({ type: 'call', event: 'unknown', line: 1 })).toBeNull() expect(parseCallEvent({ type: 'call', event: 'ended', line: 0 })).toBeNull() }) }) describe('Ende-Ereignisse ohne doppelte Benachrichtigungen', () => { const call: CallEvent = { line: 1, callId: 41, event: 'connected', direction: 'incoming' } const end = parseCallEvent({ type: 'call', line: 1, callId: 41, event: 'ended' })! it('Snapshot vor Ereignis', () => { const snapshot = mergeSnapshot({ 1: call }, []) expect(snapshot.events).toHaveLength(1) expect(mergeEndedEvent(snapshot.lines, end).events).toEqual([]) }) it('Ereignis vor Snapshot', () => { const event = mergeEndedEvent({ 1: call }, end) expect(event.events).toHaveLength(1) expect(event.events[0].direction).toBe('incoming') expect(mergeSnapshot(event.lines, []).events).toEqual([]) }) it('Verspätetes Ende trifft keinen neuen Anruf', () => { const event = mergeEndedEvent({ 1: { ...call, callId: 42 } }, end) expect(event.events).toEqual([]) expect(event.lines[1].callId).toBe(42) }) })