blob: 198bf15fc7316027be27630e82cf8b2a3f17dc5b [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/** @fileoverview Suite of tests for settings-toggle-button. */
cr.define('settings_toggle_button', () => {
suite('SettingsToggleButton', () => {
/**
* Toggle button created before each test.
* @type {SettingsCheckbox}
*/
let testElement;
// Initialize a checked control before each test.
setup(() => {
/**
* Pref value used in tests, should reflect the 'checked' attribute.
* Create a new pref for each test() to prevent order (state)
* dependencies between tests.
* @type {chrome.settingsPrivate.PrefObject}
*/
const pref = {
key: 'test',
type: chrome.settingsPrivate.PrefType.BOOLEAN,
value: true
};
PolymerTest.clearBody();
testElement = document.createElement('settings-toggle-button');
testElement.set('pref', pref);
document.body.appendChild(testElement);
});
test('value changes on tap', () => {
assertTrue(testElement.checked);
assertTrue(testElement.pref.value);
MockInteractions.tap(testElement);
assertFalse(testElement.checked);
assertFalse(testElement.pref.value);
MockInteractions.tap(testElement);
assertTrue(testElement.checked);
assertTrue(testElement.pref.value);
});
test('fires a change event', (done) => {
testElement.addEventListener('change', () => {
assertFalse(testElement.checked);
done();
});
assertTrue(testElement.checked);
MockInteractions.tap(testElement);
});
test('fires a change event for label', (done) => {
testElement.addEventListener('change', () => {
assertFalse(testElement.checked);
done();
});
assertTrue(testElement.checked);
MockInteractions.tap(testElement.$.labelWrapper);
});
test('fires a change event for toggle', (done) => {
testElement.addEventListener('change', () => {
assertFalse(testElement.checked);
done();
});
assertTrue(testElement.checked);
MockInteractions.tap(testElement.$.control);
});
test('fires a single change event per tap', () => {
counter = 0;
testElement.addEventListener('change', () => {
++counter;
});
MockInteractions.tap(testElement);
assertEquals(1, counter);
MockInteractions.tap(testElement.$.labelWrapper);
assertEquals(2, counter);
MockInteractions.tap(testElement.$.control);
assertEquals(3, counter);
});
test('does not change when disabled', () => {
testElement.checked = false;
testElement.setAttribute('disabled', '');
assertTrue(testElement.disabled);
assertTrue(testElement.$.control.disabled);
MockInteractions.tap(testElement);
assertFalse(testElement.checked);
assertFalse(testElement.$.control.checked);
});
test('inverted', () => {
testElement.inverted = true;
testElement.set('pref', {
key: 'test',
type: chrome.settingsPrivate.PrefType.BOOLEAN,
value: true
});
assertTrue(testElement.pref.value);
assertFalse(testElement.checked);
MockInteractions.tap(testElement);
assertFalse(testElement.pref.value);
assertTrue(testElement.checked);
MockInteractions.tap(testElement);
assertTrue(testElement.pref.value);
assertFalse(testElement.checked);
});
test('numerical pref', () => {
const prefNum = {
key: 'test',
type: chrome.settingsPrivate.PrefType.NUMBER,
value: 1
};
testElement.set('pref', prefNum);
assertTrue(testElement.checked);
MockInteractions.tap(testElement);
assertFalse(testElement.checked);
assertEquals(0, prefNum.value);
MockInteractions.tap(testElement);
assertTrue(testElement.checked);
assertEquals(1, prefNum.value);
});
test('numerical pref with custom values', () => {
const prefNum = {
key: 'test',
type: chrome.settingsPrivate.PrefType.NUMBER,
value: 5
};
testElement.numericUncheckedValue = 5;
testElement.set('pref', prefNum);
assertFalse(testElement.checked);
MockInteractions.tap(testElement);
assertTrue(testElement.checked);
assertEquals(1, prefNum.value);
MockInteractions.tap(testElement);
assertFalse(testElement.checked);
assertEquals(5, prefNum.value);
});
test('numerical pref with unknown initial value', () => {
const prefNum = {
key: 'test',
type: chrome.settingsPrivate.PrefType.NUMBER,
value: 3
};
testElement.numericUncheckedValue = 5;
testElement.set('pref', prefNum);
// Unknown value should still count as checked.
assertTrue(testElement.checked);
// The control should not clobber an existing unknown value.
assertEquals(3, prefNum.value);
// Unchecking should still send the unchecked value to prefs.
MockInteractions.tap(testElement);
assertFalse(testElement.checked);
assertEquals(5, prefNum.value);
// Checking should still send the normal checked value to prefs.
MockInteractions.tap(testElement);
assertTrue(testElement.checked);
assertEquals(1, prefNum.value);
});
test('shows controlled indicator when pref is controlled', () => {
assertFalse(!!testElement.$$('cr-policy-pref-indicator'));
const pref = {
key: 'test',
type: chrome.settingsPrivate.PrefType.NUMBER,
value: 3,
enforcement: chrome.settingsPrivate.Enforcement.ENFORCED,
controlledBy: chrome.settingsPrivate.ControlledBy.EXTENSION
};
testElement.set('pref', pref);
Polymer.dom.flush();
assertTrue(!!testElement.$$('cr-policy-pref-indicator'));
});
test('no indicator with no-extension-indicator flag', () => {
assertFalse(!!testElement.$$('cr-policy-pref-indicator'));
testElement.noExtensionIndicator = true;
const pref = {
key: 'test',
type: chrome.settingsPrivate.PrefType.NUMBER,
value: 3,
enforcement: chrome.settingsPrivate.Enforcement.ENFORCED,
controlledBy: chrome.settingsPrivate.ControlledBy.EXTENSION
};
testElement.set('pref', pref);
Polymer.dom.flush();
assertFalse(!!testElement.$$('cr-policy-pref-indicator'));
});
});
});