VulpesOS/gaia/apps/wappush/test/unit/wappush_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

993 lines
35 KiB
JavaScript
Executable file

/* global CpScreenHelper, loadBodyHTML, MockL10n, MessageDB,
MockNavigatormozApps, MockNavigatorMozIccManager,
MockNavigatormozSetMessageHandler, MockNavigatorSettings,
MockNotification, MockNotificationHelper, MocksHelper,
WapPushManager, MockParsedProvisioningDoc, SiSlScreenHelper */
'use strict';
require('/shared/js/event_dispatcher.js');
require('/shared/test/unit/mocks/mock_dump.js');
require('/shared/test/unit/mocks/mock_navigator_moz_apps.js');
require('/shared/test/unit/mocks/mock_navigator_moz_set_message_handler.js');
require('/shared/test/unit/mocks/mock_notification.js');
require('/shared/test/unit/mocks/mock_notification_helper.js');
require('/shared/test/unit/mocks/mock_navigator_moz_icc_manager.js');
require('/shared/test/unit/mocks/mock_navigator_moz_settings.js');
require('/js/cp_screen_helper.js');
require('/js/messagedb.js');
require('/js/parsed_message.js');
require('/js/provisioning.js');
require('/js/si_sl_screen_helper.js');
require('/js/utils.js');
require('/js/wappush.js');
require('/shared/test/unit/mocks/mock_l10n.js');
require('/test/unit/mock_link_action_handler.js');
require('/test/unit/mock_whitelist.js');
require('/test/unit/mock_parsed_doc.js');
var mocksHelperWapPush = new MocksHelper([
'Dump',
'LinkActionHandler',
'NotificationHelper',
'Notification',
'WhiteList',
'ParsedProvisioningDoc'
]).init();
suite('WAP Push', function() {
var realMozApps;
var realMozIccManager;
var realMozSettings;
var realSetMessageHandler;
var realMozL10n;
var isDocumentHidden = false;
mocksHelperWapPush.attachTestHelpers();
suiteSetup(function() {
realMozApps = navigator.mozApps;
navigator.mozApps = MockNavigatormozApps;
realMozIccManager = navigator.mozIccManager;
navigator.mozIccManager = MockNavigatorMozIccManager;
realMozL10n = navigator.mozL10n;
navigator.mozL10n = MockL10n;
realMozSettings = navigator.mozSettings;
navigator.mozSettings = MockNavigatorSettings;
realSetMessageHandler = navigator.mozSetMessageHandler;
navigator.mozSetMessageHandler = MockNavigatormozSetMessageHandler;
});
suiteTeardown(function() {
navigator.mozApps = realMozApps;
navigator.mozL10n = realMozL10n;
navigator.mozSettings = realMozSettings;
navigator.mozSetMessageHandler = realSetMessageHandler;
});
setup(function(done) {
var notificationGetStub = function notificationGet() {
var options = {};
options.icon = 'icon';
options.tag = '0';
return {
then: function(onSuccess, onError, onProgress) {
onSuccess([
new MockNotification('1', options)
]);
}
};
};
this.sinon.stub(MockNotification, 'get', notificationGetStub);
mocksHelperWapPush.setup();
MockNavigatorSettings.createLock().set({ 'wap.push.enabled': 'true' });
loadBodyHTML('/index.html');
Object.defineProperty(document, 'hidden', {
configurable: true,
get: function() {
return isDocumentHidden;
}
});
MockNavigatorMozIccManager.addIcc(0, {});
MockNavigatormozSetMessageHandler.mSetup();
WapPushManager.init()
.then(MessageDB.clear.bind(MessageDB))
.then(done, done);
MockNavigatormozApps.mTriggerLastRequestSuccess();
});
teardown(function() {
delete document.hidden;
MockNavigatormozSetMessageHandler.mTeardown();
MockNavigatorMozIccManager.mTeardown();
MockNavigatormozApps.mTeardown();
MockNavigatorSettings.mTeardown();
mocksHelperWapPush.teardown();
});
suite('init', function() {
test('the message handlers are bound', function() {
var handlers = MockNavigatormozSetMessageHandler.mMessageHandlers;
assert.ok(handlers.notification);
assert.equal(handlers['wappush-received'],
WapPushManager.onWapPushReceived);
});
test('the headers are empty', function() {
assert.equal(document.getElementById('title-si-sl').textContent, '');
assert.equal(document.getElementById('title-apn').textContent, '');
assert.equal(document.getElementById('title-details').textContent, '');
assert.equal(document.getElementById('title-pin').textContent, '');
});
});
suite('unsupported message', function() {
var message = {
sender: '+31641600986',
contentType: 'text/foobar',
content: '',
serviceId: 0
};
test('unsupported messages are discarded', function(done) {
this.sinon.spy(MessageDB, 'put');
WapPushManager.onWapPushReceived(message).then(function() {
done(function checks() {
sinon.assert.notCalled(MessageDB.put);
});
}, done);
});
});
suite('receiving and displaying a SI message', function() {
var message = {
sender: '+31641600986',
contentType: 'text/vnd.wap.si',
content: '<si><indication href="http://www.mozilla.org">' +
'check this out</indication></si>',
serviceId: 0
};
test('the notification is sent and populated correctly', function(done) {
this.sinon.spy(MockNotificationHelper, 'send');
WapPushManager.onWapPushReceived(message).then(function() {
done(function checks() {
sinon.assert.calledWithMatch(MockNotificationHelper.send, {
id: 'message-title',
args: { title: message.sender }
}, {
bodyL10n: {
args: {
text: 'check this out',
url: 'http://www.mozilla.org'
},
id: 'si-message-body'
}
});
});
}, done);
});
test('the display is populated with the message contents', function(done) {
var title = document.getElementById('title-si-sl');
var screen = document.getElementById('si-sl-screen');
var container = screen.querySelector('.container');
var text = container.querySelector('p');
var link = container.querySelector('a');
this.sinon.stub(Date, 'now').returns(0);
this.sinon.spy(MockNotification.prototype, 'close');
this.sinon.spy(MockL10n, 'setAttributes');
this.sinon.spy(CpScreenHelper, 'hide');
WapPushManager.onWapPushReceived(message).then(function() {
return WapPushManager.displayWapPushMessage(0);
}).then(function() {
sinon.assert.calledWith(MockNotification.get, { tag: 0 });
sinon.assert.calledOnce(MockNotification.prototype.close);
sinon.assert.calledOnce(CpScreenHelper.hide);
sinon.assert.calledWith(MockL10n.setAttributes, title,
'message-title', { title: message.sender });
assert.equal(text.textContent, 'check this out');
assert.equal(link.textContent, 'http://www.mozilla.org');
assert.equal(link.dataset.url, 'http://www.mozilla.org');
assert.equal(link.href, 'http://www.mozilla.org/');
}).then(done, done);
});
suite('DSDS scenarios', function() {
setup(function() {
this.sinon.spy(MockNotificationHelper, 'send');
MockNavigatorMozIccManager.addIcc(1, {});
});
test('the notification is populated correctly for SIM1', function(done) {
WapPushManager.onWapPushReceived(message).then(function() {
done(function checks() {
sinon.assert.calledWithMatch(MockNotificationHelper.send, {
args: {
id: 1,
title: message.sender
},
id: 'message-title-with-sim'
});
});
}, done);
});
test('the notification is populated correctly for SIM2', function(done) {
message.serviceId = 1;
WapPushManager.onWapPushReceived(message).then(function() {
done(function checks() {
sinon.assert.calledWithMatch(MockNotificationHelper.send, {
args: {
id: 2,
title: message.sender
},
id: 'message-title-with-sim'
});
});
}, done);
});
});
});
suite('receiving and displaying a SL message', function() {
var message = {
sender: '+31641600986',
contentType: 'text/vnd.wap.sl',
content: '<sl href="http://www.mozilla.org" />',
serviceId: 0
};
test('the notification is sent and populated correctly', function(done) {
this.sinon.spy(MockNotificationHelper, 'send');
WapPushManager.onWapPushReceived(message).then(function() {
sinon.assert.calledWithMatch(MockNotificationHelper.send, {
id: 'message-title',
args: { title: message.sender }
}, {
bodyL10n: {
args: {
url: 'http://www.mozilla.org'
},
id: 'sl-message-body'
}
});
}).then(done, done);
});
test('the display is populated with the message contents', function(done) {
var title = document.getElementById('title-si-sl');
var screen = document.getElementById('si-sl-screen');
var container = screen.querySelector('.container');
var text = container.querySelector('p');
var link = container.querySelector('a');
this.sinon.stub(Date, 'now').returns(0);
this.sinon.spy(MockNotification.prototype, 'close');
this.sinon.spy(MockL10n, 'setAttributes');
this.sinon.spy(CpScreenHelper, 'hide');
WapPushManager.onWapPushReceived(message).then(function() {
return WapPushManager.displayWapPushMessage(0);
}).then(function() {
done(function checks() {
sinon.assert.calledWith(MockNotification.get, { tag: 0 });
sinon.assert.calledOnce(MockNotification.prototype.close);
sinon.assert.calledOnce(CpScreenHelper.hide);
sinon.assert.calledWith(MockL10n.setAttributes, title,
'message-title', { title: message.sender });
assert.equal(text.textContent, '');
assert.equal(link.textContent, 'http://www.mozilla.org');
assert.equal(link.dataset.url, 'http://www.mozilla.org');
assert.equal(link.href, 'http://www.mozilla.org/');
});
}, done);
});
});
suite('receiving and displaying a CP message', function() {
var messages = {
netwpin: {
sender: '22997',
contentType: 'text/vnd.wap.connectivity-xml',
content: '<wap-provisioningdoc></wap-provisioningdoc>',
authInfo: {
pass: true,
checked: true,
sec: 'NETWPIN',
mac: 'FAKEMAC',
data: 'FAKEDATA'
},
serviceId: 0
},
userpin: {
sender: '22997',
contentType: 'text/vnd.wap.connectivity-xml',
content: '<wap-provisioningdoc></wap-provisioningdoc>',
authInfo: {
pass: true,
checked: true,
sec: 'USERPIN',
mac: 'FAKEMAC',
data: 'FAKEDATA'
},
serviceId: 0
}
};
var apns = {
none: [],
single: [
{ carrier: 'Test APN'}
],
multiple: [
{ carrier: 'Test APN 1'},
{ carrier: 'Test APN 2'},
{ carrier: 'Test APN 3'}
],
};
test('the notification is sent and populated correctly', function(done) {
this.sinon.spy(MockNotificationHelper, 'send');
WapPushManager.onWapPushReceived(messages.netwpin).then(function() {
done(function checks() {
sinon.assert.calledWithMatch(MockNotificationHelper.send, {
args: { title: messages.netwpin.sender },
id: 'message-title'
}, {
bodyL10n: 'cp-message-received'
});
});
}, done);
});
test('the display shows warning message asking for install configuration',
function(done) {
var installCfgConfirmDialog =
document.getElementById('cp-install-configuration-confirm');
var acceptButton = installCfgConfirmDialog.querySelector('.accept');
this.sinon.stub(Date, 'now').returns(0);
this.sinon.spy(MockNotification.prototype, 'close');
this.sinon.spy(SiSlScreenHelper, 'hide');
WapPushManager.onWapPushReceived(messages.netwpin).then(function() {
return WapPushManager.displayWapPushMessage(0);
}).then(function() {
done(function checks() {
sinon.assert.notCalled(MockNotification.prototype.close);
sinon.assert.calledOnce(SiSlScreenHelper.hide);
assert.isFalse(acceptButton.classList.contains('hidden'),
'the accept button should be visible');
assert.isFalse(acceptButton.hidden);
});
}, done);
}
);
test('the app is closed when if the user does not accept the instalation',
function(done) {
var installCfgConfirmDialog =
document.getElementById('cp-install-configuration-confirm');
var cancelButton = installCfgConfirmDialog.querySelector('.cancel');
this.sinon.spy(WapPushManager, 'close');
this.sinon.stub(Date, 'now').returns(0);
this.sinon.spy(MockNotification.prototype, 'close');
WapPushManager.onWapPushReceived(messages.netwpin).then(function() {
return WapPushManager.displayWapPushMessage(0);
}).then(function() {
done(function checks() {
sinon.assert.notCalled(MockNotification.prototype.close);
assert.isFalse(cancelButton.classList.contains('hidden'),
'the accept button should be visible');
assert.isFalse(cancelButton.hidden);
cancelButton.click();
sinon.assert.calledOnce(WapPushManager.close);
});
}, done);
}
);
test('show finish dialog when no apns are present in a CP message',
function(done) {
MockParsedProvisioningDoc.mSetup(apns.none);
var installCfgConfirmDialog =
document.getElementById('cp-install-configuration-confirm');
var acceptCfgButton = installCfgConfirmDialog.querySelector('.accept');
var dialog = document.getElementById('cp-finish-confirm');
var finishButton = dialog.querySelector('button');
this.sinon.stub(Date, 'now').returns(0);
this.sinon.spy(MockNotification.prototype, 'close');
WapPushManager.onWapPushReceived(messages.netwpin).then(function() {
return WapPushManager.displayWapPushMessage(0);
}).then(function() {
done(function checks() {
sinon.assert.notCalled(MockNotification.prototype.close);
acceptCfgButton.click();
assert.isFalse(finishButton.classList.contains('hidden'),
'the accept button should be visible');
assert.isFalse(finishButton.hidden);
});
}, done);
}
);
test('details of apn are shown after warning message when a single apn ' +
'is defined in CP message',
function(done) {
MockParsedProvisioningDoc.mSetup(apns.single);
var title = document.getElementById('title-details');
var screen = document.getElementById('cp-details-screen');
var details = screen.querySelector('.message');
var installCfgConfirmDialog =
document.getElementById('cp-install-configuration-confirm');
var acceptCfgButton = installCfgConfirmDialog.querySelector('.accept');
this.sinon.stub(Date, 'now').returns(0);
this.sinon.spy(MockNotification.prototype, 'close');
this.sinon.spy(MockL10n, 'setAttributes');
WapPushManager.onWapPushReceived(messages.netwpin).then(function() {
return WapPushManager.displayWapPushMessage(0);
}).then(function() {
done(function checks() {
sinon.assert.notCalled(MockNotification.prototype.close);
acceptCfgButton.click();
sinon.assert.calledWith(MockL10n.setAttributes, title,
'message-title', { title: messages.netwpin.sender });
assert.isFalse(screen.classList.contains('left') ||
screen.classList.contains('right'),
'the details screen should be visible');
var apnList = details.getElementsByTagName('li');
assert.equal(apns.single.length, apnList.length);
for (var i = 0; i < apnList.length; i++) {
assert.equal(apns.single[i].carrier,
apnList[i].childNodes[1].textContent);
}
});
}, done);
}
);
test('apn list screen is shown after warning message when multiple apns ' +
'are defined in CP message',
function(done) {
MockParsedProvisioningDoc.mSetup(apns.multiple);
var titleApn = document.getElementById('title-apn');
var titleDetails = document.getElementById('title-details');
var apnScreen = document.getElementById('cp-apn-screen');
var detailsScreen = document.getElementById('cp-details-screen');
var apnsElement = apnScreen.querySelector('.message');
var installCfgConfirmDialog =
document.getElementById('cp-install-configuration-confirm');
var acceptCfgButton = installCfgConfirmDialog.querySelector('.accept');
this.sinon.stub(Date, 'now').returns(0);
this.sinon.spy(MockNotification.prototype, 'close');
this.sinon.spy(MockL10n, 'setAttributes');
WapPushManager.onWapPushReceived(messages.netwpin).then(function() {
return WapPushManager.displayWapPushMessage(0);
}).then(function() {
done(function checks() {
sinon.assert.notCalled(MockNotification.prototype.close);
acceptCfgButton.click();
sinon.assert.calledWith(MockL10n.setAttributes, titleApn,
'message-title', { title: messages.netwpin.sender });
assert.isFalse(apnScreen.classList.contains('left') ||
apnScreen.classList.contains('right'),
'the apn screen should be visible');
sinon.assert.calledWith(MockL10n.setAttributes, titleDetails,
'message-title', { title: messages.netwpin.sender });
assert.isTrue(detailsScreen.classList.contains('right'),
'the details screen should not be visible');
var apnList = apnsElement.getElementsByTagName('li');
assert.equal(apns.multiple.length, apnList.length);
for (var i = 0; i < apnList.length; i++) {
assert.equal(apns.multiple[i].carrier,
apnList[i].childNodes[0].childNodes[1].textContent);
}
// Test that click on apn element shows its details.
apnList[0].childNodes[0].click();
assert.isFalse(detailsScreen.classList.contains('left') ||
detailsScreen.classList.contains('right'),
'the details screen should be visible');
assert.isTrue(apnScreen.classList.contains('left'),
'the apn screen should not be visible');
});
}, done);
}
);
test('the display is populated with the NETWPIN message contents after ' +
'accepting installation ',
function(done) {
MockParsedProvisioningDoc.mSetup(apns.single);
var title = document.getElementById('title-pin');
var screen = document.getElementById('cp-pin-screen');
var acceptButton = document.getElementById('details-accept');
var pin = screen.querySelector('input');
var installCfgConfirmDialog =
document.getElementById('cp-install-configuration-confirm');
var acceptInstallButton =
installCfgConfirmDialog.querySelector('.accept');
this.sinon.stub(Date, 'now').returns(0);
this.sinon.spy(MockNotification.prototype, 'close');
this.sinon.spy(MockL10n, 'setAttributes');
WapPushManager.onWapPushReceived(messages.netwpin).then(function() {
return WapPushManager.displayWapPushMessage(0);
}).then(function() {
done(function checks() {
sinon.assert.notCalled(MockNotification.prototype.close);
acceptInstallButton.click();
acceptButton.click();
sinon.assert.calledWith(MockL10n.setAttributes, title,
'message-title', { title: messages.netwpin.sender });
assert.isFalse(screen.classList.contains('left') ||
screen.classList.contains('right'),
'the details screen should be visible');
assert.equal(pin.type, 'hidden');
});
}, done);
}
);
test('the display is populated with the USERPIN message contents after ' +
'accepting installation ',
function(done) {
MockParsedProvisioningDoc.mSetup(apns.single);
var title = document.getElementById('title-pin');
var screen = document.getElementById('cp-pin-screen');
var acceptButton = document.getElementById('details-accept');
var pin = screen.querySelector('input');
var installCfgConfirmDialog =
document.getElementById('cp-install-configuration-confirm');
var acceptInstallButton =
installCfgConfirmDialog.querySelector('.accept');
this.sinon.stub(Date, 'now').returns(0);
this.sinon.spy(MockNotification.prototype, 'close');
this.sinon.spy(MockL10n, 'setAttributes');
WapPushManager.onWapPushReceived(messages.userpin).then(function() {
return WapPushManager.displayWapPushMessage(0);
}).then(function() {
done(function checks() {
sinon.assert.notCalled(MockNotification.prototype.close);
acceptInstallButton.click();
acceptButton.click();
sinon.assert.calledWith(MockL10n.setAttributes, title,
'message-title', { title: messages.netwpin.sender });
assert.isFalse(screen.classList.contains('left') ||
screen.classList.contains('right'),
'the details screen should be visible');
assert.equal(pin.type, 'number');
});
}, done);
}
);
});
suite('handling out-of-order reception of messages', function() {
var messages = {
old: {
sender: '+31641600986',
contentType: 'text/vnd.wap.si',
content: '<si>' +
'<indication si-id="gaia-test@mozilla.org" ' +
' created="2013-09-03T12:35:33Z">' +
'old message' +
'</indication>' +
'</si>',
serviceId: 0
},
current: {
sender: '+31641600986',
contentType: 'text/vnd.wap.si',
content: '<si>' +
'<indication si-id="gaia-test@mozilla.org" ' +
' created="2013-09-03T14:35:33Z">' +
'current message' +
'</indication>' +
'</si>',
serviceId: 0
}
};
test('a new message updates an older one', function(done) {
var screen = document.getElementById('si-sl-screen');
var container = screen.querySelector('.container');
var text = container.querySelector('p');
this.sinon.spy(MockNotificationHelper, 'send');
this.sinon.stub(Date, 'now')
.onFirstCall().returns(0)
.onSecondCall().returns(1);
WapPushManager.onWapPushReceived(messages.old).then(function() {
return WapPushManager.onWapPushReceived(messages.current);
}).then(function() {
return WapPushManager.displayWapPushMessage(0);
}).then(function() {
done(function checks() {
sinon.assert.alwaysCalledWithMatch(MockNotificationHelper.send, {
id: 'message-title',
args: { title: messages.current.sender }
}, {
tag: '0'
});
assert.equal(text.textContent, 'current message');
});
}, done);
});
test('a new message updates an older one which is being viewed',
function(done) {
this.sinon.spy(SiSlScreenHelper, 'populateScreen');
this.sinon.stub(Date, 'now')
.onFirstCall().returns(0)
.onSecondCall().returns(1);
WapPushManager.onWapPushReceived(messages.old).then(function() {
return WapPushManager.displayWapPushMessage(0);
}).then(function() {
sinon.assert.calledOnce(SiSlScreenHelper.populateScreen);
sinon.assert.calledWithMatch(SiSlScreenHelper.populateScreen, {
text: 'old message'
});
SiSlScreenHelper.populateScreen.reset();
return WapPushManager.onWapPushReceived(messages.current);
}).then(function() {
sinon.assert.calledOnce(SiSlScreenHelper.populateScreen);
sinon.assert.calledWithMatch(SiSlScreenHelper.populateScreen, {
text: 'current message'
});
}).then(done, done);
});
test('an outdated message does not replace a newer one', function(done) {
var screen = document.getElementById('si-sl-screen');
var container = screen.querySelector('.container');
var text = container.querySelector('p');
this.sinon.spy(MockNotificationHelper, 'send');
this.sinon.stub(Date, 'now')
.onFirstCall().returns(0)
.onSecondCall().returns(1);
WapPushManager.onWapPushReceived(messages.current).then(function() {
return WapPushManager.onWapPushReceived(messages.old);
}).then(function() {
return WapPushManager.displayWapPushMessage(0);
}).then(function() {
done(function checks() {
sinon.assert.calledOnce(MockNotificationHelper.send);
sinon.assert.calledWithMatch(MockNotificationHelper.send, {
id: 'message-title',
args: { title: messages.current.sender }
}, {
tag: '0'
});
assert.equal(text.textContent, 'current message');
});
}, done);
});
});
suite('handling expired messages', function() {
var message = {
sender: '+31641600986',
contentType: 'text/vnd.wap.si',
content: '<si>' +
'<indication si-expires="2013-09-03T10:35:33Z">' +
'check this out' +
'</indication>' +
'</si>',
serviceId: 0
};
// UI elements
var screen;
var container;
var text;
setup(function() {
screen = document.getElementById('si-sl-screen');
container = screen.querySelector('.container');
text = container.querySelector('p');
});
test('the message is expired upon arrival', function(done) {
this.sinon.stub(Date, 'now')
.onFirstCall().returns(0)
.onSecondCall().returns(1378204533001);
this.sinon.spy(MockNotificationHelper, 'send');
WapPushManager.onWapPushReceived(message).then(function() {
sinon.assert.notCalled(MockNotificationHelper.send);
}).then(done, done);
});
test('the message is expired after arrival', function(done) {
this.sinon.stub(Date, 'now')
.onFirstCall().returns(0)
.onSecondCall().returns(0)
.onThirdCall().returns(1378204533001);
this.sinon.spy(MockL10n, 'setAttributes');
WapPushManager.onWapPushReceived(message).then(function() {
return WapPushManager.displayWapPushMessage(0);
}).then(function() {
sinon.assert.calledWith(MockL10n.setAttributes, text,
'this-message-has-expired');
}).then(done, done);
});
});
suite('handling actions', function() {
var clock;
var messages = {
none: {
sender: '+31641600986',
contentType: 'text/vnd.wap.si',
content: '<si>' +
'<indication si-id="gaia-test@mozilla.org"' +
' action="signal-none">' +
'check this out' +
'</indication>' +
'</si>',
serviceId: 0
},
signal_high: {
sender: '+31641600986',
contentType: 'text/vnd.wap.si',
content: '<si>' +
'<indication si-id="gaia-test@mozilla.org"' +
' action="signal-high">' +
'check this out' +
'</indication>' +
'</si>',
serviceId: 0
},
execute_high: {
sender: '+31641600986',
contentType: 'text/vnd.wap.sl',
content: '<sl href="http://www.mozilla.org" action="execute-high"/>',
serviceId: 0
},
no_action: {
sender: '+31641600986',
contentType: 'text/vnd.wap.si',
content: '<si>' +
'<indication si-id="gaia-test@mozilla.org">' +
'check this out' +
'</indication>' +
'</si>',
serviceId: 0
},
delete: {
sender: '+31641600986',
contentType: 'text/vnd.wap.si',
content: '<si>' +
'<indication si-id="gaia-test@mozilla.org"' +
' action="delete">' +
'check this out' +
'</indication>' +
'</si>',
serviceId: 0
}
};
setup(function() {
clock = this.sinon.useFakeTimers();
isDocumentHidden = true;
this.sinon.spy(MockNotificationHelper, 'send');
this.sinon.spy(window, 'close');
});
/* XXX: Workaround for bug 981521. We shouldn't send notifications for
* signal-none messages but we do until we'll have another way for the user
* to find & display them. */
test('action=signal-none sends a notification', function(done) {
WapPushManager.onWapPushReceived(messages.none).then(function() {
clock.tick(100);
sinon.assert.calledWithMatch(MockNotificationHelper.send, {
id: 'message-title',
args: { title: messages.none.sender }
}, {
bodyL10n: {
id: 'si-message-body',
args: { text: 'check this out' }
}
});
sinon.assert.calledOnce(window.close);
assert.isFalse(MockNavigatormozApps.mAppWasLaunched);
}).then(done, done);
});
test('action=signal-high displays the SI message immediately',
function(done) {
this.sinon.stub(SiSlScreenHelper, 'populateScreen', function() {
clock.tick(100);
sinon.assert.notCalled(MockNotificationHelper.send);
sinon.assert.notCalled(window.close);
sinon.assert.calledOnce(SiSlScreenHelper.populateScreen);
assert.isTrue(MockNavigatormozApps.mAppWasLaunched);
done();
});
WapPushManager.onWapPushReceived(messages.signal_high);
});
test('action=execute-high displays the SL message immediately',
function(done) {
this.sinon.stub(SiSlScreenHelper, 'populateScreen', function() {
clock.tick(100);
sinon.assert.notCalled(MockNotificationHelper.send);
sinon.assert.notCalled(window.close);
sinon.assert.calledOnce(SiSlScreenHelper.populateScreen);
assert.isTrue(MockNavigatormozApps.mAppWasLaunched);
done();
});
WapPushManager.onWapPushReceived(messages.execute_high);
});
test('action=delete causes notifications of the deleted messages to ' +
'be removed', function(done) {
this.sinon.spy(MockNotification.prototype, 'close');
this.sinon.stub(Date, 'now').returns(0);
WapPushManager.onWapPushReceived(messages.no_action).then(function() {
return WapPushManager.onWapPushReceived(messages.delete);
}).then(function() {
sinon.assert.calledOnce(MockNotificationHelper.send);
sinon.assert.calledWith(MockNotification.get, { tag: 0 });
sinon.assert.calledOnce(MockNotification.prototype.close);
}).then(done, done);
});
test('action=delete causes the app to be closed if the message is being ' +
'displayed', function(done) {
this.sinon.spy(MockNotification.prototype, 'close');
this.sinon.stub(Date, 'now').returns(0);
WapPushManager.onWapPushReceived(messages.no_action).then(function() {
return WapPushManager.displayWapPushMessage(0);
}).then(function() {
MockNotification.prototype.close.reset();
MockNotification.get.reset();
return WapPushManager.onWapPushReceived(messages.delete);
}).then(function() {
sinon.assert.calledWith(MockNotification.get, { tag: 0 });
sinon.assert.calledOnce(MockNotification.prototype.close);
clock.tick(100);
sinon.assert.calledOnce(window.close);
}).then(done, done);
});
});
suite('automatic closing of the application', function() {
var message = {
sender: '+31641600986',
contentType: 'text/vnd.wap.si',
content: '<si><indication href="http://www.mozilla.org">' +
'check this out</indication></si>',
serviceId: 0
};
var clock;
setup(function() {
clock = this.sinon.useFakeTimers();
this.sinon.spy(window, 'close');
});
test('the app is closed after displaying a notification', function(done) {
isDocumentHidden = true;
WapPushManager.onWapPushReceived(message).then(function() {
done(function checks() {
clock.tick(100);
sinon.assert.calledOnce(window.close);
});
}, done);
});
test('the app is not closed if it is visible', function(done) {
isDocumentHidden = false;
WapPushManager.onWapPushReceived(message).then(function() {
done(function checks() {
clock.tick(100);
sinon.assert.notCalled(window.close);
});
}, done);
});
test('the app is closed only after all messages have been processed',
function(done) {
isDocumentHidden = true;
WapPushManager.onWapPushReceived(message).then(function() {
sinon.assert.notCalled(window.close);
return WapPushManager.onWapPushReceived(message);
}).then(function() {
done(function checks() {
sinon.assert.notCalled(window.close);
clock.tick(100);
sinon.assert.calledOnce(window.close);
});
}, done);
}
);
test('prevent the app from closing if it becomes visible', function(done) {
isDocumentHidden = true;
WapPushManager.onWapPushReceived(message).then(function() {
sinon.assert.notCalled(window.close);
return WapPushManager.onWapPushReceived(message);
}).then(function() {
done(function checks() {
sinon.assert.notCalled(window.close);
clock.tick(50);
isDocumentHidden = false;
WapPushManager.onVisibilityChange();
clock.tick(50);
sinon.assert.notCalled(window.close);
});
}, done);
});
test('the app is closed when hidden', function() {
isDocumentHidden = false;
WapPushManager.onVisibilityChange();
clock.tick(100);
isDocumentHidden = true;
WapPushManager.onVisibilityChange();
clock.tick(100);
sinon.assert.calledOnce(window.close);
});
});
});