/* global QUnit, SelectBox */ 'use strict'; QUnit.module('admin.SelectBox'); QUnit.test('init: no options', function(assert) { const $ = django.jQuery; $('').appendTo('#qunit-fixture'); SelectBox.init('id'); assert.equal(SelectBox.cache.id.length, 0); }); QUnit.test('filter', function(assert) { const $ = django.jQuery; $('').appendTo('#qunit-fixture'); $('').appendTo('#id'); $('').appendTo('#id'); SelectBox.init('id'); assert.equal($('#id option').length, 2); SelectBox.filter('id', "A"); assert.equal($('#id option').length, 1); assert.equal($('#id option').text(), "A"); }); QUnit.test('preserve scroll position', function(assert) { const $ = django.jQuery; const optionsCount = 100; $('').appendTo('#qunit-fixture'); $('').appendTo('#qunit-fixture'); const fromSelectBox = document.getElementById('from_id'); const toSelectBox = document.getElementById('to_id'); for (let i = 0; i < optionsCount; i++) { fromSelectBox.appendChild(new Option()); } SelectBox.init('from_id'); SelectBox.init('to_id'); const selectedOptions = [97, 98, 99]; for (const index of selectedOptions) { fromSelectBox.options[index].selected = true; fromSelectBox.options[index].scrollIntoView(); } assert.equal(fromSelectBox.options.length, optionsCount); SelectBox.move('from_id', 'to_id'); assert.equal(fromSelectBox.options.length, optionsCount - selectedOptions.length); assert.equal(toSelectBox.options.length, selectedOptions.length); assert.notEqual(fromSelectBox.scrollTop, 0); }); QUnit.test('retain optgroups', function(assert) { const $ = django.jQuery; $('').appendTo('#qunit-fixture'); const grp = $('').appendTo('#id'); $('').appendTo(grp); $('').appendTo('#id'); $('').appendTo('#id'); SelectBox.init('id'); SelectBox.redisplay('id'); assert.equal($('#id option').length, 2); assert.equal($('#id optgroup').length, 1); }); QUnit.test('sort optgroups', function(assert) { const $ = django.jQuery; $('').appendTo('#qunit-fixture'); // Add optgroups in non-alphabetical order const grp2 = $('').appendTo('#id'); $('').appendTo(grp2); $('').appendTo(grp2); const grp1 = $('').appendTo('#id'); $('').appendTo(grp1); $('').appendTo(grp1); SelectBox.init('id'); // Verify cache is sorted by group then by item assert.equal(SelectBox.cache.id.length, 4); assert.equal(SelectBox.cache.id[0].group, 'Group A'); assert.equal(SelectBox.cache.id[0].text, 'Item 1'); assert.equal(SelectBox.cache.id[1].group, 'Group A'); assert.equal(SelectBox.cache.id[1].text, 'Item 2'); assert.equal(SelectBox.cache.id[2].group, 'Group B'); assert.equal(SelectBox.cache.id[2].text, 'Item 3'); assert.equal(SelectBox.cache.id[3].group, 'Group B'); assert.equal(SelectBox.cache.id[3].text, 'Item 4'); }); QUnit.test('do not sort when no optgroups', function(assert) { const $ = django.jQuery; $('').appendTo('#qunit-fixture'); // Add options in non-alphabetical order $('').appendTo('#id'); $('').appendTo('#id'); $('').appendTo('#id'); SelectBox.init('id'); // Verify cache preserves original order (not sorted) assert.equal(SelectBox.cache.id.length, 3); assert.equal(SelectBox.cache.id[0].text, 'Zebra'); assert.equal(SelectBox.cache.id[1].text, 'Apple'); assert.equal(SelectBox.cache.id[2].text, 'Banana'); }); QUnit.test('move with optgroups sorts', function(assert) { const $ = django.jQuery; $('').appendTo('#qunit-fixture'); $('').appendTo('#qunit-fixture'); // Add options with optgroups to from_id in non-alphabetical order const grp2 = $('').appendTo('#from_id'); $('').appendTo(grp2); const grp1 = $('').appendTo('#from_id'); $('').appendTo(grp1); SelectBox.init('from_id'); SelectBox.init('to_id'); // Select and move item document.getElementById('from_id').options[0].selected = true; SelectBox.move('from_id', 'to_id'); // Verify to_id cache is sorted (even though we only added one item) assert.equal(SelectBox.cache.to_id.length, 1); assert.equal(SelectBox.cache.to_id[0].group, 'Group B'); assert.equal(SelectBox.cache.to_id[0].text, 'Item 2'); }); QUnit.test('move without optgroups does not sort', function(assert) { const $ = django.jQuery; $('').appendTo('#qunit-fixture'); $('').appendTo('#qunit-fixture'); // Add options without optgroups in non-alphabetical order $('').appendTo('#from_id'); $('').appendTo('#from_id'); SelectBox.init('from_id'); SelectBox.init('to_id'); // Select and move first item (Zebra) document.getElementById('from_id').options[0].selected = true; SelectBox.move('from_id', 'to_id'); // Verify to_id cache preserves order (not sorted) assert.equal(SelectBox.cache.to_id.length, 1); assert.equal(SelectBox.cache.to_id[0].text, 'Zebra'); // Move second item (Apple) document.getElementById('from_id').options[0].selected = true; SelectBox.move('from_id', 'to_id'); // Verify items are in order they were added, not alphabetical assert.equal(SelectBox.cache.to_id.length, 2); assert.equal(SelectBox.cache.to_id[0].text, 'Zebra'); assert.equal(SelectBox.cache.to_id[1].text, 'Apple'); }); QUnit.test('move_all with optgroups sorts', function(assert) { const $ = django.jQuery; $('').appendTo('#qunit-fixture'); $('').appendTo('#qunit-fixture'); // Add options with optgroups in non-alphabetical order const grp2 = $('').appendTo('#from_id'); $('').appendTo(grp2); const grp1 = $('').appendTo('#from_id'); $('').appendTo(grp1); $('').appendTo(grp1); SelectBox.init('from_id'); SelectBox.init('to_id'); // Move all items SelectBox.move_all('from_id', 'to_id'); // Verify to_id cache is sorted by group assert.equal(SelectBox.cache.to_id.length, 3); assert.equal(SelectBox.cache.to_id[0].group, 'Group A'); assert.equal(SelectBox.cache.to_id[0].text, 'Apple'); assert.equal(SelectBox.cache.to_id[1].group, 'Group A'); assert.equal(SelectBox.cache.to_id[1].text, 'Banana'); assert.equal(SelectBox.cache.to_id[2].group, 'Group B'); assert.equal(SelectBox.cache.to_id[2].text, 'Zebra'); }); QUnit.test('move_all without optgroups does not sort', function(assert) { const $ = django.jQuery; $('').appendTo('#qunit-fixture'); $('').appendTo('#qunit-fixture'); // Add options without optgroups in non-alphabetical order $('').appendTo('#from_id'); $('').appendTo('#from_id'); $('').appendTo('#from_id'); SelectBox.init('from_id'); SelectBox.init('to_id'); // Move all items SelectBox.move_all('from_id', 'to_id'); // Verify to_id cache preserves original order (not sorted) assert.equal(SelectBox.cache.to_id.length, 3); assert.equal(SelectBox.cache.to_id[0].text, 'Zebra'); assert.equal(SelectBox.cache.to_id[1].text, 'Apple'); assert.equal(SelectBox.cache.to_id[2].text, 'Banana'); });