/// export import mocha = require('../../test/mocha'); var expect = mocha.chai.expect; var spy = mocha.sinon.spy; var mock = mocha.mock; var rcsdk = mocha.rcsdk; describe('RCSDK.helpers.Call', function() { 'use strict'; var Call = rcsdk.getCallHelper(); describe('createUrl', function() { it('returns URL depending on options', function() { expect(Call.createUrl()).to.equal('/account/~/extension/~/call-log'); expect(Call.createUrl({personal: true})).to.equal('/account/~/extension/~/call-log'); expect(Call.createUrl({extensionId: '12345'})).to.equal('/account/~/extension/12345/call-log'); expect(Call.createUrl({extensionId: '12345'}, '67890')).to.equal('/account/~/extension/12345/call-log/67890'); expect(Call.createUrl({active: true})).to.equal('/account/~/extension/~/active-calls'); expect(Call.createUrl({active: true, personal: true})).to.equal('/account/~/extension/~/active-calls'); expect(Call.createUrl({active: true}, 'foo')).to.equal('/account/~/extension/~/active-calls/foo'); expect(Call.createUrl({ active: true, extensionId: 'bar' }, 'foo')).to.equal('/account/~/extension/bar/active-calls/foo'); }); }); describe('attachContacts', function() { it('attaches contacts to all callerInfo structures found in each call', function() { var contacts = [ {id: 'foo', homePhone: 'foo'}, {id: 'bar', homePhone: 'bar'}, {id: 'baz', homePhone: 'baz'} ], calls = [ { direction: 'Outbound', from: {phoneNumber: 'foo'}, to: {phoneNumber: 'bar'} }, { direction: 'Inbound', from: {phoneNumber: 'baz'}, to: {phoneNumber: 'notfound'} } ]; Call.attachContacts(contacts, calls); expect(calls[0].from.contact).to.equal(contacts[0]); expect(calls[0].to.contact).to.equal(contacts[1]); expect(calls[1].from.contact).to.equal(contacts[2]); expect(calls[1].to.contact).to.be.an('undefined'); }); }); describe('getCallerInfo', function() { var calls = [ { direction: 'Outbound', from: {phoneNumber: 'foo'}, to: {phoneNumber: 'bar'} }, { direction: 'Inbound', from: {phoneNumber: 'baz'}, to: {phoneNumber: 'qux'} } ]; it('returns callerInfo of from or to properties depending on direction', function() { expect(Call.getCallerInfo(calls[0]).phoneNumber).to.equal('bar'); expect(Call.getCallerInfo(calls[1]).phoneNumber).to.equal('baz'); }); it('returms all callerInfos in an order depending on direction', function() { expect(Call.getAllCallerInfos(calls[0])[0].phoneNumber).to.equal('bar'); expect(Call.getAllCallerInfos(calls[0])[1].phoneNumber).to.equal('foo'); expect(Call.getAllCallerInfos(calls[1])[0].phoneNumber).to.equal('baz'); expect(Call.getAllCallerInfos(calls[1])[1].phoneNumber).to.equal('qux'); }); }); describe('formatDuration', function() { it('formats duration', function() { expect(Call.formatDuration({duration: 0.5})).to.equal('00:00'); expect(Call.formatDuration({duration: 0})).to.equal('00:00'); expect(Call.formatDuration({duration: 1})).to.equal('00:01'); expect(Call.formatDuration({duration: 1.5})).to.equal('00:01'); expect(Call.formatDuration({duration: 10})).to.equal('00:10'); expect(Call.formatDuration({duration: 60})).to.equal('01:00'); expect(Call.formatDuration({duration: 70})).to.equal('01:10'); expect(Call.formatDuration({duration: 60 * 60})).to.equal('1:00:00'); expect(Call.formatDuration({duration: 60 * 60 * 10 + 70})).to.equal('10:01:10'); }); }); var calls = [ {type: 'Voice', direction: 'Inbound', startTime: '2014-08-26T09:46:06.781Z'}, {type: 'Voice', direction: 'Outbound', startTime: '2014-08-26T08:46:06.781Z'}, {type: 'Voip', direction: 'Inbound', startTime: '2014-08-26T07:46:06.781Z'}, {type: 'Voip', direction: 'Outbound', startTime: '2014-08-26T06:46:06.781Z'} ]; describe('filter', function() { it('allows to filter calls by type and direction', function() { expect(calls.filter(Call.filter({type: 'Voice', direction: 'Inbound'})).length).to.equal(1); expect(calls.filter(Call.filter({type: 'Voice'})).length).to.equal(2); expect(calls.filter(Call.filter({direction: 'Inbound'})).length).to.equal(2); }); }); describe('sort', function() { it('allows to sort calls by startTime by default', function() { var sorted = [].concat(calls).sort(Call.comparator()); expect(sorted[0]).to.equal(calls[3]); expect(sorted[1]).to.equal(calls[2]); expect(sorted[2]).to.equal(calls[1]); expect(sorted[3]).to.equal(calls[0]); }); }); var mocks = { initial: { presence: { "uri": "https://api.ringcentral.com/restapi/v1.0/account/123/extension/321/presence", "extension": { "uri": "https://api.ringcentral.com/restapi/v1.0/account/123/extension/321", "id": 62480591, "extensionNumber": "4166" }, "presenceStatus": "Available", "telephonyStatus": "NoCall", "userStatus": "Available", "dndStatus": "TakeAllCalls", "message": "Waka waka", "allowSeeMyPresence": true, "ringOnMonitoredCall": false, "pickUpCallsOnHold": false }, activeCalls: [], calls: [ { "uri": "https://api.ringcentral.com/restapi/v1.0/account/123/extension/321/call-log/B0iTLeNN-expL4g", "id": "B0iTLeNN-expL4g", "sessionId": "88052061020", "startTime": "2014-12-11T00:48:08.000Z", "duration": 11, "type": "Voice", "direction": "Inbound", "action": "Phone Call", "result": "Accepted", "to": {"phoneNumber": "1855COMPANY", "name": "Called Ext Name"}, "from": {"phoneNumber": "1650CALLER0", "name": "Called Ext Name", "location": "San Mateo, CA"} }, { "uri": "https://api.ringcentral.com/restapi/v1.0/account/123/extension/321/call-log/B0iNkuy10B0FLG0", "id": "B0iNkuy10B0FLG0", "sessionId": "88051027020", "startTime": "2014-12-11T00:40:13.000Z", "duration": 11, "type": "Voice", "direction": "Inbound", "action": "Phone Call", "result": "Accepted", "to": {"phoneNumber": "1855COMPANY", "name": "Called Ext Name"}, "from": {"phoneNumber": "1650CALLER0", "name": "Called Ext Name", "location": "San Mateo, CA"} } ] }, ringing: { presence: { "extensionId": 62480591, "telephonyStatus": "Ringing", "activeCalls": [ { "id": "1e8b5e8847924ab49f383bc8d355ee33", "direction": "Inbound", "from": "1650CALLER0", "to": "1855COMPANY", "telephonyStatus": "Ringing", "sessionId": "88052513020" } ], "sequence": 7272442 }, activeCalls: [ { "uri": "https://api.ringcentral.com/restapi/v1.0/account/123/extension/321/call-log/B0iVoSn2fxQRMMM", "id": "B0iVoSn2fxQRMMM", "sessionId": "88052513020", "startTime": "2014-12-11T00:51:23.000Z", "type": "Voice", "direction": "Inbound", "action": "Phone Call", "result": "In Progress", "to": {"phoneNumber": "1855COMPANY", "name": "Called Ext Name"}, "from": {"phoneNumber": "1650CALLER0", "name": "Called Ext Name", "location": "San Mateo, CA"}, wayToDetermineOverwrite: true } ], calls: [ { "uri": "https://api.ringcentral.com/restapi/v1.0/account/123/extension/321/call-log/B0iVoSn2fxQRMMM", "id": "B0iVoSn2fxQRMMM", "sessionId": "88052513020", "startTime": "2014-12-11T00:51:23.000Z", "type": "Voice", "direction": "Inbound", "action": "Phone Call", "result": "In Progress", "to": {"phoneNumber": "1855COMPANY", "name": "Called Ext Name"}, "from": {"phoneNumber": "1650CALLER0", "name": "Called Ext Name", "location": "San Mateo, CA"}, wayToDetermineItsACall: true }, { "uri": "https://api.ringcentral.com/restapi/v1.0/account/123/extension/321/call-log/B0iTLeNN-expL4g", "id": "B0iTLeNN-expL4g", "sessionId": "88052061020", "startTime": "2014-12-11T00:48:08.000Z", "duration": 11, "type": "Voice", "direction": "Inbound", "action": "Phone Call", "result": "Accepted", "to": {"phoneNumber": "1855COMPANY", "name": "Called Ext Name"}, "from": {"phoneNumber": "1650CALLER0", "name": "Called Ext Name", "location": "San Mateo, CA"} }, { "uri": "https://api.ringcentral.com/restapi/v1.0/account/123/extension/321/call-log/B0iNkuy10B0FLG0", "id": "B0iNkuy10B0FLG0", "sessionId": "88051027020", "startTime": "2014-12-11T00:40:13.000Z", "duration": 11, "type": "Voice", "direction": "Inbound", "action": "Phone Call", "result": "Accepted", "to": {"phoneNumber": "1855COMPANY", "name": "Called Ext Name"}, "from": {"phoneNumber": "1650CALLER0", "name": "Called Ext Name", "location": "San Mateo, CA"} } ] }, pickup: { presence: { "extensionId": 62480591, "telephonyStatus": "CallConnected", "activeCalls": [ { "id": "1e8b5e8847924ab49f383bc8d355ee33", "direction": "Inbound", "from": "1650CALLER0", "to": "1855COMPANY", "telephonyStatus": "CallConnected", "sessionId": "88052513020" } ], "sequence": 7272469 }, activeCalls: [ { "uri": "https://api.ringcentral.com/restapi/v1.0/account/123/extension/321/call-log/B0iVoSn2fxQRMMM", "id": "B0iVoSn2fxQRMMM", "sessionId": "88052513020", "startTime": "2014-12-11T00:51:23.000Z", "type": "Voice", "direction": "Inbound", "action": "Phone Call", "result": "In Progress", "to": {"phoneNumber": "1855COMPANY", "name": "Called Ext Name"}, "from": {"phoneNumber": "1650CALLER0", "name": "Called Ext Name", "location": "San Mateo, CA"} } ], calls: [ { "uri": "https://api.ringcentral.com/restapi/v1.0/account/123/extension/321/call-log/B0iVoSn2fxQRMMM", "id": "B0iVoSn2fxQRMMM", "sessionId": "88052513020", "startTime": "2014-12-11T00:51:23.000Z", "type": "Voice", "direction": "Inbound", "action": "Phone Call", "result": "In Progress", "to": {"phoneNumber": "1855COMPANY", "name": "Called Ext Name"}, "from": {"phoneNumber": "1650CALLER0", "name": "Called Ext Name", "location": "San Mateo, CA"} }, { "uri": "https://api.ringcentral.com/restapi/v1.0/account/123/extension/321/call-log/B0iTLeNN-expL4g", "id": "B0iTLeNN-expL4g", "sessionId": "88052061020", "startTime": "2014-12-11T00:48:08.000Z", "duration": 11, "type": "Voice", "direction": "Inbound", "action": "Phone Call", "result": "Accepted", "to": {"phoneNumber": "1855COMPANY", "name": "Called Ext Name"}, "from": {"phoneNumber": "1650CALLER0", "name": "Called Ext Name", "location": "San Mateo, CA"} }, { "uri": "https://api.ringcentral.com/restapi/v1.0/account/123/extension/321/call-log/B0iNkuy10B0FLG0", "id": "B0iNkuy10B0FLG0", "sessionId": "88051027020", "startTime": "2014-12-11T00:40:13.000Z", "duration": 11, "type": "Voice", "direction": "Inbound", "action": "Phone Call", "result": "Accepted", "to": {"phoneNumber": "1855COMPANY", "name": "Called Ext Name"}, "from": {"phoneNumber": "1650CALLER0", "name": "Called Ext Name", "location": "San Mateo, CA"} } ] }, hangup: { presence: { "extensionId": 62480591, "telephonyStatus": "NoCall", "activeCalls": [ { "id": "1e8b5e8847924ab49f383bc8d355ee33", "direction": "Inbound", "from": "1650CALLER0", "to": "1855COMPANY", "telephonyStatus": "NoCall", "sessionId": "88052513020" } ], "sequence": 7272495 }, activeCalls: [], calls: [ { "uri": "https://api.ringcentral.com/restapi/v1.0/account/123/extension/321/call-log/B0iVoSn2fxQRMMQ", "id": "B0iVoSn2fxQRMMQ", "sessionId": "88052513020", "startTime": "2014-12-11T00:51:24.000Z", "duration": 42, "type": "Voice", "direction": "Inbound", "action": "Phone Call", "result": "Accepted", "to": {"phoneNumber": "1855COMPANY", "name": "Called Ext Name"}, "from": {"phoneNumber": "1650CALLER0", "name": "Called Ext Name", "location": "San Mateo, CA"} }, { "uri": "https://api.ringcentral.com/restapi/v1.0/account/123/extension/321/call-log/B0iTLeNN-expL4g", "id": "B0iTLeNN-expL4g", "sessionId": "88052061020", "startTime": "2014-12-11T00:48:08.000Z", "duration": 11, "type": "Voice", "direction": "Inbound", "action": "Phone Call", "result": "Accepted", "to": {"phoneNumber": "1855COMPANY", "name": "Called Ext Name"}, "from": {"phoneNumber": "1650CALLER0", "name": "Called Ext Name", "location": "San Mateo, CA"} }, { "uri": "https://api.ringcentral.com/restapi/v1.0/account/123/extension/321/call-log/B0iNkuy10B0FLG0", "id": "B0iNkuy10B0FLG0", "sessionId": "88051027020", "startTime": "2014-12-11T00:40:13.000Z", "duration": 11, "type": "Voice", "direction": "Inbound", "action": "Phone Call", "result": "Accepted", "to": {"phoneNumber": "1855COMPANY", "name": "Called Ext Name"}, "from": {"phoneNumber": "1650CALLER0", "name": "Called Ext Name", "location": "San Mateo, CA"} } ] } }; describe('mergePresenceCalls', function() { it('merges known presence calls', function(done) { var presenceCalls = []; presenceCalls = Call.mergePresenceCalls(presenceCalls, mocks.initial.presence); presenceCalls = Call.mergePresenceCalls(presenceCalls, mocks.ringing.presence); expect(presenceCalls.length).to.equal(1); expect(presenceCalls[0].startTime).to.not.equal(''); expect(presenceCalls[0].result).to.equal('In Progress'); var oldTime = presenceCalls[0].startTime; setTimeout(function() { presenceCalls = Call.mergePresenceCalls(presenceCalls, mocks.pickup.presence); expect(presenceCalls.length).to.equal(1); expect(presenceCalls[0].startTime).to.equal(oldTime); done(); }, 10); }); it('sets appropriate statuses', function(done) { var presenceCalls = Call.mergePresenceCalls([], mocks.initial.presence); presenceCalls = Call.mergePresenceCalls(presenceCalls, mocks.ringing.presence); expect(presenceCalls[0].result).to.equal('In Progress'); expect(presenceCalls[0].telephonyStatus).to.equal('Ringing'); setTimeout(function() { presenceCalls = Call.mergePresenceCalls(presenceCalls, mocks.pickup.presence); expect(presenceCalls[0].result).to.equal('In Progress'); expect(presenceCalls[0].telephonyStatus).to.equal('CallConnected'); }, 10); setTimeout(function() { presenceCalls = Call.mergePresenceCalls(presenceCalls, mocks.hangup.presence); expect(presenceCalls[0].result).to.equal('NoCall'); expect(presenceCalls[0].telephonyStatus).to.equal('NoCall'); done(); }, 20); }); }); describe('mergeAll', function() { it('merges together calls from presence, active calls, calls', function() { var presenceCalls = Call.mergePresenceCalls([], mocks.ringing.presence), allCalls = Call.mergeAll(presenceCalls, mocks.ringing.calls, mocks.ringing.activeCalls) .sort(Call.comparator()) .reverse(); expect(allCalls.length).to.equal(3); expect(allCalls[0].result).to.equal('In Progress'); expect((allCalls[0]).wayToDetermineItsACall).to.equal(true); expect((allCalls[0]).wayToDetermineOverwrite).to.equal(true); }); }); });