'use strict';
jasmine.getFixtures().fixturesPath = 'base/test/fixtures';
/**
* Function which will fill select tag with options
* @param id
* @param count
*/
var fillOptions = function (id, count) {
var $elem = (id instanceof jQuery ? id : $(id));
for (var i = 0; i < count; i++) {
$elem.append($(""));
}
};
/**
* Function which will return array filled with random integers in specified range without duplications.
* @param length
* @param start
* @param end
* @param [toString] defines if the numbers should be converted to string
* @returns {Array}
*/
var createRandomArray = function (length, start, end, toString) {
var arr = [];
while (arr.length < length) {
var randomNumber = Math.floor(Math.random() * (end - start + 1)) + start;
var found = false;
for (var i = 0; i < arr.length; i++) {
if (arr[i] == randomNumber) {
found = true;
break;
}
}
if (!found)arr[arr.length] = (toString ? randomNumber + '' : randomNumber);
}
return arr;
};
describe("Single Picker - ", function () {
beforeEach(function () {
loadFixtures("single.fixture.html");
});
it("Standard init", function () {
var $select = $("#test");
fillOptions($select, 5);
var $container = $(".container");
$select.picker({texts: { trigger : "aaa", noResult : "bbb", search : "ccc" }});
expect($select).toBeHidden();
expect($container).toContainElement("div.picker");
expect($container).toContainElement("span.pc-select");
expect($container).toContainElement("span.pc-list");
expect($container).toContainElement("span.pc-element.pc-trigger");
expect($container.find(".picker > .pc-select > .pc-list > ul > li")).toHaveLength(5);
expect($container.find(".pc-element")).toContainText($select.find('option:eq(0)').text());
});
it("No options init", function () {
var $select = $("#test");
var $container = $(".container");
$select.picker();
expect($select).toBeVisible();
expect($container).not.toContainElement("div.picker");
});
it("Big number of choices init", function () {
var $select = $("#test");
fillOptions($select, 1000);
var $container = $(".container");
$select.picker();
expect($select).toBeHidden();
expect($container).toContainElement("div.picker");
expect($container.find(".picker > .pc-select > .pc-list > ul > li")).toHaveLength(1000);
});
it("List building", function () {
var $select = $("#test");
fillOptions($select, 5);
var $container = $(".container");
$select.picker();
var $options = $container.find(".picker > .pc-select > .pc-list > ul > li");
expect($options).toHaveLength(5);
$options.each(function () {
var selectOptionText = $select.find("option[value='" + $(this).data('id') +"']").text();
expect($(this)).toContainText(selectOptionText);
});
});
//it("List opening/closing", function () {
// var $select = $("#test");
// fillOptions($select, 5);
// var $container = $(".container");
// $select.picker();
//
// expect($container.find(".pc-list")).toBeHidden();
// $container.find(".pc-trigger").click();
// expect($container.find(".pc-list")).toBeVisible();
//});
it("Select option", function () {
var $select = $("#test");
fillOptions($select, 5);
var $container = $(".container");
$select.picker();
var $options = $container.find(".picker > .pc-select > .pc-list > ul > li");
$options.each(function () {
$(this).click();
expect($container.find(".pc-element")).toContainText($(this).text());
expect($select.find("option[value='" + $(this).data('id') +"']")).toHaveAttr("selected");
});
});
it("Hidden attribute", function () {
var $select = $("#test");
$select.append($(""));
fillOptions($select, 5);
var $container = $(".container");
$select.picker();
expect($container.find(".picker > .pc-select > .pc-list > ul > li")).toHaveLength(5);
expect($container).not.toContainElement(".pc-list li:contains('Placeholder')");
});
});
describe("Multi-selection Picker - ", function () {
beforeEach(function () {
loadFixtures("multiple.fixture.html");
});
it("Init", function () {
var $select = $("#test");
fillOptions($select, 5);
var $container = $(".container");
$select.picker({
texts: {
trigger: "Random"
}
});
expect($select).toBeHidden();
expect($container).toContainElement("div.picker");
expect($container).toContainElement("span.pc-select");
expect($container).toContainElement("span.pc-list");
expect($container).toContainElement("span.pc-element.pc-trigger");
expect($container.find(".picker > .pc-select > .pc-list > ul > li")).toHaveLength(5);
expect($container.find(".pc-trigger")).toHaveText($select.find('option:eq(0)').text());
});
it("Auto init", function () {
var $select = $("#test");
$select.attr("multiple", "multiple");
fillOptions($select, 5);
var $container = $(".container");
$select.picker();
$container.find(".pc-list li").first().click();
expect($container).toContainElement(".pc-element:not(.pc-trigger)");
});
it("Select one value", function () {
var $select = $("#test");
fillOptions($select, 5);
var $container = $(".container");
$select.picker();
var $option = $container.find(".picker > .pc-select > .pc-list > ul > li").first();
$option.click();
expect($select.find("option[value='" + $option.data('id') +"']")).toHaveAttr("selected");
expect($option[0]).not.toBeInDOM();
expect($container.find(".picker li[data-id='" + $option.data('id') +"']")).not.toExist();
var $selectedOption = $container.find(".pc-element[data-id='" + $option.data('id') + "']");
expect($selectedOption[0]).toExist();
$selectedOption.find('.pc-close').click();
expect($container.find(".pc-element[data-id='" + $option.data('id') + "']")).not.toExist();
expect($select.find("option[value='" + $option.data('id') +"']")).not.toHaveAttr("selected");
expect($container.find(".picker li[data-id='" + $option.data('id') +"']")).toExist();
});
it("Selecting all values", function () {
var $select = $("#test");
fillOptions($select, 5);
var $container = $(".container");
$select.picker();
var $options = $container.find(".picker > .pc-select > .pc-list > ul > li");
$options.each(function () {
var $this = $(this);
$this.click();
expect($select.find("option[value='" + $this.data('id') +"']")).toHaveAttr("selected");
expect(this).not.toBeInDOM();
expect($container.find(".picker li[data-id='" + $this.data('id') +"']")).not.toExist();
});
expect($container.find(".pc-trigger")).toBeHidden();
var $option = $container.find(".pc-element:not(.pc-trigger)").first();
$option.find('.pc-close').click();
expect($container.find(".pc-element[data-id='" + $option.data('id') + "']")).not.toExist();
expect($select.find("option[value='" + $option.data('id') +"']")).not.toHaveAttr("selected");
expect($container.find(".picker li[data-id='" + $option.data('id') +"']")).toExist();
expect($container.find(".pc-trigger")).toBeVisible();
$container.find(".pc-element:not(.pc-trigger)").each(function () {
var $this = $(this);
$this.find('.pc-close').click();
expect($container.find(".pc-element[data-id='" + $this.data('id') + "']")).not.toExist();
expect($select.find("option[value='" + $this.data('id') +"']")).not.toHaveAttr("selected");
expect($container.find(".picker li[data-id='" + $this.data('id') +"']")).toExist();
});
});
it("Respecting original order of options", function () {
var testLength = 100;
var $select = $("#test");
fillOptions($select, testLength);
var $container = $(".container");
$select.picker();
//////////////////////////////
// Helpers
var shuffleArray = function(o){
for(var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
return o;
};
var checkOrder = function () {
var options = $container.find(".pc-list li");
if(options.length == 1) {
return
}
var currentVal, previousVal, nextVal;
for(var i = 1; i < options.length - 1; i++) {
currentVal = parseInt($(options[i]).data("id"));
if(i == (options.length - 1) && currentVal < parseInt($(options[i-1]).data("id"))) {
fail("Order is not matching!");
return;
}
previousVal = parseInt($(options[i-1]).data("id"));
nextVal = parseInt($(options[i+1]).data("id"));
if(currentVal < previousVal || currentVal > nextVal) {
fail("Order is not matching!");
}
}
};
//////////////////////////////
var selectArray = shuffleArray(Array.apply(null, {length: testLength}).map(Number.call, Number));
for(var i = 0; i < testLength; i++) {
$container.find(".pc-list li[data-id='" + selectArray[i] + "']").click();
}
expect($container.find(".pc-trigger")).toBeHidden();
var returnArray = shuffleArray(selectArray);
for(i = 0; i < testLength; i++) {
$container.find(".pc-element[data-id='" + returnArray[i] + "'] .pc-close").click();
checkOrder();
}
});
it("Data loading", function () {
var $select = $("#test");
fillOptions($select, 50);
var $container = $(".container");
var selectedOptions = createRandomArray(20, 0, 49);
selectedOptions.forEach(function (elem) {
$container.find("option[value='" + elem + "']").attr("selected", "selected");
});
$select.picker();
selectedOptions.forEach(function (elem) {
expect($container).toContainElement(".pc-element[data-id='" + elem + "']");
});
});
it("Limited options", function () {
var $select = $("#test");
fillOptions($select, 50);
var $container = $(".container");
$select.picker({limit: 10});
createRandomArray(10, 0, 49).forEach(function (elem) {
$container.find(".pc-list ul li[data-id='" + elem + "']").click();
});
expect($container.find(".pc-trigger")).toBeHidden();
$container.find(".pc-element:not(.pc-trigger) .pc-close").first().click();
expect($container.find(".pc-trigger")).toBeVisible();
});
});
describe("Picker configuration - ", function () {
beforeEach(function () {
loadFixtures("single.fixture.html");
});
it("container class", function () {
var $select = $("#test");
fillOptions($select, 10);
var $container = $(".container");
$select.picker({containerClass: "testClass"});
expect($container).toContainElement(".testClass.picker");
});
it("container width", function () {
var $select = $("#test");
fillOptions($select, 10);
var $container = $(".container");
$select.picker({containerWidth: 100});
expect($container.find(".picker").width()).toEqual(100);
expect($container.find(".picker")).toHaveAttr("style");
});
it("list width", function () {
var $select = $("#test");
fillOptions($select, 10);
var $container = $(".container");
$select.picker({width: 100});
expect($container.find(".picker .pc-list").attr("style")).toMatch("width:100px;");
});
it("texts", function () {
var $select = $("#test");
fillOptions($select, 10);
var $container = $(".container");
$select.picker({
search: true,
texts: { trigger : "aaa", noResult : "bbb", search : "ccc" }
});
var $input = $container.find(".pc-list input[type='search']");
expect($container.find(".pc-trigger")).toContainText($select.find('option:eq(0)').text());
expect($input.attr("placeholder")).toBe("ccc");
$input.val("asd");
$input.trigger("input");
expect($container.find("li.not-found")).toContainText("bbb");
})
});
describe("Picker API - ", function () {
it("destroy", function () {
loadFixtures("single.fixture.html");
var $select = $("#test");
fillOptions($select, 10);
var $container = $(".container");
$select.picker();
expect($container).toContainElement(".picker");
$select.picker("destroy");
expect($container).not.toContainElement(".picker");
});
it("get (single)", function () {
loadFixtures("single.fixture.html");
var $select = $("#test");
fillOptions($select, 10);
var $container = $(".container");
$select.picker();
var option = $($container.find(".pc-list li")[3]);
option.click();
// Change needs to propagate through the DOM
setTimeout(function(){
expect($select.picker("get")).toBe(option.data("id") + '');
}, 200);
});
it("get (multiple) - one item", function () {
loadFixtures("multiple.fixture.html");
var $select = $("#test");
fillOptions($select, 10);
var $container = $(".container");
$select.picker();
var option = $($container.find(".pc-list li")[3]);
option.click();
expect($select.picker("get")).toEqual([option.data("id") + '']);
});
it("get (multiple) - several items", function () {
loadFixtures("multiple.fixture.html");
var $select = $("#test");
fillOptions($select, 10);
var $container = $(".container");
$select.picker();
var listOptions = $container.find(".pc-list li");
var selectArray = createRandomArray(4, 0, 9);
selectArray.forEach(function(item){
$(listOptions[item]).click();
});
selectArray.sort();
expect($select.picker("get")).toEqual(selectArray.map(function(item){
return item + '';
}));
});
it("set (single)", function () {
loadFixtures("single.fixture.html");
var $select = $("#test");
fillOptions($select, 10);
$select.picker();
$select.picker("set", 4);
// Change needs to propagate through the DOM
setTimeout(function(){
expect($select.picker("get")).toBe('4');
}, 200);
});
it("set (multiple)", function () {
loadFixtures("multiple.fixture.html");
var $select = $("#test");
fillOptions($select, 10);
$select.picker();
$select.picker("set", 2);
$select.picker("set", 4);
$select.picker("set", 6);
expect($select.picker("get")).toEqual(['2', '4', '6']);
});
it("remove - after natural click", function () {
loadFixtures("multiple.fixture.html");
var $select = $("#test");
fillOptions($select, 10);
var $container = $(".container");
$select.picker();
var listOptions = $container.find(".pc-list li");
var selectArray = [2, 4, 7, 8, 9];
selectArray.forEach(function(item){
$(listOptions[item]).click();
});
selectArray.sort();
expect($select.picker("get")).toEqual(selectArray.map(function(item){ return item + ''}));
$select.picker("remove", 8);
expect($select.picker("get")).toEqual(['2', '4', '7', '9']);
});
it("remove - after using 'set'", function () {
loadFixtures("multiple.fixture.html");
var $select = $("#test");
fillOptions($select, 10);
$select.picker();
$select.picker("set", 2);
$select.picker("set", 4);
$select.picker("set", 6);
expect($select.picker("get")).toEqual(['2', '4', '6']);
$select.picker("remove", 6);
expect($select.picker("get")).toEqual(['2', '4']);
});
});
describe("Picker Events - ", function () {
it("sp-change event - single mode", function(){
loadFixtures("single.fixture.html");
var $select = $("#test");
fillOptions($select, 10);
$select.picker();
var spChangeEvent = spyOnEvent('#test', 'sp-change');
var $option = $(".container").find(".picker > .pc-select > .pc-list > ul > li").first();
$option.click();
expect(spChangeEvent).toHaveBeenTriggered();
});
it("sp-change event - multiple mode", function(){
loadFixtures("multiple.fixture.html");
var $select = $("#test");
fillOptions($select, 10);
$select.picker();
var $container = $(".container");
var spChangeEvent = spyOnEvent('#test', 'sp-change');
var $options = $container.find(".picker > .pc-select > .pc-list > ul > li");
// Adding all
$options.each(function () {
$(this).click();
expect(spChangeEvent).toHaveBeenTriggered();
spChangeEvent.reset();
});
// Removing all
$container.find(".pc-element:not(.pc-trigger)").each(function () {
$(this).find('.pc-close').click();
expect(spChangeEvent).toHaveBeenTriggered();
spChangeEvent.reset();
});
});
it("sp-change event - API set/remove", function(){
loadFixtures("multiple.fixture.html");
var $select = $("#test");
fillOptions($select, 10);
$select.picker();
var spChangeEvent = spyOnEvent('#test', 'sp-change');
$select.picker('set', 1);
expect(spChangeEvent).toHaveBeenTriggered();
spChangeEvent.reset();
$select.picker('remove', 1);
expect(spChangeEvent).toHaveBeenTriggered();
});
it("sp-open/sp-close event", function(){
loadFixtures("single.fixture.html");
var $select = $("#test");
fillOptions($select, 10);
$select.picker();
var spOpenEvent = spyOnEvent('#test', 'sp-open');
var spCloseEvent = spyOnEvent('#test', 'sp-close');
var $trigger = $('.container .pc-element.pc-trigger');
$trigger.click();
expect(spOpenEvent).toHaveBeenTriggered();
$trigger.click();
expect(spCloseEvent).toHaveBeenTriggered();
});
});