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

200 lines
6.6 KiB
JavaScript
Executable file

/* global MockNavigatorSettings, MocksHelper,
MockNavigatorMozMobileConnections, MockAirplaneModeServiceHelper,
MockLazyLoader, BaseModule, AirplaneModeIcon */
'use strict';
requireApp(
'system/shared/test/unit/mocks/mock_navigator_moz_mobile_connections.js');
requireApp('system/test/unit/mock_lazy_loader.js');
requireApp('system/shared/test/unit/mocks/mock_navigator_moz_settings.js');
requireApp('system/test/unit/mock_wifi_manager.js');
requireApp('system/test/unit/mock_airplane_mode_service_helper.js');
requireApp('system/js/service.js');
requireApp('system/js/base_module.js');
requireApp('system/js/base_ui.js');
requireApp('system/js/base_icon.js');
requireApp('system/js/airplane_mode_icon.js');
requireApp('system/js/airplane_mode.js');
var mocksForAirplaneMode = new MocksHelper([
'WifiManager',
'NavigatorMozMobileConnections',
'LazyLoader'
]).init();
suite('system/airplane_mode.js', function() {
var realSettings;
var realMobileConnections;
var subject;
mocksForAirplaneMode.attachTestHelpers();
suiteSetup(function() {
sinon.spy(MockLazyLoader, 'load');
realSettings = window.navigator.mozSettings;
window.navigator.mozSettings = MockNavigatorSettings;
realMobileConnections = window.navigator.mozMobileConnections;
window.navigator.mozMobileConnections = MockNavigatorMozMobileConnections;
});
suiteTeardown(function() {
window.navigator.mozSettings = realSettings;
MockNavigatorMozMobileConnections.mTeardown();
window.navigator.mozMobileConnections = realMobileConnections;
});
setup(function() {
subject = BaseModule.instantiate('AirplaneMode');
window.AirplaneModeServiceHelper = MockAirplaneModeServiceHelper;
subject.start();
subject.airplaneModeServiceHelper = new MockAirplaneModeServiceHelper();
subject.icon = new AirplaneModeIcon(subject);
this.sinon.stub(subject.icon, 'update');
});
teardown(function() {
subject.stop();
});
test('should lazy load icon', function() {
assert.isTrue(MockLazyLoader.load.calledWith(['js/airplane_mode_icon.js']));
});
suite('set enabled to true', function() {
suite('but _enabled is true already, do nothing', function() {
setup(function() {
this.sinon.spy(subject.airplaneModeServiceHelper, 'updateStatus');
subject._enabled = true;
subject.enabled = true;
});
test('nothing happend', function() {
assert.isFalse(subject.airplaneModeServiceHelper.updateStatus.called);
});
});
suite('_enabled is false, keep running', function() {
setup(function() {
this.sinon.stub(subject.airplaneModeServiceHelper, 'updateStatus');
subject._enabled = false;
// we have to make eventListeners to the newest state
MockNavigatorMozMobileConnections.mAddMobileConnection();
});
teardown(function() {
// we have to make eventListeners to the newest state
MockNavigatorMozMobileConnections.mTeardown();
});
suite('conn0 is enabling, conn1 is enabling', function() {
setup(function() {
this.sinon.stub(subject, '_updateAirplaneModeStatus');
setConnection(0, 'enabling');
setConnection(1, 'enabling');
subject.enabled = true;
});
test('no further steps because we are waiting for other events',
function() {
assert.isTrue(subject._updateAirplaneModeStatus.called);
});
});
suite('conn0 is enabling, conn1 is enabled', function() {
setup(function() {
this.sinon.stub(subject, '_updateAirplaneModeStatus');
setConnection(0, 'enabling');
setConnection(1, 'enabled');
subject.enabled = true;
});
test('no further steps because we are waiting for other events',
function() {
assert.isTrue(subject._updateAirplaneModeStatus.called);
});
});
suite('conn0 is enabled, conn1 is enabled', function() {
// we will wait for these two services
suiteSetup(function() {
setSettingOnServiceHelper('wifi.enabled', true);
setSettingOnServiceHelper('bluetooth.enabled', true);
});
suiteTeardown(function() {
setSettingOnServiceHelper('wifi.enabled', false);
setSettingOnServiceHelper('bluetooth.enabled', false);
});
setup(function() {
setConnection(0, 'enabled');
setConnection(1, 'enabled');
subject.enabled = true;
});
test('no further steps because we are waiting for other events',
function() {
// but because we are still waiting for the other window event,
// we we will not execute further steps
var checkedActions = subject._getCheckedActions(true);
assert.isFalse(
subject._areCheckedActionsAllDone(checkedActions));
});
});
suite('conn0 is enabled, conn1 is enabled', function() {
setup(function() {
setConnection(0, 'enabled');
setConnection(1, 'enabled');
this.sinon.stub(subject, 'writeSetting');
subject.enabled = true;
});
test('all other services are also done, we are in airplaneMode',
function() {
emitEvent('wifi-disabled');
emitEvent('bluetooth-disabled');
emitEvent('radio-disabled');
assert.deepEqual(subject.writeSetting.getCall(0).args[0], {
'airplaneMode.status': 'enabled',
'airplaneMode.enabled': true,
'ril.radio.disabled': true
});
assert.isTrue(subject.icon.update.called);
});
});
});
});
suite('AirplaneMode is enabled now', function() {
suite('but users want to dial out an emergency call', function() {
setup(function() {
subject._enabled = true;
setConnection(0, 'enabled');
setConnection(1, 'enabled');
});
test('we will leave airplane mode', function() {
emitEvent('radiostatechange', 'enabled');
emitEvent('wifi-enabled');
emitEvent('bluetooth-enabled');
emitEvent('radio-enabled');
assert.isTrue(subject.enabled);
});
});
});
// test helpers
function setSettingOnServiceHelper(key, value) {
subject.airplaneModeServiceHelper._settings[key] = value;
}
function setConnection(connIndex, status) {
MockNavigatorMozMobileConnections[connIndex].radioState = status;
}
function emitEvent(eventName, detail) {
var evt = new CustomEvent(eventName, {
detail: detail || null
});
window.dispatchEvent(evt);
}
});