Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
160 lines
5.1 KiB
JavaScript
Executable file
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));
|
|
});
|
|
});
|
|
});
|