VulpesOS/gaia/apps/system/test/unit/voicemail_test.js
OverSu b38dea0597 Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
2026-09-30 23:13:03 +02:00

582 lines
20 KiB
JavaScript
Executable file

/* global MocksHelper,
MockL10n,
MockMozActivity,
MockNavigatorMozTelephony,
MockNavigatorMozVoicemail,
MockNavigatorSettings,
MockSIMSlotManager,
MockNotificationHelper,
ModalDialog,
Notification,
SIMSlotManager,
BaseModule
*/
'use strict';
requireApp('system/js/service.js');
requireApp('system/js/base_module.js');
requireApp('system/js/voicemail.js');
requireApp('system/js/settings_core.js');
requireApp('system/shared/test/unit/mocks/mock_simslot.js');
requireApp('system/shared/test/unit/mocks/mock_simslot_manager.js');
requireApp('system/test/unit/mock_activity.js');
require('/shared/test/unit/mocks/mock_l10n.js');
require('/shared/test/unit/mocks/mock_notification_helper.js');
requireApp('system/test/unit/mock_navigator_moz_voicemail.js');
requireApp('system/test/unit/mock_modal_dialog.js');
requireApp('system/shared/test/unit/mocks/mock_navigator_moz_settings.js');
requireApp('system/shared/test/unit/mocks/mock_navigator_moz_telephony.js');
var mocksForVoicemail = new MocksHelper([
'ModalDialog'
]).init();
suite('voicemail notification', function() {
var realMozVoicemail;
var realMozSettings;
var realSIMSlotManager;
var realL10n;
var realMozTelephony;
var realMozActivity;
var realNotificationHelper;
var subject;
var settingsCore;
mocksForVoicemail.attachTestHelpers();
var setupSpy;
suiteSetup(function() {
realMozVoicemail = navigator.mozVoicemail;
navigator.mozVoicemail = MockNavigatorMozVoicemail;
realMozSettings = navigator.mozSettings;
navigator.mozSettings = MockNavigatorSettings;
realSIMSlotManager = window.SIMSlotManager;
window.SIMSlotManager = MockSIMSlotManager;
realL10n = navigator.mozL10n;
navigator.mozL10n = MockL10n;
realMozTelephony = navigator.mozTelephony;
navigator.mozTelephony = MockNavigatorMozTelephony;
realMozActivity = window.MozActivity;
window.MozActivity = MockMozActivity;
realNotificationHelper = window.NotificationHelper;
window.NotificationHelper = MockNotificationHelper;
});
setup(function(done) {
this.sinon.stub(MockSIMSlotManager, 'hasOnlyOneSIMCardDetected',
function() {
return false;
});
settingsCore = BaseModule.instantiate('SettingsCore');
settingsCore.start();
subject = BaseModule.instantiate('Voicemail');
setupSpy = this.sinon.spy(subject, 'setupNotifications');
subject.start().then(function() {
done();
});
});
suiteTeardown(function() {
navigator.mozVoicemail = realMozVoicemail;
navigator.mozSettings = realMozSettings;
navigator.mozL10n = realL10n;
window.SIMSlotManager = realSIMSlotManager;
navigator.mozTelephony = realMozTelephony;
window.MozActivity = realMozActivity;
window.NotificationHelper = realNotificationHelper;
});
teardown(function() {
settingsCore.stop();
subject.stop();
MockNavigatorSettings.mTeardown();
MockSIMSlotManager.mTeardown();
MockNavigatorMozVoicemail.mTeardown();
});
test('init calls setup', function() {
sinon.assert.called(setupSpy);
});
suite('checking setup steps', function() {
var notificationGetStub, eventListenerSpy;
var voicemailNotification, systemNotification;
var voicemailSpy, systemSpy;
setup(function() {
voicemailNotification = new Notification('Voicemail', {
body: 'Voicemail notification',
tag: 'voicemailNotification:12347890'
});
voicemailSpy = this.sinon.spy(voicemailNotification, 'close');
systemNotification = new Notification('Battery', {
body: 'Battery notification',
tag: 'powerLevelCritical'
});
systemSpy = this.sinon.spy(systemNotification, 'close');
eventListenerSpy =
this.sinon.spy(MockNavigatorMozVoicemail, 'addEventListener');
notificationGetStub = function notificationGet() {
return Promise.resolve([voicemailNotification, systemNotification]);
};
this.sinon.stub(window.Notification, 'get', notificationGetStub);
});
test('remove only voicemail notification', function(done) {
subject.setupNotifications().then(function() {
sinon.assert.calledOnce(voicemailSpy);
sinon.assert.notCalled(systemSpy);
done();
}, done);
});
test('add event statuschanged voicemail listener', function(done) {
subject.setupNotifications().then(function() {
sinon.assert.calledWith(eventListenerSpy, 'statuschanged');
sinon.assert.callOrder(voicemailSpy, eventListenerSpy);
done();
}, done);
});
});
test('no voicemail status change, no notification', function(done) {
var showNotificationSpy = this.sinon.spy(subject, 'showNotification');
MockNavigatorMozVoicemail.mHasMessages = false;
MockNavigatorMozVoicemail.mTriggerEvent('statuschanged');
setTimeout(function() {
sinon.assert.notCalled(showNotificationSpy);
done();
});
});
suite('voicemail status change', function() {
var notificationSpy;
var notificationListenerSpy;
setup(function() {
notificationListenerSpy = this.sinon.spy('');
notificationSpy = this.sinon.stub(window.NotificationHelper,
'send').returns(Promise.resolve({
addEventListener: notificationListenerSpy,
close: function() {}
}));
});
suite('showNotification and hideNotification should be called correctly',
function() {
setup(function() {
this.sinon.spy(subject, 'showNotification');
this.sinon.spy(subject, 'hideNotification');
});
test('hasMessage is true', function(done) {
MockNavigatorMozVoicemail.mHasMessages = true;
MockNavigatorMozVoicemail.mTriggerEvent('statuschanged');
setTimeout(function() {
sinon.assert.calledOnce(subject.showNotification);
sinon.assert.notCalled(subject.hideNotification);
done();
});
});
test('hasMessage is false', function(done) {
MockNavigatorMozVoicemail.mHasMessages = false;
MockNavigatorMozVoicemail.mTriggerEvent('statuschanged');
setTimeout(function() {
sinon.assert.notCalled(subject.showNotification);
sinon.assert.calledOnce(subject.hideNotification);
done();
});
});
});
test('showNotification should create a notification with a single SIM',
function(done) {
MockSIMSlotManager.hasOnlyOneSIMCardDetected.restore();
this.sinon.stub(MockSIMSlotManager, 'hasOnlyOneSIMCardDetected',
function() {
return true;
});
subject.showNotification('title', 'text', '111').then(() => {
sinon.assert.calledWith(notificationSpy, 'title');
}).then(done, done);
});
suite('showNotification registers and triggers events handlers correctly',
function() {
var telephonyDialSpy;
var promptSpy;
var activitySpy;
var voicemailNumber = '111';
setup(function() {
telephonyDialSpy = this.sinon.spy(MockNavigatorMozTelephony, 'dial');
promptSpy = this.sinon.spy(ModalDialog, 'confirm');
activitySpy = this.sinon.spy(window, 'MozActivity');
});
test('should register a click when with a voice number',
function(done) {
subject.showNotification('title', 'text', voicemailNumber)
.then(() => {
sinon.assert.calledWith(notificationListenerSpy, 'click');
}
).then(done, done);
}
);
test('should register a close when with a voice number',
function(done) {
subject.showNotification('title', 'text', voicemailNumber)
.then(() => {
sinon.assert.calledWith(notificationListenerSpy, 'close');
}
).then(done, done);
}
);
test('should trigger handler when with a voice number',
function(done) {
subject.showNotification('title', 'text', voicemailNumber)
.then(() => {
notificationListenerSpy.yield();
sinon.assert.calledWith(telephonyDialSpy, voicemailNumber);
}
).then(done, done);
}
);
test('should register a click when there is no voicemail number',
function(done) {
subject.showNotification('title', 'text').then(() => {
sinon.assert.calledWith(notificationListenerSpy, 'click');
}).then(done, done);
});
test('should register a close when there is no voicemail number',
function(done) {
subject.showNotification('title', 'text').then(() => {
sinon.assert.calledWith(notificationListenerSpy, 'close');
}).then(done, done);
});
test('should trigger handler when without a voice number',
function(done) {
var expectedTitle = 'voicemailNoNumberTitle';
var expectedText = 'voicemailNoNumberText';
var expectedConfirm = {
title: 'voicemailNoNumberSettings',
callback: subject.showVoicemailSettings
};
subject.showNotification('title', 'text').then(() => {
notificationListenerSpy.yield();
sinon.assert.notCalled(telephonyDialSpy);
sinon.assert.calledWithMatch(
promptSpy, expectedTitle, expectedText, expectedConfirm);
}).then(done, done);
});
test('send MozActivity to display voicemail settings', function() {
var expectedActivity = {
name: 'configure',
data: {
target: 'device',
section: 'call'
}
};
subject.showVoicemailSettings();
sinon.assert.calledWith(activitySpy, expectedActivity);
});
});
function serviceIdTests(serviceId) {
suite('sim count: ' + (i + 1), function() {
suiteSetup(function() {
// When service id is 2, we test the multi sim case.
this.isMultiSIM = (serviceId !== 0);
sinon.stub(SIMSlotManager, 'isMultiSIM').returns(this.isMultiSIM);
});
suiteTeardown(function() {
SIMSlotManager.isMultiSIM.restore();
});
suite('showNotification should be called with correct parameters',
function() {
setup(function() {
this.voiceNumbers = ['111', '222'];
MockNavigatorMozVoicemail.mServiceId = serviceId;
MockNavigatorMozVoicemail.mNumbers = this.voiceNumbers;
MockNavigatorMozVoicemail.mHasMessages = true;
sinon.spy(subject, 'showNotification');
if (!this.isMultiSIM) {
MockSIMSlotManager.hasOnlyOneSIMCardDetected.restore();
this.sinon.stub(MockSIMSlotManager,
'hasOnlyOneSIMCardDetected', function() {
return true;
});
}
});
teardown(function() {
subject.showNotification.restore();
});
test('should/should not display SIM indicator', function(done) {
var baseTitle = 'aaaa';
var multiSimTitle = {
id: 'voicemailNotificationMultiSim',
args: {
n: 2,
title: baseTitle
}
};
subject.showNotification(
baseTitle, 'bbbb', '1111', serviceId).then(() => {
sinon.assert.calledOnce(notificationSpy);
assert.equal(
notificationSpy.firstCall.args[1].bodyL10n, 'bbbb');
assert.equal(notificationSpy.firstCall.args[1].tag,
'voicemailNotification:' + serviceId);
assert.equal(
notificationSpy.firstCall.args[1].mozbehavior.showOnlyOnce,
true);
if (this.isMultiSIM) {
assert.deepEqual(
notificationSpy.firstCall.args[0], multiSimTitle);
} else {
assert.equal(notificationSpy.firstCall.args[0], baseTitle);
}
}).then(done, done);
});
test('with returnMessage, with voicemail number', function(done) {
MockNavigatorMozVoicemail.mTriggerEvent('statuschanged');
Promise.resolve().then(() => {
// display the message count as title
var expectedTitle = { raw: MockNavigatorMozVoicemail.mMessage };
var expectedNumber = this.voiceNumbers[serviceId];
// display the voice mail number as body
var expectedText = {
id: 'dialNumber',
args: {
number: this.voiceNumbers[serviceId]
}
};
sinon.assert.calledWithExactly(subject.showNotification,
expectedTitle, expectedText,
expectedNumber, serviceId);
}).then(done, done);
});
test('without returnMessage, with voicemail number',
function(done) {
MockNavigatorMozVoicemail.mMessage = null;
MockNavigatorMozVoicemail.mTriggerEvent('statuschanged');
Promise.resolve().then(() => {
// display the message count as title
var expectedTitle = {
id: 'newVoicemails',
args: {
n: MockNavigatorMozVoicemail.mMessageCount
}
};
// display the voice mail number as body
var expectedText = {
id: 'dialNumber',
args: {
number: MockNavigatorMozVoicemail.mNumbers[serviceId]
}
};
sinon.assert.calledWithExactly(subject.showNotification,
expectedTitle, expectedText,
this.voiceNumbers[serviceId], serviceId);
}).then(done, done);
});
test('without returnMessage, messageCount is zero',
function(done) {
MockNavigatorMozVoicemail.mMessage = null;
MockNavigatorMozVoicemail.mMessageCount = 0;
MockNavigatorMozVoicemail.mTriggerEvent('statuschanged');
Promise.resolve(() => {
// display the unknown message as title
var expectedTitle = 'newVoicemailsUnknown';
// display the voice mail number as body
var expectedText = {
id: 'dialNumber',
args: {
number: MockNavigatorMozVoicemail.mNumbers[serviceId]
}
};
sinon.assert.calledWithExactly(subject.showNotification,
expectedTitle, expectedText,
this.voiceNumbers[serviceId], serviceId);
}).then(done, done);
});
test('without voicemail number', function(done) {
MockNavigatorMozVoicemail.mNumbers = [];
MockNavigatorMozVoicemail.mTriggerEvent('statuschanged');
Promise.resolve().then(() => {
// display the message as title
var expectedTitle = {raw: MockNavigatorMozVoicemail.mMessage};
// display the message as body
var expectedText = {raw: MockNavigatorMozVoicemail.mMessage};
sinon.assert.calledWithExactly(subject.showNotification,
expectedTitle, expectedText, undefined, serviceId);
}).then(done, done);
});
suite('value from settings', function() {
setup(function() {
MockNavigatorMozVoicemail.mNumbers = [];
MockNavigatorSettings.mTriggerObservers('ril.iccInfo.mbdn',
{settingValue: this.voiceNumbers});
});
teardown(function() {
MockNavigatorMozVoicemail.mNumbers = this.voiceNumbers;
MockNavigatorSettings.mTriggerObservers('ril.iccInfo.mbdn',
{settingValue: undefined});
});
test('without voicemail number, with ril.iccInfo.mbdn',
function(done) {
MockNavigatorMozVoicemail.mTriggerEvent('statuschanged');
Promise.resolve().then(() => {
// display the message as title
var expectedTitle = {raw:
MockNavigatorMozVoicemail.mMessage};
var expectedNumber = this.voiceNumbers[serviceId];
// display the message as body
var expectedText = {
id: 'dialNumber',
args: {
number: expectedNumber
}
};
sinon.assert.calledWithExactly(subject.showNotification,
expectedTitle, expectedText, expectedNumber, serviceId);
}).then(done, done);
});
});
});
});
}
for (var i = 0; i < 2; i++) {
serviceIdTests(i);
}
});
suite('placing voicemail calls', function() {
var notificationSpy;
var telephonyDialSpy;
var notificationListenerSpy;
var notificationTitle = 'Title';
var notificationText = 'Text';
var voicemailNumber = '111';
suiteSetup(function() {
realMozTelephony = navigator.mozTelephony;
navigator.mozTelephony = MockNavigatorMozTelephony;
});
setup(function() {
notificationListenerSpy = this.sinon.spy('');
notificationSpy = this.sinon.stub(window.NotificationHelper,
'send').returns(Promise.resolve({
addEventListener: notificationListenerSpy,
close: function() {}
}));
telephonyDialSpy = this.sinon.spy(MockNavigatorMozTelephony, 'dial');
});
suiteTeardown(function() {
MockNavigatorMozTelephony.mSuiteTeardown();
navigator.mozTelephony = realMozTelephony;
});
teardown(function() {
MockNavigatorMozTelephony.calls = [];
MockNavigatorMozTelephony.mTeardown();
});
test('place a call if there is none pending', function(done) {
MockNavigatorMozTelephony.calls = [];
subject.showNotification(
notificationTitle, notificationText, voicemailNumber).then(() => {
notificationListenerSpy.yield();
sinon.assert.calledWith(telephonyDialSpy, voicemailNumber, 0);
}).then(done, done);
});
test('place a call if there is less than two pending', function(done) {
MockNavigatorMozTelephony.calls = [{}];
subject.showNotification(
notificationTitle, notificationText, voicemailNumber).then(() => {
notificationListenerSpy.yield();
sinon.assert.calledWith(telephonyDialSpy, voicemailNumber, 0);
}).then(done, done);
});
test('do not place a call if there is already two pending', function(done) {
MockNavigatorMozTelephony.calls = [{}, {}];
subject.showNotification(
notificationTitle, notificationText, voicemailNumber).then(() => {
notificationListenerSpy.yield();
sinon.assert.notCalled(telephonyDialSpy);
}).then(done, done);
});
test('place a voicemail call to SIM 1', function(done) {
var serviceId = 0;
subject.showNotification(
notificationTitle, notificationText, voicemailNumber,
serviceId).then(() => {
notificationListenerSpy.yield();
sinon.assert.calledWithExactly(
telephonyDialSpy, voicemailNumber, serviceId);
}).then(done, done);
});
test('place a voicemail call to SIM 2', function(done) {
var serviceId = 1;
voicemailNumber = '222';
subject.showNotification(
notificationTitle, notificationText, voicemailNumber,
serviceId).then(() => {
notificationListenerSpy.yield();
sinon.assert.calledWithExactly(
telephonyDialSpy, voicemailNumber, serviceId);
}).then(done, done);
});
});
});