VulpesOS/gaia/apps/ftu/test/unit/wifi_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

657 lines
25 KiB
JavaScript
Executable file

/* global MockL10n, MockMozWifiNetwork, MockNavigatorMozWifiManager,
MockFxAccountsIACHelper, MocksHelper, UIManager, utils,
WifiHelper, WifiManager, WifiUI */
'use strict';
require('/shared/test/unit/mocks/mock_l20n.js');
require('/shared/test/unit/mocks/mock_navigator_moz_settings.js');
require('/shared/test/unit/mocks/mock_navigator_moz_wifi_manager.js');
requireApp('ftu/test/unit/mock_utils.js');
requireApp('ftu/test/unit/mock_moz_wifi_network.js');
requireApp('ftu/test/unit/mock_fx_accounts_iac_helper.js');
requireApp('ftu/js/wifi.js');
requireApp('ftu/js/ui.js');
require('/shared/js/wifi_helper.js');
require('/shared/test/unit/mocks/mock_settings_listener.js');
var mocksHelperForWifi = new MocksHelper([
'utils',
'MozWifiNetwork',
'SettingsListener'
]).init();
suite('wifi > ', function() {
var realL10n,
realMozWifiNetwork,
realMozWifiManager,
realFxAccountsIACHelper;
var fakeNetworks = [
{
ssid: 'Mozilla Guest',
bssid: 'xx:xx:xx:xx:xx:xx',
security: [],
capabilities: [],
relSignalStrength: 98,
connected: false
},
{
ssid: 'Livebox 6752',
bssid: 'xx:xx:xx:xx:xx:xx',
security: ['WEP'],
capabilities: [],
relSignalStrength: 89,
connected: false
},
{
ssid: 'Mozilla-G',
bssid: 'xx:xx:xx:xx:xx:xx',
security: ['WPA-EAP'],
capabilities: [],
relSignalStrength: 67,
connected: false
},
{
ssid: 'Freebox 8953',
bssid: 'xx:xx:xx:xx:xx:xx',
security: ['WPA2-PSK'],
capabilities: [],
relSignalStrength: 32,
connected: false
}
];
mocksHelperForWifi.attachTestHelpers();
suiteSetup(function() {
realL10n = document.l10n;
document.l10n = MockL10n;
realMozWifiNetwork = window.mozWifiNetwork;
window.mozWifiNetwork = MockMozWifiNetwork;
realMozWifiManager = navigator.mozWifiManager;
navigator.mozWifiManager = MockNavigatorMozWifiManager;
realFxAccountsIACHelper = window.FxAccountsIACHelper;
window.FxAccountsIACHelper = MockFxAccountsIACHelper;
loadBodyHTML('/index.html');
});
setup(function() {
WifiManager.init();
});
suiteTeardown(function() {
document.l10n = realL10n;
realL10n = null;
window.mozWifiNetwork = realMozWifiNetwork;
realMozWifiNetwork = null;
navigator.mozWifiManager = realMozWifiManager;
realMozWifiManager = null;
});
suite('Scan networks >', function() {
var clock = sinon.useFakeTimers();
setup(function() {
this.sinon.spy(utils.overlay, 'show');
});
teardown(function() {
clock.restore();
});
test('none available', function(done) {
var noNetworks = [];
MockNavigatorMozWifiManager.setNetworks(noNetworks);
WifiManager.scan(function(networks) {
assert.ok(utils.overlay.show.calledOnce, 'shows loading overlay');
assert.equal(networks.length, noNetworks.length,
'return zero networks');
assert.isDefined(document.getElementById('no-result-container'),
'show no networks message');
done();
});
});
test('some available', function(done) {
MockNavigatorMozWifiManager.setNetworks(fakeNetworks);
WifiManager.scan(function(networks) {
assert.ok(utils.overlay.show.calledOnce, 'shows loading overlay');
assert.isDefined(networks, 'return networks');
assert.isNotNull(networks, 'return valid networks');
assert.equal(networks, fakeNetworks, 'return existing networks');
done();
});
});
test('error while scanning', function(done) {
this.sinon.spy(console, 'error');
this.sinon.stub(MockNavigatorMozWifiManager, 'getNetworks')
.onFirstCall().returns({
set onerror(callback) {
this.error = {
name: 'error'
};
callback();
}
});
WifiManager.scan(function(networks) {
assert.ok(MockNavigatorMozWifiManager.getNetworks.calledOnce);
assert.ok(utils.overlay.show.called, 'shows loading overlay');
assert.equal(networks.length, 0, 'no networks returned');
assert.ok(console.error.calledOnce);
done();
});
});
test('should execute callback when scan fails', function() {
var fakeCallback = this.sinon.spy();
this.sinon.stub(MockNavigatorMozWifiManager, 'getNetworks')
.onFirstCall().returns({
set onerror(callback) {
this.error = {
name: 'error'
};
callback();
}
});
WifiManager.scan(fakeCallback);
assert.isTrue(fakeCallback.calledOnce);
});
test('timeout error', function(done) {
this.sinon.stub(MockNavigatorMozWifiManager, 'getNetworks').returns({});
this.sinon.spy(console, 'warn');
WifiManager.scan(function(networks) {
assert.ok(utils.overlay.show.called, 'shows loading overlay');
assert.isUndefined(networks, 'no networks returned');
assert.ok(console.warn.called);
done();
});
clock.tick(10000);
});
});
suite('Choose a network >', function() {
var network,
networkDOM,
fakeEvent;
setup(function() {
WifiManager.networks = fakeNetworks;
WifiUI.renderNetworks(fakeNetworks);
UIManager.activationScreen =
document.getElementById('activation-screen');
UIManager.mainTitle = document.getElementById('main-title');
UIManager.wifiJoinButton = document.getElementById('wifi-join-button');
UIManager.navBar = document.getElementById('nav-bar');
UIManager.passwordInput = document.getElementById('wifi_password');
network = fakeNetworks[0];
networkDOM = document.querySelector('li[data-ssid="' +
network.ssid + '"]');
fakeEvent = {
target: networkDOM
};
});
teardown(function() {
UIManager.activationScreen = null;
UIManager.mainTitle = null;
UIManager.wifiJoinButton = null;
UIManager.navBar = null;
UIManager.passwordInput = null;
});
test('Open network', function() {
this.sinon.stub(WifiHelper, 'isOpen').returns(true);
this.sinon.stub(WifiUI, 'connect');
WifiUI.chooseNetwork(fakeEvent);
assert.isTrue(WifiUI.connect.called, 'should try to connect directly');
});
test('Protected network', function() {
this.sinon.stub(WifiHelper, 'isOpen').returns(false);
WifiUI.chooseNetwork(fakeEvent);
assert.equal(UIManager.mainTitle.textContent, networkDOM.dataset.ssid,
'should show the network name as title');
assert.isTrue(UIManager.activationScreen.classList.contains('no-options'),
'should hide refresh button');
assert.isTrue(UIManager.navBar.classList.contains('secondary-menu'),
'should change different nav button');
});
test('Join button valid input', function() {
this.sinon.stub(WifiHelper, 'isValidInput').returns(true);
// default value. Must change after input event
UIManager.wifiJoinButton.disabled = true;
UIManager.passwordInput.dispatchEvent(new CustomEvent('input'));
assert.isFalse(UIManager.wifiJoinButton.disabled,
'button should be enabled if the input is valid');
});
test('Join button invalid input', function() {
this.sinon.stub(WifiHelper, 'isValidInput').returns(false);
// button enabled. Must change after input event
UIManager.wifiJoinButton.disabled = false;
UIManager.passwordInput.dispatchEvent(new CustomEvent('input'));
assert.isTrue(UIManager.wifiJoinButton.disabled,
'button should be disabled if the input is not valid');
});
});
suite('Add a hidden network >', function() {
setup(function() {
UIManager.init();
UIManager.activationScreen =
document.getElementById('activation-screen');
UIManager.mainTitle = document.getElementById('main-title');
UIManager.wifiJoinButton = document.getElementById('wifi-join-button');
UIManager.navBar = document.getElementById('nav-bar');
UIManager.hiddenWifiSsid = document.getElementById('hidden-wifi-ssid');
UIManager.hiddenWifiSecurity =
document.getElementById('hidden-wifi-security');
UIManager.hiddenWifiPasswordBox =
document.getElementById('hidden-wifi-password-box');
UIManager.hiddenWifiPassword =
document.getElementById('hidden-wifi-password');
UIManager.hiddenWifiIdentityBox =
document.getElementById('hidden-wifi-identity-box');
UIManager.hiddenWifiIdentity =
document.getElementById('hidden-wifi-identity');
WifiUI.addHiddenNetwork();
});
test('should show authentication screen', function() {
assert.isTrue(UIManager.activationScreen.classList.contains('no-options'),
'should hide refresh button');
assert.equal(UIManager.mainTitle.getAttribute('data-l10n-id'),
'authentication',
'should show correct title');
assert.isTrue(UIManager.navBar.classList.contains('secondary-menu'),
'should change different nav button');
assert.equal(UIManager.hiddenWifiSsid.value, '',
'should clean SSID input');
assert.equal(UIManager.hiddenWifiPassword.value, '',
'should clean Password input');
assert.equal(UIManager.hiddenWifiIdentity.value, '',
'should clean User input');
assert.isTrue(UIManager.wifiJoinButton.disabled,
'should disable Join button by default');
assert.equal(window.location.hash, '#hidden-wifi-authentication',
'should update the hash value');
});
test('add open network', function() {
// Check everything is ok when entering
assert.isTrue(UIManager.wifiJoinButton.disabled,
'button should be disabled by default');
// Choose an Open security and simulate 'change' event
UIManager.hiddenWifiSecurity.options[0].selected = true;
UIManager.hiddenWifiSecurity.dispatchEvent(new CustomEvent('change'));
// Check UI changes for the security chosen
assert.isTrue(UIManager.hiddenWifiPasswordBox.classList
.contains('hidden'),
'should hide all security inputs');
// Prepare the conditions
UIManager.hiddenWifiSsid.value = 'testSSID';
// Simulate event for the check
UIManager.hiddenWifiSsid.dispatchEvent(new CustomEvent('keyup'));
assert.isFalse(UIManager.wifiJoinButton.disabled,
'button is enabled when SSID not empty');
});
test('add protected network WEP', function() {
// Check everything is ok when entering
assert.isTrue(UIManager.wifiJoinButton.disabled,
'button should be disabled by default');
// Choose WEP security and simulate 'change' event
UIManager.hiddenWifiSecurity.options[1].selected = true;
UIManager.hiddenWifiSecurity.dispatchEvent(new CustomEvent('change'));
// Check UI changes for the security chosen
assert.isFalse(UIManager.hiddenWifiPasswordBox.classList
.contains('hidden'),
'should show password input');
assert.isTrue(UIManager.hiddenWifiIdentityBox.classList
.contains('hidden'),
'should hide user input');
UIManager.hiddenWifiSsid.value = 'testSSID';
UIManager.hiddenWifiSsid.dispatchEvent(new CustomEvent('keyup'));
// Not enough with this condition
assert.isTrue(UIManager.wifiJoinButton.disabled,
'button is disabled when SSID not empty');
UIManager.hiddenWifiPassword.value = 'I234'; // 4 ASCII char
UIManager.hiddenWifiPassword.dispatchEvent(new CustomEvent('keyup'));
// Not enough with this condition
assert.isTrue(UIManager.wifiJoinButton.disabled,
'button is disabled when Password is not long enough');
UIManager.hiddenWifiPassword.value = 'I234S'; // 5 ASCII char
UIManager.hiddenWifiPassword.dispatchEvent(new CustomEvent('keyup'));
// All conditions valid
assert.isFalse(UIManager.wifiJoinButton.disabled,
'button is enabled');
UIManager.hiddenWifiPassword.value = 'I234S67B90'; // 10 ASCII char
UIManager.hiddenWifiPassword.dispatchEvent(new CustomEvent('keyup'));
// Not enough with this condition
assert.isTrue(UIManager.wifiJoinButton.disabled,
'button is disabled when not HEX 10 char password');
UIManager.hiddenWifiPassword.value = '123A567b90'; // 10 HEX char
// (0-9 A-F a-f)
UIManager.hiddenWifiPassword.dispatchEvent(new CustomEvent('keyup'));
// All conditions valid
assert.isFalse(UIManager.wifiJoinButton.disabled,
'button is enabled');
UIManager.hiddenWifiPassword.value = '1234567890QW'; // 12 ASCII char
UIManager.hiddenWifiPassword.dispatchEvent(new CustomEvent('keyup'));
// Not enough with this condition
assert.isTrue(UIManager.wifiJoinButton.disabled,
'button is enabled');
UIManager.hiddenWifiPassword.value = '123A567b90QWE'; // 13 ASCII char
UIManager.hiddenWifiPassword.dispatchEvent(new CustomEvent('keyup'));
// All conditions valid
assert.isFalse(UIManager.wifiJoinButton.disabled,
'button is enabled');
UIManager.hiddenWifiPassword.value = '123A567b90QWERTY'; // 16 ASCII char
UIManager.hiddenWifiPassword.dispatchEvent(new CustomEvent('keyup'));
// All conditions valid
assert.isFalse(UIManager.wifiJoinButton.disabled,
'button is enabled');
// 29 ASCII char
UIManager.hiddenWifiPassword.value = '123A567b90QWERTYUIOPASDFGHJKL';
UIManager.hiddenWifiPassword.dispatchEvent(new CustomEvent('keyup'));
// All conditions valid
assert.isFalse(UIManager.wifiJoinButton.disabled,
'button is enabled');
// 32 ASCII char
UIManager.hiddenWifiPassword.value = '123A567b90QWERTYUIOPASDFGHJKLZXC';
UIManager.hiddenWifiPassword.dispatchEvent(new CustomEvent('keyup'));
// Not enough with this condition
assert.isTrue(UIManager.wifiJoinButton.disabled,
'button is disabled with 32 not HEX chars');
// 32 HEX char
UIManager.hiddenWifiPassword.value = '123A567b90ABCDEFabcdef1234567890';
UIManager.hiddenWifiPassword.dispatchEvent(new CustomEvent('keyup'));
// All conditions valid
assert.isFalse(UIManager.wifiJoinButton.disabled,
'button is enabled');
// 58 ASCII char
UIManager.hiddenWifiPassword.value = '123A567b90' +
'QWERTYUIOPASDFGHJKLZXCVBNM' +
'qwertyuiopasdfghjkl';
UIManager.hiddenWifiPassword.dispatchEvent(new CustomEvent('keyup'));
// Not enough with this condition
assert.isTrue(UIManager.wifiJoinButton.disabled,
'button is disabled with 58 not HEX chars');
// 58 HEX char
UIManager.hiddenWifiPassword.value = '123A567b90ABCDEFabcdef1234567890' +
'1234567890ABCDEFabcdef1234';
UIManager.hiddenWifiPassword.dispatchEvent(new CustomEvent('keyup'));
// All conditions valid
assert.isFalse(UIManager.wifiJoinButton.disabled,
'button is enabled');
// 59 HEX char
UIManager.hiddenWifiPassword.value = '123A567b90ABCDEFabcdef1234567890' +
'1234567890ABCDEFabcdef12345';
UIManager.hiddenWifiPassword.dispatchEvent(new CustomEvent('keyup'));
// Not enough with this condition
assert.isTrue(UIManager.wifiJoinButton.disabled,
'button is disabled for more than 58 characters');
});
test('add protected network WPA-PSK', function() {
// Check everything is ok when entering
assert.isTrue(UIManager.wifiJoinButton.disabled,
'button should be disabled by default');
// Choose WPA-PSK security and simulate 'change' event
UIManager.hiddenWifiSecurity.options[2].selected = true;
UIManager.hiddenWifiSecurity.dispatchEvent(new CustomEvent('change'));
// Check UI changes for the security chosen
assert.isFalse(UIManager.hiddenWifiPasswordBox.classList
.contains('hidden'),
'should show password input');
assert.isTrue(UIManager.hiddenWifiIdentityBox.classList
.contains('hidden'),
'should hide user input');
UIManager.hiddenWifiSsid.value = 'testSSID';
UIManager.hiddenWifiSsid.dispatchEvent(new CustomEvent('keyup'));
// Not enough
assert.isTrue(UIManager.wifiJoinButton.disabled,
'button is enabled when SSID not empty');
UIManager.hiddenWifiPassword.value = 'QW3rtY7'; // 7 char password
UIManager.hiddenWifiPassword.dispatchEvent(new CustomEvent('keyup'));
// Not enough with this condition
assert.isTrue(UIManager.wifiJoinButton.disabled,
'button is disabled when Password is not long enough');
UIManager.hiddenWifiPassword.value = 'QW3rtY78'; // 8 char password
UIManager.hiddenWifiPassword.dispatchEvent(new CustomEvent('keyup'));
// Not enough with this condition
assert.isFalse(UIManager.wifiJoinButton.disabled,
'button is enabled when Password is at least 8 char long');
UIManager.hiddenWifiPassword.value = 'QW3rtY789'; // 8 char password
UIManager.hiddenWifiPassword.dispatchEvent(new CustomEvent('keyup'));
// Not enough with this condition
assert.isFalse(UIManager.wifiJoinButton.disabled,
'button is enabled when Password is longer than 8 char');
});
test('add protected network WPA-EAP', function() {
// Check everything is ok when entering
assert.isTrue(UIManager.wifiJoinButton.disabled,
'button should be disabled by default');
// Choose an Open security and simulate 'change' event
UIManager.hiddenWifiSecurity.options[3].selected = true;
UIManager.hiddenWifiSecurity.dispatchEvent(new CustomEvent('change'));
// Check UI changes for the security chosen
assert.isFalse(UIManager.hiddenWifiPasswordBox.classList
.contains('hidden'),
'should show password input');
assert.isFalse(UIManager.hiddenWifiIdentityBox.classList
.contains('hidden'),
'should show user input');
UIManager.hiddenWifiSsid.value = 'testSSID'; // any SSID
UIManager.hiddenWifiSsid.dispatchEvent(new CustomEvent('keyup'));
// Not enough
assert.isTrue(UIManager.wifiJoinButton.disabled,
'button is enabled when SSID not empty');
UIManager.hiddenWifiPassword.value = 'QW3rtY'; // any password
UIManager.hiddenWifiPassword.dispatchEvent(new CustomEvent('keyup'));
// Not enough with ssid and password filled
assert.isTrue(UIManager.wifiJoinButton.disabled,
'button is disabled when Identity not filled');
UIManager.hiddenWifiIdentity.value = 'user'; // any user
UIManager.hiddenWifiIdentity.dispatchEvent(new CustomEvent('keyup'));
// SSID + User + Password
assert.isFalse(UIManager.wifiJoinButton.disabled,
'button is enabled when all conditions ok');
});
});
suite('Join a network >', function() {
var testSSID,
testUser,
testPassword;
setup(function() {
testSSID = 'Mozilla-G';
testUser = 'testUser';
testPassword = 'testPassword';
this.sinon.stub(window.history, 'back');
this.sinon.stub(WifiManager, 'connect');
WifiUI.renderNetworks(fakeNetworks);
UIManager.hiddenWifiSsid =
document.getElementById('hidden-wifi-ssid');
UIManager.hiddenWifiIdentity =
document.getElementById('hidden-wifi-identity');
UIManager.hiddenWifiPassword =
document.getElementById('hidden-wifi-password');
UIManager.hiddenWifiSecurity =
document.getElementById('hidden-wifi-security');
});
teardown(function() {
// document.body.innerHTML = '';
UIManager.hiddenWifiSsid = null;
UIManager.hiddenWifiIdentity = null;
UIManager.hiddenWifiPassword = null;
UIManager.hiddenWifiSecurity = null;
});
test('from the list of detected networks', function() {
document.getElementById('wifi_ssid').value = testSSID;
document.getElementById('wifi_user').value = testUser;
document.getElementById('wifi_password').value = testPassword;
WifiUI.joinNetwork();
assert.isTrue(WifiManager.connect.calledWith(testSSID,
testPassword,
testUser),
'should try to connect with correct values');
assert.isTrue(window.history.back.called,
'UI should go back to the list');
});
test('that is hidden', function() {
UIManager.hiddenWifiSsid.value = testSSID;
UIManager.hiddenWifiIdentity.value = testUser;
UIManager.hiddenWifiPassword.value = testPassword;
UIManager.hiddenWifiSecurity.options[2].selected = true;
var oldNetworks = WifiManager.networks.length;
WifiUI.joinHiddenNetwork();
var currentNetworks = WifiManager.networks.length;
assert.isTrue(currentNetworks > oldNetworks,
'a new network is added to the list');
var hiddenNetwork = document.getElementById(testSSID);
assert.isNotNull(hiddenNetwork, 'hidden network should be rendered');
assert.isTrue(WifiManager.connect.calledWith(testSSID,
testPassword,
testUser),
'should try to connect with correct values');
assert.isTrue(window.history.back.called,
'UI should go back to the list');
});
suite('Update UI', function() {
var realWifiManagerOnScan;
setup(function() {
WifiUI.renderNetworks(fakeNetworks);
realWifiManagerOnScan = WifiManager.onScan;
WifiManager.onScan = null;
});
teardown(function() {
WifiManager.onScan = realWifiManagerOnScan;
});
test('Should update the previous connected network', function() {
var previousNetwork = fakeNetworks[0];
var currentNetwork = fakeNetworks[1];
var previousNetworkElement =
document.querySelector('li[data-ssid="' +
previousNetwork.ssid + '"]');
var previousNetworkSecurity =
previousNetworkElement.querySelector('p[data-security-level]');
var currentNetworkElement =
document.querySelector('li[data-ssid="' +
currentNetwork.ssid + '"]');
var currentNetworkSecurity =
currentNetworkElement.querySelector('p[data-security-level]');
WifiManager.api.onstatuschange({status: 'connected',
network: previousNetwork});
assert.isTrue(previousNetworkElement.classList.contains('connected'));
assert.equal(previousNetworkSecurity.dataset.l10nId,
'shortStatus-connected');
WifiManager.api.onstatuschange({status: 'disconnected',
network: previousNetwork});
// bug 1179703
WifiManager.api.onstatuschange({status: 'connecting',
network: previousNetwork});
WifiManager.api.onstatuschange({status: 'connected',
network: currentNetwork});
assert.isFalse(previousNetworkElement.classList.contains('connected'));
assert.isTrue(currentNetworkElement.classList.contains('connected'));
assert.equal(previousNetworkSecurity.dataset.l10nId,
'securityOpen');
assert.equal(currentNetworkSecurity.dataset.l10nId,
'shortStatus-connected');
});
test('Should move the current connected network to the top', function() {
var currentNetwork = fakeNetworks[2];
var currentNetworkElement =
document.querySelector('li[data-ssid="' +
currentNetwork.ssid + '"]');
var networksList = document.getElementById('networks-list');
WifiManager.api.onstatuschange({status: 'connected',
network: currentNetwork});
var firstChild = networksList.children[0];
assert.equal(currentNetworkElement, firstChild);
});
});
});
});