55 lines
2.8 KiB
TypeScript
55 lines
2.8 KiB
TypeScript
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)
|
|
})
|
|
})
|