VulpesOS/gaia/apps/costcontrol/test/unit/settings_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

722 lines
22 KiB
JavaScript
Executable file

/* global Settings, ConfigManager, Formatting, MocksHelper, MockCommon,
MockConfigManager, MockCostControl, SimManager
*/
'use strict';
require('/test/unit/mock_date.js');
require('/test/unit/mock_moz_l10n.js');
require('/shared/test/unit/mocks/mock_lazy_loader.js');
require('/test/unit/mock_debug.js');
require('/test/unit/mock_common.js');
require('/shared/test/unit/load_body_html_helper.js');
require('/js/view_manager.js');
require('/js/views/BalanceView.js');
require('/test/unit/mock_cost_control.js');
require('/test/unit/mock_config_manager.js');
require('/js/utils/formatting.js');
require('/js/views/BalanceLowLimitView.js');
require('/js/views/ResetMenuDialog.js');
require('/js/views/ConfirmDialog.js');
require('/js/settings/limitdialog.js');
require('/js/settings/autosettings.js');
require('/js/settings/settings.js');
require('/js/sim_manager.js');
require('/js/utils/toolkit.js');
require('/shared/js/component_utils.js');
require('/shared/elements/gaia_switch/script.js');
require('/shared/elements/gaia-header/dist/gaia-header.js');
require('/shared/elements/gaia_subheader/script.js');
var realMozL10n,
realAddNetworkUsageAlarm,
realDate;
if (!window.navigator.mozL10n) {
window.navigator.mozL10n = null;
}
if (!window.realAddNetworkUsageAlarm) {
window.realAddNetworkUsageAlarm = null;
}
var MocksHelperForUnitTest = new MocksHelper([
'LazyLoader',
'Common',
'CostControl',
'ConfigManager'
]).init();
suite('Settings Test Suite >', function() {
MocksHelperForUnitTest.attachTestHelpers();
var mobileUsage, wifiUsage;
var domSelectorsForLayout = [
{
name: 'planTypeSelector',
selector: '#plantype-settings',
isHiddenOnPostpaidLayout: false,
isHiddenOnPrepaidLayout: false,
isHiddenOnDataUsageOnlyLayout: true
}, {
name: 'phoneActivitySettings',
selector: '#phone-activity-settings + .settings',
isHiddenOnPostpaidLayout: false,
isHiddenOnPrepaidLayout: true,
isHiddenOnDataUsageOnlyLayout: true
}, {
name: 'phoneActivityTitle',
selector: '#phone-activity-settings',
isHiddenOnPostpaidLayout: false,
isHiddenOnPrepaidLayout: true,
isHiddenOnDataUsageOnlyLayout: true
}, {
name: 'balanceTitle',
selector: '#balance-settings',
isHiddenOnPostpaidLayout: true,
isHiddenOnPrepaidLayout: false,
isHiddenOnDataUsageOnlyLayout: true
}, {
name: 'balanceSettings',
selector: '#balance-settings + .settings',
isHiddenOnPostpaidLayout: true,
isHiddenOnPrepaidLayout: false,
isHiddenOnDataUsageOnlyLayout: true
}, {
name: 'reportsTitle',
selector: '#phone-internet-settings',
isHiddenOnPostpaidLayout: false,
isHiddenOnPrepaidLayout: true,
isHiddenOnDataUsageOnlyLayout: false
}
];
suiteSetup(function() {
window.Common = new MockCommon();
realMozL10n = window.navigator.mozL10n;
window.navigator.mozL10n = window.MockMozL10n;
realAddNetworkUsageAlarm = window.addNetworkUsageAlarm;
window.addNetworkUsageAlarm = function() {};
realDate = window.Date;
});
setup(function() {
var now = new Date(2014, 5, 24); // 2014-06-24
window.Date = new window.MockDateFactory(now);
loadBodyHTML('/settings.html');
// Data usage elements
mobileUsage = document.querySelector('#mobile-data-usage > span');
wifiUsage = document.querySelector('#wifi-data-usage > span');
});
teardown(function() {
window.Date = realDate;
window.location.hash = '';
});
suiteTeardown(function() {
window.navigator.mozL10n = realMozL10n;
window.addNetworkUsageAlarm = realAddNetworkUsageAlarm;
});
function setupApplicationMode(applicationMode, fakeConfiguration) {
window.ConfigManager = new MockConfigManager({
fakeConfiguration: fakeConfiguration,
fakeSettings: {
dataLimit: true,
dataLimitValue: 40,
dataLimitUnit: 'MB',
lowLimit: true,
trackingPeriod: 'monthly',
resetTime: 1
},
applicationMode: applicationMode
});
}
function setupPrepaidMode() {
var fakeConfiguration = {
default_low_limit_threshold: 3,
credit: { currency: 'R$' }
};
setupApplicationMode('PREPAID', fakeConfiguration);
}
function setupTestScenario(costControlConfig, applicationMode) {
window.CostControl = new MockCostControl(costControlConfig);
window.ConfigManager = new MockConfigManager({
fakeConfiguration: {
default_low_limit_threshold: 3,
credit: { currency: 'R$' }
},
fakeSettings: {
dataLimit: true,
dataLimitValue: 40,
dataLimitUnit: 'MB',
lowLimit: true,
lastTelephonyActivity: 3456
},
applicationMode: applicationMode
});
}
function triggerEvent(element, eventName) {
var event = document.createEvent('HTMLEvents');
event.initEvent(eventName, true, true);
element.dispatchEvent(event);
}
var requestToCheckLayout = function(assertingFunction, done) {
return {
request: function(requestedObj, callback) {
(typeof assertingFunction === 'function') && assertingFunction(done);
}
};
};
function assertPostpaidLayout(done) {
domSelectorsForLayout.forEach(function checkVisibility(element) {
var domElement = document.querySelector(element.selector);
assert.equal(domElement.hidden, element.isHiddenOnPostpaidLayout,
'The visibility of ' + element.name + ' is incorrect');
});
done();
}
function assertPrepaidLayout(done) {
domSelectorsForLayout.forEach(function checkVisibility(element) {
var domElement = document.querySelector(element.selector);
assert.equal(domElement.hidden, element.isHiddenOnPrepaidLayout,
'The visibility of ' + element.name + ' is incorrect');
});
done();
}
function assertDataUsageOnlyLayout(done) {
domSelectorsForLayout.forEach(function checkVisibility(element) {
var domElement = document.querySelector(element.selector);
assert.equal(domElement.hidden, element.isHiddenOnDataUsageOnlyLayout,
'The visibility of ' + element.name + 'is incorrect');
});
done();
}
test('Layout postpaid mode is correctly loaded', function(done) {
var costControlConfig = requestToCheckLayout(assertPostpaidLayout, done);
setupTestScenario(costControlConfig, 'POSTPAID');
Settings.initialize();
});
test('Layout prepaid mode is correctly loaded', function(done) {
var costControlConfig = requestToCheckLayout(assertPrepaidLayout, done);
setupTestScenario(costControlConfig, 'PREPAID');
Settings.initialize();
});
test('Layout data_usage_only mode is correctly loaded', function(done) {
var costControlConfig = requestToCheckLayout(assertDataUsageOnlyLayout,
done);
setupTestScenario(costControlConfig, 'DATA_USAGE_ONLY');
Settings.initialize();
});
test('updateDataUsage works correctly', function(done) {
setupPrepaidMode();
var lastDataUsage = {
timestamp: new Date(),
today: new Date(),
wifi: {
total: 222
},
mobile: {
total: 333
}
};
sinon.stub(Settings, 'updateUI', function() {
ConfigManager.mTriggerCallback('lastDataUsage', lastDataUsage,
{lastCompleteDataReset: new Date() });
var mobileDataUsage = Formatting.formatData(
Formatting.roundData(lastDataUsage.mobile.total));
var wifiDataUsage = Formatting.formatData(
Formatting.roundData(lastDataUsage.wifi.total));
assert.equal(mobileUsage.textContent, mobileDataUsage);
assert.equal(wifiUsage.textContent, wifiDataUsage);
Settings.updateUI.restore();
ConfigManager.mRemoveObservers();
done();
});
Settings.initialize();
});
test('Default values for reset time (monthly)', function(done) {
setupPrepaidMode();
sinon.stub(Settings, 'updateUI', function() {
var today = new Date();
// Initial value for tracking period is monthly and for resetTime 1
// Force the initialization of the resetTime field
ConfigManager.mTriggerCallback('trackingPeriod');
assert.equal(ConfigManager.option('resetTime'), today.getDate());
Settings.updateUI.restore();
done();
});
Settings.initialize();
});
test('Default values for reset time (weekly)', function(done) {
setupPrepaidMode();
sinon.stub(Settings, 'updateUI', function() {
var today = new Date();
// Initial value for tracking period is monthly and for resetTime 1
// Change tracking period to weekly
ConfigManager.option('trackingPeriod', 'weekly');
ConfigManager.mTriggerCallback('trackingPeriod', 'weekly');
assert.equal(ConfigManager.option('trackingPeriod'), 'weekly');
assert.equal(ConfigManager.option('resetTime'), today.getDay());
Settings.updateUI.restore();
done();
});
Settings.initialize();
});
suite('Data Limit Configurator Test Suite >', function() {
var dataLimitDialog, dataLimitInput, dataLimitOkButton, limitUnitValue,
dataLimitSwitchUnitButton, dataLimitHeader;
var evtInput = new CustomEvent('input', {});
setup(function() {
dataLimitDialog = document.getElementById('data-limit-dialog');
dataLimitInput = dataLimitDialog.querySelector('input');
dataLimitOkButton = dataLimitDialog.querySelector('button.recommend');
dataLimitHeader = document.getElementById('limit-dialog-header');
dataLimitSwitchUnitButton = dataLimitDialog.
querySelector('.switch-unit-button');
limitUnitValue = dataLimitSwitchUnitButton.querySelector('span.tag');
});
function initDataLimitDialog() {
// Init the dataLimitDialog values
ConfigManager.mTriggerCallback('dataLimitValue', 40);
ConfigManager.mTriggerCallback('dataLimitUnit', 'MB');
// load Limit dialog
var dataLimitButton =
document.querySelector('[data-widget-type=data-limit]');
triggerEvent(dataLimitButton, 'click');
}
function assertDataLimitInputInvalid() {
assert.isTrue(dataLimitInput.classList.contains('error'));
assert.isTrue(dataLimitOkButton.disabled);
}
function assertDataLimitInputValid() {
assert.isFalse(dataLimitInput.classList.contains('error'));
assert.isFalse(dataLimitOkButton.disabled);
}
suite('Valid Values >', function() {
test('Real values', function(done) {
setupPrepaidMode();
sinon.stub(Settings, 'updateUI', function() {
initDataLimitDialog();
dataLimitInput.value = '912.05';
dataLimitInput.dispatchEvent(evtInput);
assertDataLimitInputValid();
dataLimitInput.value = '0.5';
dataLimitInput.dispatchEvent(evtInput);
assertDataLimitInputValid();
triggerEvent(dataLimitHeader, 'action');
Settings.updateUI.restore();
done();
});
Settings.initialize();
});
test('Atypical values', function(done) {
setupPrepaidMode();
sinon.stub(Settings, 'updateUI', function() {
initDataLimitDialog();
// bug 1073340 - 0.07 produces a decimal multiplication overflow
dataLimitInput.value = '0.07';
dataLimitInput.dispatchEvent(evtInput);
assertDataLimitInputValid();
triggerEvent(dataLimitHeader, 'action');
Settings.updateUI.restore();
done();
});
Settings.initialize();
});
test('Numbers without significant digits', function(done) {
setupPrepaidMode();
sinon.stub(Settings, 'updateUI', function() {
initDataLimitDialog();
dataLimitInput.value = '.1';
dataLimitInput.dispatchEvent(evtInput);
assertDataLimitInputValid();
dataLimitInput.value = '.78';
dataLimitInput.dispatchEvent(evtInput);
assertDataLimitInputValid();
triggerEvent(dataLimitHeader, 'action');
Settings.updateUI.restore();
done();
});
Settings.initialize();
});
test('Natural numbers', function(done) {
setupPrepaidMode();
sinon.stub(Settings, 'updateUI', function() {
initDataLimitDialog();
dataLimitInput.value = '120';
dataLimitInput.dispatchEvent(evtInput);
assertDataLimitInputValid();
dataLimitInput.value = '0000456';
dataLimitInput.dispatchEvent(evtInput);
assertDataLimitInputValid();
triggerEvent(dataLimitHeader, 'action');
Settings.updateUI.restore();
done();
});
Settings.initialize();
});
test('Natural numbers with no significant zeros', function(done) {
setupPrepaidMode();
sinon.stub(Settings, 'updateUI', function() {
initDataLimitDialog();
dataLimitInput.value = '0000456';
dataLimitInput.dispatchEvent(evtInput);
assertDataLimitInputValid();
triggerEvent(dataLimitHeader, 'action');
Settings.updateUI.restore();
done();
});
Settings.initialize();
});
});
suite('Invalid values >', function() {
test('Negative Values', function(done) {
setupPrepaidMode();
sinon.stub(Settings, 'updateUI', function() {
initDataLimitDialog();
dataLimitInput.value = '-12.456';
dataLimitInput.dispatchEvent(evtInput);
assertDataLimitInputInvalid();
triggerEvent(dataLimitHeader, 'action');
Settings.updateUI.restore();
done();
});
Settings.initialize();
});
test('Separator invalid', function(done) {
setupPrepaidMode();
sinon.stub(Settings, 'updateUI', function() {
initDataLimitDialog();
dataLimitInput.value = '12,456';
dataLimitInput.dispatchEvent(evtInput);
assertDataLimitInputInvalid();
triggerEvent(dataLimitHeader, 'action');
Settings.updateUI.restore();
done();
});
Settings.initialize();
});
test('Too decimal Separators', function(done) {
setupPrepaidMode();
sinon.stub(Settings, 'updateUI', function() {
initDataLimitDialog();
dataLimitInput.value = '124..56';
dataLimitInput.dispatchEvent(evtInput);
assertDataLimitInputInvalid();
triggerEvent(dataLimitHeader, 'action');
Settings.updateUI.restore();
done();
});
Settings.initialize();
});
test('Not numeric', function(done) {
setupPrepaidMode();
sinon.stub(Settings, 'updateUI', function() {
initDataLimitDialog();
dataLimitInput.value = 'a';
dataLimitInput.dispatchEvent(evtInput);
assertDataLimitInputInvalid();
triggerEvent(dataLimitHeader, 'action');
Settings.updateUI.restore();
done();
});
Settings.initialize();
});
test('Too long', function(done) {
setupPrepaidMode();
sinon.stub(Settings, 'updateUI', function() {
initDataLimitDialog();
dataLimitInput.value = '12456';
dataLimitInput.dispatchEvent(evtInput);
assertDataLimitInputInvalid();
triggerEvent(dataLimitHeader, 'action');
Settings.updateUI.restore();
done();
});
Settings.initialize();
});
});
suite('Automatic input corrections >', function() {
test('No action ', function(done) {
setupPrepaidMode();
sinon.stub(Settings, 'updateUI', function() {
initDataLimitDialog();
dataLimitInput.value = '12.34';
dataLimitInput.dispatchEvent(evtInput);
assert.equal(dataLimitInput.value, '12.34');
dataLimitInput.value = '9912';
dataLimitInput.dispatchEvent(evtInput);
assert.equal(dataLimitInput.value, '9912');
triggerEvent(dataLimitHeader, 'action');
Settings.updateUI.restore();
done();
});
Settings.initialize();
});
test('No corrections with invalid entries', function(done) {
setupPrepaidMode();
this.sinon.stub(Settings, 'updateUI', function() {
initDataLimitDialog();
dataLimitInput.value = '0';
dataLimitInput.dispatchEvent(evtInput);
assert.equal(dataLimitInput.value, '0');
assertDataLimitInputInvalid();
dataLimitInput.value = '0.';
dataLimitInput.dispatchEvent(evtInput);
assert.equal(dataLimitInput.value, '0.');
assertDataLimitInputInvalid();
dataLimitInput.value = '0.0';
dataLimitInput.dispatchEvent(evtInput);
assert.equal(dataLimitInput.value, '0.0');
assertDataLimitInputInvalid();
dataLimitInput.value = '.';
dataLimitInput.dispatchEvent(evtInput);
assert.equal(dataLimitInput.value, '.');
assertDataLimitInputInvalid();
dataLimitInput.value = '.0';
dataLimitInput.dispatchEvent(evtInput);
assert.equal(dataLimitInput.value, '.0');
assertDataLimitInputInvalid();
triggerEvent(dataLimitHeader, 'action');
done();
});
Settings.initialize();
});
test('Removing left zeros ', function(done) {
setupPrepaidMode();
sinon.stub(Settings, 'updateUI', function() {
initDataLimitDialog();
dataLimitInput.value = '02.04';
dataLimitInput.dispatchEvent(evtInput);
assert.equal(dataLimitInput.value, '2.04');
dataLimitInput.value = '007';
dataLimitInput.dispatchEvent(evtInput);
assert.equal(dataLimitInput.value, '7');
dataLimitInput.value = '000012.31';
dataLimitInput.dispatchEvent(evtInput);
assert.equal(dataLimitInput.value, '12.31');
triggerEvent(dataLimitHeader, 'action');
Settings.updateUI.restore();
done();
});
Settings.initialize();
});
test('Removing right zeros ', function(done) {
setupPrepaidMode();
sinon.stub(Settings, 'updateUI', function() {
initDataLimitDialog();
dataLimitInput.value = '77.60';
dataLimitInput.dispatchEvent(evtInput);
assert.equal(dataLimitInput.value, '77.6');
dataLimitInput.value = '442.01000';
dataLimitInput.dispatchEvent(evtInput);
assert.equal(dataLimitInput.value, '442.01');
triggerEvent(dataLimitHeader, 'action');
Settings.updateUI.restore();
done();
});
Settings.initialize();
});
test('Removing both sides ', function(done) {
setupPrepaidMode();
sinon.stub(Settings, 'updateUI', function() {
initDataLimitDialog();
dataLimitInput.value = '012.010';
dataLimitInput.dispatchEvent(evtInput);
assert.equal(dataLimitInput.value, '12.01');
dataLimitInput.value = '0000062.1000';
dataLimitInput.dispatchEvent(evtInput);
assert.equal(dataLimitInput.value, '62.1');
triggerEvent(dataLimitHeader, 'action');
Settings.updateUI.restore();
done();
});
Settings.initialize();
});
test('Fill with left zero ', function(done) {
setupPrepaidMode();
sinon.stub(Settings, 'updateUI', function() {
initDataLimitDialog();
dataLimitInput.value = '.31';
dataLimitInput.dispatchEvent(evtInput);
assert.equal(dataLimitInput.value, '0.31');
triggerEvent(dataLimitHeader, 'action');
Settings.updateUI.restore();
done();
});
Settings.initialize();
});
});
test('dataLimitConfigurer Cancel button behaviour', function(done) {
setupPrepaidMode();
sinon.stub(Settings, 'updateUI', function() {
initDataLimitDialog();
dataLimitInput.value = '124.56';
dataLimitInput.dispatchEvent(evtInput);
// Cancel not update the Config values
assert.equal(ConfigManager.option('dataLimitUnit'), 'MB');
assert.equal(ConfigManager.option('dataLimitValue'), '40');
Settings.updateUI.restore();
done();
});
Settings.initialize();
});
test('dataLimitConfigurer OK button behaviour', function(done) {
setupPrepaidMode();
sinon.stub(Settings, 'updateUI', function() {
initDataLimitDialog();
assert.equal(ConfigManager.option('dataLimitUnit'), 'MB');
assert.equal(ConfigManager.option('dataLimitValue'), '40');
// Update the dataLimit
dataLimitInput.value = '124.56';
dataLimitInput.dispatchEvent(evtInput);
assert.equal(dataLimitSwitchUnitButton.getAttribute('data-l10n-id'),
'unit-MB');
assert.equal(limitUnitValue.getAttribute('data-l10n-id'), 'MB');
triggerEvent(dataLimitSwitchUnitButton, 'click');
assert.equal(dataLimitSwitchUnitButton.getAttribute('data-l10n-id'),
'unit-GB');
assert.equal(limitUnitValue.getAttribute('data-l10n-id'), 'GB');
sinon.stub(SimManager, 'requestDataSimIcc', function() {});
triggerEvent(dataLimitOkButton, 'click');
assert.equal(ConfigManager.option('dataLimitUnit'), 'GB');
assert.equal(ConfigManager.option('dataLimitValue'), '124.56');
SimManager.requestDataSimIcc.restore();
Settings.updateUI.restore();
done();
});
Settings.initialize();
});
});
});