custom-select
Version:
A lightweight JavaScript library for custom HTML <select> creation and managing. No dependencies needed.
120 lines (101 loc) • 3.71 kB
JavaScript
import test from 'tape';
import customSelect from './../';
let actual;
let expected;
document.body.innerHTML = '';
const select = document.createElement('select');
select.innerHTML = `
<option value="">Select...</option>
<optgroup label="Moto">
<option value="suzuki">Suzuki</option>
</optgroup>
<optgroup label="Auto">
<option value="mercedes">Mercedes</option>
<option value="audi">Audi</option>
</optgroup>`;
document.body.appendChild(select);
const customselect = customSelect('select')[0];
// Change the select value to the one of the option that'll be removed
select.value = 'audi';
test('Remove an option', assert => {
var target = select.children[2].children[1]; // Audi option
const removed = customselect.remove(target);
assert.test('... and the returned option is the same', q => {
actual = removed;
expected = target;
q.deepEqual(actual, expected,
'the two elements should be the same');
q.end();
});
assert.test('... and the option is not in the select anymore', q => {
actual = Array.prototype.indexOf.call(select.options, removed);
expected = -1;
q.deepEqual(actual, expected,
'should be -1');
q.end();
});
assert.test('... and the custom option is not in the panel anymore', q => {
actual = customselect.panel.querySelectorAll(`[data-value="${removed.getAttribute('value')}"]`);
expected = 0;
q.deepEqual(actual.length, expected,
'should be 0');
q.end();
});
assert.test('... and the custom options are one less', q => {
actual = customselect.panel.getElementsByClassName(customselect.pluginOptions.optionClass);
expected = 3;
q.deepEqual(actual.length, expected,
'should be 3');
q.end();
});
assert.test('... and the value is that of the first option', q => {
actual = customselect.panel.getElementsByClassName(customselect.pluginOptions.optionClass);
expected = '';
q.equal(customselect.value, expected,
'should be ""');
q.end();
});
});
test('Remove an option group', assert => {
var targetGroup = select.children[2]; // Auto option group
const removedGroup = customselect.remove(targetGroup);
assert.test('... and the returned option group is the same', q => {
actual = removedGroup;
expected = targetGroup;
q.deepEqual(actual, expected,
'the two elements should be the same');
q.end();
});
assert.test('... and the option group is not in the select anymore', q => {
actual = Array.prototype.indexOf.call(select.getElementsByTagName('optgroup'),
removedGroup.customSelectOriginalOptgroup);
expected = -1;
q.deepEqual(actual, expected,
'should be -1');
q.end();
});
assert.test('... and the custom option group is not in the panel anymore', q => {
actual = Array.prototype.indexOf.call(select.getElementsByTagName(customselect.pluginOptions.optgroupClass),
removedGroup.customSelectOriginalOptgroup);
expected = -1;
q.deepEqual(actual, expected,
'should be -1');
q.end();
});
});
test('Remove: Use a string as the parameter', assert => {
assert.throws(() => { select.parentNode.customSelect.remove('a string'); }, TypeError,
'should throw TypeError');
assert.end();
});
test('Remove: Use an invalid HTMLElement parameter', assert => {
const option = document.createElement('option');
assert.throws(() => { select.parentNode.customSelect.remove(option); }, TypeError,
'should throw TypeError');
assert.end();
});
test('Remove: Use undefined as parameter', assert => {
assert.throws(() => { select.parentNode.customSelect.remove(undefined); }, TypeError,
'should throw TypeError');
assert.end();
});