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

160 lines
5.1 KiB
JavaScript
Executable file

'use strict';
/* global ActionMenu, SystemDialog, MockL10n */
require('/shared/test/unit/load_body_html_helper.js');
requireApp('system/js/base_ui.js');
requireApp('system/js/system_dialog.js');
requireApp('system/js/action_menu.js');
require('/shared/test/unit/mocks/mock_l10n.js');
require('/shared/js/event_safety.js');
require('/shared/js/component_utils.js');
require('/shared/elements/gaia_checkbox/script.js');
suite('ActionMenu', function() {
var rafStub, realL10n, stubById, actionMenu, systemHideStub,
controller, renderStub, publishStub, systemShowStub;
function getListItems(number) {
var items = [];
for (var i = 0; i < number; i++) {
items.push({
label: 'label' + i,
icon: null,
manifest: null,
value: i
});
}
return items;
}
setup(function() {
realL10n = navigator.mozL10n;
navigator.mozL10n = MockL10n;
rafStub = this.sinon.stub(window, 'requestAnimationFrame',
function(callback) { callback(); });
stubById = this.sinon.stub(document, 'getElementById');
stubById.returns(document.createElement('div'));
ActionMenu.prototype.containerElement =
document.createElement('div');
renderStub = this.sinon.stub(ActionMenu.prototype, 'render');
publishStub = this.sinon.stub(ActionMenu.prototype, 'publish');
systemShowStub = this.sinon.stub(SystemDialog.prototype, 'show');
systemHideStub = this.sinon.stub(SystemDialog.prototype, 'hide');
controller = {
successCb: this.sinon.stub(),
cancelCb: this.sinon.stub()
};
actionMenu = new ActionMenu(controller);
actionMenu.element = document.createElement('div');
actionMenu._fetchElements();
});
teardown(function() {
navigator.mozL10n = realL10n;
});
suite('Instantation > ', function() {
test('renders the view and publish created', function() {
assert.isTrue(renderStub.called);
assert.isTrue(publishStub.calledWith('created'));
});
});
suite('Show > ', function() {
setup(function() {
actionMenu.element = document.createElement('div');
actionMenu._fetchElements();
});
test('Calls to parent .show method', function() {
actionMenu.show([]);
assert.isTrue(systemShowStub.called);
assert.isTrue(actionMenu.form.classList.contains('visible'));
});
test('Renders the list of items and the cancel button', function() {
var numberActions = 2;
actionMenu.show(getListItems(numberActions));
var menu = actionMenu.menu;
var buttons = menu.getElementsByTagName('button');
assert.isTrue(buttons.length === (numberActions + 1));
assert.ok(buttons[numberActions].dataset.action === 'cancel');
});
test('Renders the default option', function() {
actionMenu.show(getListItems(1), 'title', true);
var input = actionMenu.menu.getElementsByTagName('input');
assert.ok(input);
});
test('Sets the title', function() {
var title = 'title';
actionMenu.show(getListItems(1), title);
assert.isTrue(actionMenu.header.dataset.l10nId === title);
});
});
suite('Hide > ', function() {
setup(function() {
actionMenu.active = true;
});
test('Should force position:fixed during the transition', function() {
actionMenu.hide();
assert.equal(actionMenu.form.style.position, 'fixed');
var evt = new CustomEvent('transitionend');
actionMenu.form.dispatchEvent(evt);
assert.equal(actionMenu.form.style.position, '');
});
test('Calls to parent .hide method after transition', function() {
actionMenu.hide();
var evt = new CustomEvent('transitionend');
actionMenu.form.dispatchEvent(evt);
assert.isTrue(systemHideStub.called);
assert.isFalse(actionMenu.form.classList.contains('visible'));
});
test('Does nothing if not active', function() {
actionMenu.active = false;
actionMenu.hide();
var evt = new CustomEvent('transitionend');
actionMenu.form.dispatchEvent(evt);
assert.isFalse(systemHideStub.called);
});
});
suite('Events > ', function() {
test('calls to successCb on item click', function() {
actionMenu.show(getListItems(2));
var selected = 1;
var items = actionMenu.menu.getElementsByTagName('button');
items[selected].click();
assert.isTrue(controller.successCb.calledWith(selected, false));
});
test('calls to cancelCb on cancel click', function() {
actionMenu.show(getListItems(2));
var selected = 2;
var items = actionMenu.menu.getElementsByTagName('button');
items[selected].click();
assert.isTrue(controller.cancelCb.called);
});
test('sends the default checkbox value', function() {
actionMenu.show(getListItems(2), '', true);
var selected = 1;
var items = actionMenu.menu.getElementsByTagName('button');
var selector = '[data-action="set-default-action"]';
var defaultInput = actionMenu.menu.querySelector(selector);
defaultInput.checked = true;
items[selected].click();
assert.isTrue(controller.successCb.calledWith(selected, true));
});
});
});