// tests/voiceReport.groupCdrCalls.test.js import test from 'node:test'; import assert from 'node:assert/strict'; import { groupCdrIntoCalls, summarizeCalls, classifyCallDirection, } from '../services/voiceReport/groupCdrCalls.js'; const SAMPLE_LEGS = [ { 'Answer time': '2026-07-23T13:06:24.325Z', Answered: 'true', Direction: 'TERMINATING', 'Start time': '2026-07-23T13:06:24.316Z', 'Call type': 'SIP_INBOUND', 'Correlation ID': '3c7f5c7c-6f48-40f2-925c-133f6a84dcdb', Duration: 184, 'Report ID': 'fd1debbf-d2b4-331c-846a-2f2a79de9b08', 'User type': 'AutomatedAttendantVideo', User: 'Store 2477', 'Called number': '+12122194600', 'Calling number': '+17189864017', 'Call outcome': 'Success', 'Call outcome reason': 'Normal', 'Answer indicator': 'Yes', 'Auto Attendant Key Pressed': '1', }, { 'Answer time': '2026-07-23T13:07:14.337Z', Answered: 'true', Direction: 'ORIGINATING', 'Start time': '2026-07-23T13:06:26.570Z', 'Call type': 'SIP_ENTERPRISE', 'Correlation ID': '3c7f5c7c-6f48-40f2-925c-133f6a84dcdb', Duration: 134, 'Report ID': '9541d7ea-8ced-3d39-a8ef-c2fc5e341700', 'User type': 'AutomatedAttendantVideo', 'Called number': '52477', 'Calling number': '+17189864017', 'Call outcome': 'Success', 'Call outcome reason': 'Normal', 'Answer indicator': 'Yes', }, { 'Answer time': '2026-07-23T13:07:14.337Z', Answered: 'true', Direction: 'TERMINATING', 'Start time': '2026-07-23T13:06:26.739Z', 'Call type': 'SIP_ENTERPRISE', 'Client type': 'WXC_DEVICE', 'Correlation ID': '3c7f5c7c-6f48-40f2-925c-133f6a84dcdb', Duration: 134, 'Report ID': '829fcf5b-975c-3f5d-9150-af4743232bd3', 'User type': 'User', User: 'Store 02477', Model: 'DBS-210-3PC', 'Called number': '52477', 'Calling number': '+17189864017', 'Call outcome': 'Success', 'Call outcome reason': 'Normal', 'Answer indicator': 'Yes', 'Release time': '2026-07-23T13:09:28.784Z', }, ]; test('classifyCallDirection detects inbound from SIP_INBOUND leg', () => { assert.equal(classifyCallDirection(SAMPLE_LEGS), 'inbound'); }); test('groupCdrIntoCalls collapses legs with same correlation ID', () => { const calls = groupCdrIntoCalls(SAMPLE_LEGS); assert.equal(calls.length, 1); assert.equal(calls[0].legCount, 3); assert.equal(calls[0].direction, 'inbound'); assert.equal(calls[0].callingNumber, '+17189864017'); assert.equal(calls[0].reachedPhone, true); assert.equal(calls[0].endpointUser, 'Store 02477'); assert.equal(calls[0].aaKeyPress, '1'); assert.equal(calls[0].normalOutcome, true); }); test('summarizeCalls aggregates inbound reach stats', () => { const calls = groupCdrIntoCalls(SAMPLE_LEGS); const summary = summarizeCalls(calls); assert.equal(summary.total, 1); assert.equal(summary.inbound, 1); assert.equal(summary.inboundReachedPhone, 1); assert.equal(summary.abnormal, 0); }); test('legs without correlation ID stay separate', () => { const a = { ...SAMPLE_LEGS[0], 'Correlation ID': 'a', 'Report ID': 'r1' }; const b = { ...SAMPLE_LEGS[0], 'Correlation ID': 'b', 'Report ID': 'r2' }; assert.equal(groupCdrIntoCalls([a, b]).length, 2); });