VulpesOS/gaia/apps/system/test/unit/findmydevice_launcher_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

305 lines
10 KiB
JavaScript
Executable file

/* global FMDNotificationsHandler,
MocksHelper,
MockL10n,
MockMozActivity,
MockNavigatormozSetMessageHandler,
MockNavigatorSettings,
MockNotificationHelper,
MockService,
MockSettingsHelper,
IAC_API_WAKEUP_REASON_LOGIN,
IAC_API_WAKEUP_REASON_LOGOUT,
IAC_API_WAKEUP_REASON_STALE_REGISTRATION,
IAC_API_WAKEUP_REASON_ENABLED_CHANGED,
IAC_API_WAKEUP_REASON_LOCKSCREEN_CLOSED,
FMDInit
*/
'use strict';
require('/shared/test/unit/mocks/mocks_helper.js');
require('/shared/test/unit/mocks/mock_moz_activity.js');
require('/shared/test/unit/mocks/mock_settings_helper.js');
require('/shared/test/unit/mocks/mock_dump.js');
require('/shared/test/unit/mocks/mock_l10n.js');
require('/shared/test/unit/mocks/mock_navigator_moz_settings.js');
require('/shared/test/unit/mocks/mock_navigator_moz_set_message_handler.js');
require('/shared/test/unit/mocks/mock_service.js');
require('/shared/js/findmydevice_iac_api.js');
require('/shared/test/unit/mocks/mock_notification_helper.js');
const FMD_RETRIES = 5;
const FMD_TAG = 'findmydevice.enable-failed';
var mocksForFindMyDevice = new MocksHelper([
'Dump', 'SettingsHelper', 'MozActivity', 'Service'
]).init();
suite('FindMyDevice Launcher >', function() {
var realMozSettings;
var realMozL10n;
var realMozSetMessageHandler;
var realNotificationHelper;
mocksForFindMyDevice.attachTestHelpers();
suiteSetup(function() {
realMozSettings = navigator.mozSettings;
realMozL10n = navigator.mozL10n;
realMozSetMessageHandler = navigator.mozSetMessageHandler;
realNotificationHelper = window.NotificationHelper;
window.NotificationHelper = MockNotificationHelper;
navigator.mozSettings = MockNavigatorSettings;
MockMozActivity.mSetup();
navigator.mozSetMessageHandler = MockNavigatormozSetMessageHandler;
MockNavigatormozSetMessageHandler.mSetup();
navigator.mozL10n = MockL10n;
});
suiteTeardown(function() {
navigator.mozSettings = realMozSettings;
navigator.mozL10n = realMozL10n;
window.NotificationHelper = realNotificationHelper;
navigator.mozSetMessageHandler = realMozSetMessageHandler;
MockNavigatorSettings.mTeardown();
MockNavigatormozSetMessageHandler.mTeardown();
});
setup(function(done) {
MockNavigatorSettings.mSetup();
require('/js/findmydevice_launcher.js', (function() {
FMDInit();
this.sinon.stub(window, 'wakeUpFindMyDevice');
done();
}).bind(this));
});
teardown(function() {
MockNavigatorSettings.mTeardown();
});
test('send ENABLED_CHANGED wakeup message when enabled', function() {
MockNavigatorSettings.mTriggerObservers('findmydevice.enabled',
{settingValue: true});
sinon.assert.calledWith(window.wakeUpFindMyDevice,
IAC_API_WAKEUP_REASON_ENABLED_CHANGED);
});
test('send ENABLED_CHANGED wakeup message when disabled', function() {
MockNavigatorSettings.mTriggerObservers('findmydevice.enabled',
{settingValue: false});
sinon.assert.calledWith(window.wakeUpFindMyDevice,
IAC_API_WAKEUP_REASON_ENABLED_CHANGED);
});
test('send STALE_REGISTRATION wakeup message when geolocation is enabled',
function() {
MockNavigatorSettings.mTriggerObservers('geolocation.enabled',
{settingValue: true});
sinon.assert.calledWith(window.wakeUpFindMyDevice,
IAC_API_WAKEUP_REASON_STALE_REGISTRATION);
});
test('send STALE_REGISTRATION wakeup message when geolocation is disabled',
function() {
MockNavigatorSettings.mTriggerObservers('geolocation.enabled',
{settingValue: false});
sinon.assert.calledWith(window.wakeUpFindMyDevice,
IAC_API_WAKEUP_REASON_STALE_REGISTRATION);
});
test('Notification appears only when FMD retry count >= limit', function() {
var notificationSpy = this.sinon.spy(window.NotificationHelper, 'send');
// try a retry count less than the limit
MockNavigatorSettings.mTriggerObservers('findmydevice.retry-count',
{settingValue: FMD_RETRIES - 1});
sinon.assert.callCount(notificationSpy, 0);
// equal to the limit
MockNavigatorSettings.mTriggerObservers('findmydevice.retry-count',
{settingValue: FMD_RETRIES});
sinon.assert.callCount(notificationSpy, 1);
// greater than the limit
MockNavigatorSettings.mTriggerObservers('findmydevice.retry-count',
{settingValue: FMD_RETRIES + 1});
sinon.assert.callCount(notificationSpy, 2);
assert.equal(notificationSpy.firstCall.args[0], 'unable-to-connect');
var options = notificationSpy.firstCall.args[1];
assert.equal(options.icon, 'style/find_my_device/images/findMyDevice.png');
assert.equal(options.tag, FMD_TAG);
assert.equal(options.data.systemMessageTarget, 'findmydevice');
});
test('MozActivity is issued if notification clicked', function(done) {
var notification = {
onclick: undefined,
};
this.sinon.stub(window.NotificationHelper, 'send').returns(
Promise.resolve(notification));
MockNavigatorSettings.mTriggerObservers('findmydevice.retry-count',
{settingValue: FMD_RETRIES});
var activitySpy = this.sinon.spy(window, 'MozActivity');
var expectedActivity = {
name : 'configure',
data : {
target : 'device',
section : 'findmydevice'
}
};
Promise.resolve().then(() => {
notification.onclick();
assert.isTrue(activitySpy.calledWithNew());
sinon.assert.calledWith(activitySpy, expectedActivity);
}).then(done, done);
});
test('FMD disabled if retry-count >= limit, notification tapped', function() {
MockSettingsHelper('findmydevice.enabled').set(true);
MockNavigatorSettings.mTriggerObservers('findmydevice.retry-count',
{settingValue: FMD_RETRIES});
MockSettingsHelper('findmydevice.enabled').get(
function(val) {
assert.equal(val, false, 'enabled should be false');
});
});
test('clear lockscreen message when the lockscreen unlocks', function() {
window.dispatchEvent(new CustomEvent('lockscreen-request-unlock'));
assert.equal(
MockSettingsHelper.instances['lockscreen.lock-message'].value, '');
});
test('fmd is awoken with LOCKSCREEN_CLOSED on lockscreen unlock', function() {
window.dispatchEvent(new CustomEvent('lockscreen-request-unlock'));
sinon.assert.calledWith(window.wakeUpFindMyDevice,
IAC_API_WAKEUP_REASON_LOCKSCREEN_CLOSED);
});
test('fmd is not awoken with LOCKSCREEN_CLOSED on lockscreen camera launch',
function() {
window.dispatchEvent(
new CustomEvent('lockscreen-request-unlock',
{detail: {activity: {name: 'record'}}}));
sinon.assert.notCalled(window.wakeUpFindMyDevice,
IAC_API_WAKEUP_REASON_LOCKSCREEN_CLOSED);
}
);
test('send LOGIN wakeup message on FxA login', function() {
window.dispatchEvent(
new CustomEvent('mozFxAccountsUnsolChromeEvent',
{detail: {eventName: 'onlogin'}}));
sinon.assert.calledWith(window.wakeUpFindMyDevice,
IAC_API_WAKEUP_REASON_LOGIN);
});
test('send LOGIN wakeup message on FxA verified', function() {
window.dispatchEvent(
new CustomEvent('mozFxAccountsUnsolChromeEvent',
{detail: {eventName: 'onverified'}}));
sinon.assert.calledWith(window.wakeUpFindMyDevice,
IAC_API_WAKEUP_REASON_LOGIN);
});
test('send LOGOUT wakeup message on FxA logout', function() {
window.dispatchEvent(
new CustomEvent('mozFxAccountsUnsolChromeEvent',
{detail: {eventName: 'onlogout'}}));
sinon.assert.calledWith(window.wakeUpFindMyDevice,
IAC_API_WAKEUP_REASON_LOGOUT);
});
suite('System message notification', function() {
var serviceSpy;
var notification = {
body: 'tap-to-check-settings',
tag: FMD_TAG,
data: {
systemMessageTarget: 'screenshot'
},
close: function() {}
};
suite('start condition', function() {
test('FMDInit() requests handleSystemMessageNotification service',
function() {
serviceSpy = this.sinon.spy(MockService, 'request');
FMDInit();
assert.isTrue(serviceSpy.calledOnce);
assert.isTrue(serviceSpy.calledWith(
'handleSystemMessageNotification', 'findmydevice',
FMDNotificationsHandler));
});
});
suite('handleSystemMessageNotification behavior', function() {
test('calls FMDOpenSettings', function() {
var FMDOpenSettingsSpy = this.sinon.spy(window, 'FMDOpenSettings');
FMDNotificationsHandler.handleSystemMessageNotification(notification);
assert.isTrue(FMDOpenSettingsSpy.calledOnce);
});
test('calls closeSystemMessageNotification',
function() {
var closeSpy = this.sinon.spy(FMDNotificationsHandler,
'closeSystemMessageNotification');
FMDNotificationsHandler.handleSystemMessageNotification(notification);
assert.isTrue(closeSpy.calledOnce);
assert.isTrue(closeSpy.calledWith(notification));
});
});
suite('closeSystemMessageNotification behavior', function() {
var notifCloseSpy, notificationGetStub;
setup(function() {
notifCloseSpy = this.sinon.spy(notification, 'close');
notificationGetStub = function notificationGet() {
return {
then: function(cb) {
cb && cb([ notification ]);
}
};
};
this.sinon.stub(window.Notification, 'get', notificationGetStub);
});
test('closes notification by tag', function() {
FMDNotificationsHandler.closeSystemMessageNotification(notification);
assert.isTrue(window.Notification.get.calledOnce);
assert.isTrue(window.Notification.get.calledWith(
{ tag: notification.tag}));
assert.isTrue(notifCloseSpy.calledOnce);
});
test('closes notification by body', function() {
var tag = notification.tag;
notification.tag = undefined;
FMDNotificationsHandler.closeSystemMessageNotification(notification);
assert.isTrue(window.Notification.get.calledOnce);
assert.isTrue(window.Notification.get.calledWith(
{ tag: notification.tag}));
assert.isTrue(notifCloseSpy.calledOnce);
notification.tag = tag;
});
});
});
});