]> git.ipfire.org Git - ipfire.org.git/blame - src/scss/bootstrap-4.0.0-alpha.6/js/tests/unit/dropdown.js
Introduce autotools
[ipfire.org.git] / src / scss / bootstrap-4.0.0-alpha.6 / js / tests / unit / dropdown.js
CommitLineData
91e44d91
S
1$(function () {
2 'use strict'
3
4 QUnit.module('dropdowns plugin')
5
6 QUnit.test('should be defined on jquery object', function (assert) {
7 assert.expect(1)
8 assert.ok($(document.body).dropdown, 'dropdown method is defined')
9 })
10
11 QUnit.module('dropdowns', {
12 beforeEach: function () {
13 // Run all tests in noConflict mode -- it's the only way to ensure that the plugin works in noConflict mode
14 $.fn.bootstrapDropdown = $.fn.dropdown.noConflict()
15 },
16 afterEach: function () {
17 $.fn.dropdown = $.fn.bootstrapDropdown
18 delete $.fn.bootstrapDropdown
19 }
20 })
21
22 QUnit.test('should provide no conflict', function (assert) {
23 assert.expect(1)
24 assert.strictEqual($.fn.dropdown, undefined, 'dropdown was set back to undefined (org value)')
25 })
26
27 QUnit.test('should throw explicit error on undefined method', function (assert) {
28 assert.expect(1)
29 var $el = $('<div/>')
30 $el.bootstrapDropdown()
31 try {
32 $el.bootstrapDropdown('noMethod')
33 }
34 catch (err) {
35 assert.strictEqual(err.message, 'No method named "noMethod"')
36 }
37 })
38
39 QUnit.test('should return jquery collection containing the element', function (assert) {
40 assert.expect(2)
41 var $el = $('<div/>')
42 var $dropdown = $el.bootstrapDropdown()
43 assert.ok($dropdown instanceof $, 'returns jquery collection')
44 assert.strictEqual($dropdown[0], $el[0], 'collection contains element')
45 })
46
47 QUnit.test('should not open dropdown if target is disabled via attribute', function (assert) {
48 assert.expect(1)
49 var dropdownHTML = '<ul class="tabs">'
50 + '<li class="dropdown">'
51 + '<button disabled href="#" class="btn dropdown-toggle" data-toggle="dropdown">Dropdown</button>'
52 + '<ul class="dropdown-menu">'
53 + '<li><a href="#">Secondary link</a></li>'
54 + '<li><a href="#">Something else here</a></li>'
55 + '<li class="divider"/>'
56 + '<li><a href="#">Another link</a></li>'
57 + '</ul>'
58 + '</li>'
59 + '</ul>'
60 var $dropdown = $(dropdownHTML).find('[data-toggle="dropdown"]').bootstrapDropdown().trigger('click')
61
62 assert.ok(!$dropdown.parent('.dropdown').hasClass('show'), '"show" class added on click')
63 })
64
65 QUnit.test('should set aria-expanded="true" on target when dropdown menu is shown', function (assert) {
66 assert.expect(1)
67 var dropdownHTML = '<ul class="tabs">'
68 + '<li class="dropdown">'
69 + '<a href="#" class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false">Dropdown</a>'
70 + '<ul class="dropdown-menu">'
71 + '<li><a href="#">Secondary link</a></li>'
72 + '<li><a href="#">Something else here</a></li>'
73 + '<li class="divider"/>'
74 + '<li><a href="#">Another link</a></li>'
75 + '</ul>'
76 + '</li>'
77 + '</ul>'
78 var $dropdown = $(dropdownHTML)
79 .find('[data-toggle="dropdown"]')
80 .bootstrapDropdown()
81 .trigger('click')
82
83 assert.strictEqual($dropdown.attr('aria-expanded'), 'true', 'aria-expanded is set to string "true" on click')
84 })
85
86 QUnit.test('should set aria-expanded="false" on target when dropdown menu is hidden', function (assert) {
87 assert.expect(1)
88 var done = assert.async()
89 var dropdownHTML = '<ul class="tabs">'
90 + '<li class="dropdown">'
91 + '<a href="#" class="dropdown-toggle" aria-expanded="false" data-toggle="dropdown">Dropdown</a>'
92 + '<ul class="dropdown-menu">'
93 + '<li><a href="#">Secondary link</a></li>'
94 + '<li><a href="#">Something else here</a></li>'
95 + '<li class="divider"/>'
96 + '<li><a href="#">Another link</a></li>'
97 + '</ul>'
98 + '</li>'
99 + '</ul>'
100 var $dropdown = $(dropdownHTML)
101 .appendTo('#qunit-fixture')
102 .find('[data-toggle="dropdown"]')
103 .bootstrapDropdown()
104
105 $dropdown
106 .parent('.dropdown')
107 .on('hidden.bs.dropdown', function () {
108 assert.strictEqual($dropdown.attr('aria-expanded'), 'false', 'aria-expanded is set to string "false" on hide')
109 done()
110 })
111
112 $dropdown.trigger('click')
113 $(document.body).trigger('click')
114 })
115
116 QUnit.test('should not open dropdown if target is disabled via class', function (assert) {
117 assert.expect(1)
118 var dropdownHTML = '<ul class="tabs">'
119 + '<li class="dropdown">'
120 + '<button href="#" class="btn dropdown-toggle disabled" data-toggle="dropdown">Dropdown</button>'
121 + '<ul class="dropdown-menu">'
122 + '<li><a href="#">Secondary link</a></li>'
123 + '<li><a href="#">Something else here</a></li>'
124 + '<li class="divider"/>'
125 + '<li><a href="#">Another link</a></li>'
126 + '</ul>'
127 + '</li>'
128 + '</ul>'
129 var $dropdown = $(dropdownHTML).find('[data-toggle="dropdown"]').bootstrapDropdown().trigger('click')
130
131 assert.ok(!$dropdown.parent('.dropdown').hasClass('show'), '"show" class added on click')
132 })
133
134 QUnit.test('should add class show to menu if clicked', function (assert) {
135 assert.expect(1)
136 var dropdownHTML = '<ul class="tabs">'
137 + '<li class="dropdown">'
138 + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
139 + '<ul class="dropdown-menu">'
140 + '<li><a href="#">Secondary link</a></li>'
141 + '<li><a href="#">Something else here</a></li>'
142 + '<li class="divider"/>'
143 + '<li><a href="#">Another link</a></li>'
144 + '</ul>'
145 + '</li>'
146 + '</ul>'
147 var $dropdown = $(dropdownHTML).find('[data-toggle="dropdown"]').bootstrapDropdown().trigger('click')
148
149 assert.ok($dropdown.parent('.dropdown').hasClass('show'), '"show" class added on click')
150 })
151
152 QUnit.test('should test if element has a # before assuming it\'s a selector', function (assert) {
153 assert.expect(1)
154 var dropdownHTML = '<ul class="tabs">'
155 + '<li class="dropdown">'
156 + '<a href="/foo/" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
157 + '<ul class="dropdown-menu">'
158 + '<li><a href="#">Secondary link</a></li>'
159 + '<li><a href="#">Something else here</a></li>'
160 + '<li class="divider"/>'
161 + '<li><a href="#">Another link</a></li>'
162 + '</ul>'
163 + '</li>'
164 + '</ul>'
165 var $dropdown = $(dropdownHTML).find('[data-toggle="dropdown"]').bootstrapDropdown().trigger('click')
166
167 assert.ok($dropdown.parent('.dropdown').hasClass('show'), '"show" class added on click')
168 })
169
170
171 QUnit.test('should remove "show" class if body is clicked', function (assert) {
172 assert.expect(2)
173 var dropdownHTML = '<ul class="tabs">'
174 + '<li class="dropdown">'
175 + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
176 + '<ul class="dropdown-menu">'
177 + '<li><a href="#">Secondary link</a></li>'
178 + '<li><a href="#">Something else here</a></li>'
179 + '<li class="divider"/>'
180 + '<li><a href="#">Another link</a></li>'
181 + '</ul>'
182 + '</li>'
183 + '</ul>'
184 var $dropdown = $(dropdownHTML)
185 .appendTo('#qunit-fixture')
186 .find('[data-toggle="dropdown"]')
187 .bootstrapDropdown()
188 .trigger('click')
189
190 assert.ok($dropdown.parent('.dropdown').hasClass('show'), '"show" class added on click')
191 $(document.body).trigger('click')
192 assert.ok(!$dropdown.parent('.dropdown').hasClass('show'), '"show" class removed')
193 })
194
195 QUnit.test('should remove "show" class if body is focused', function (assert) {
196 assert.expect(2)
197 var dropdownHTML = '<div class="tabs">'
198 + '<div class="dropdown">'
199 + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
200 + '<div class="dropdown-menu">'
201 + '<a class="dropdown-item" href="#">Secondary link</a>'
202 + '<a class="dropdown-item" href="#">Something else here</a>'
203 + '<div class="dropdown-divider"/>'
204 + '<a class="dropdown-item" href="#">Another link</a>'
205 + '</div>'
206 + '</div>'
207 + '</div>'
208 var $dropdown = $(dropdownHTML)
209 .appendTo('#qunit-fixture')
210 .find('[data-toggle="dropdown"]')
211 .bootstrapDropdown()
212 .trigger('click')
213
214 assert.ok($dropdown.parent('.dropdown').hasClass('show'), '"show" class added on click')
215 $(document.body).trigger('focusin')
216 assert.ok(!$dropdown.parent('.dropdown').hasClass('show'), '"show" class removed')
217 })
218
219 QUnit.test('should remove "show" class if body is clicked, with multiple dropdowns', function (assert) {
220 assert.expect(7)
221 var dropdownHTML = '<ul class="nav">'
222 + '<li><a href="#menu1">Menu 1</a></li>'
223 + '<li class="dropdown" id="testmenu">'
224 + '<a class="dropdown-toggle" data-toggle="dropdown" href="#testmenu">Test menu <span class="caret"/></a>'
225 + '<ul class="dropdown-menu">'
226 + '<li><a href="#sub1">Submenu 1</a></li>'
227 + '</ul>'
228 + '</li>'
229 + '</ul>'
230 + '<div class="btn-group">'
231 + '<button class="btn">Actions</button>'
232 + '<button class="btn dropdown-toggle" data-toggle="dropdown"><span class="caret"/></button>'
233 + '<ul class="dropdown-menu">'
234 + '<li><a href="#">Action 1</a></li>'
235 + '</ul>'
236 + '</div>'
237 var $dropdowns = $(dropdownHTML).appendTo('#qunit-fixture').find('[data-toggle="dropdown"]')
238 var $first = $dropdowns.first()
239 var $last = $dropdowns.last()
240
241 assert.strictEqual($dropdowns.length, 2, 'two dropdowns')
242
243 $first.trigger('click')
244 assert.strictEqual($first.parents('.show').length, 1, '"show" class added on click')
245 assert.strictEqual($('#qunit-fixture .show').length, 1, 'only one dropdown is shown')
246 $(document.body).trigger('click')
247 assert.strictEqual($('#qunit-fixture .show').length, 0, '"show" class removed')
248
249 $last.trigger('click')
250 assert.strictEqual($last.parent('.show').length, 1, '"show" class added on click')
251 assert.strictEqual($('#qunit-fixture .show').length, 1, 'only one dropdown is shown')
252 $(document.body).trigger('click')
253 assert.strictEqual($('#qunit-fixture .show').length, 0, '"show" class removed')
254 })
255
256 QUnit.test('should remove "show" class if body is focused, with multiple dropdowns', function (assert) {
257 assert.expect(7)
258 var dropdownHTML = '<div class="nav">'
259 + '<div class="dropdown" id="testmenu">'
260 + '<a class="dropdown-toggle" data-toggle="dropdown" href="#testmenu">Test menu <span class="caret"/></a>'
261 + '<div class="dropdown-menu">'
262 + '<a class="dropdown-item" href="#sub1">Submenu 1</a>'
263 + '</div>'
264 + '</div>'
265 + '</div>'
266 + '<div class="btn-group">'
267 + '<button class="btn">Actions</button>'
268 + '<button class="btn dropdown-toggle" data-toggle="dropdown"><span class="caret"/></button>'
269 + '<div class="dropdown-menu">'
270 + '<a class="dropdown-item" href="#">Action 1</a>'
271 + '</div>'
272 + '</div>'
273 var $dropdowns = $(dropdownHTML).appendTo('#qunit-fixture').find('[data-toggle="dropdown"]')
274 var $first = $dropdowns.first()
275 var $last = $dropdowns.last()
276
277 assert.strictEqual($dropdowns.length, 2, 'two dropdowns')
278
279 $first.trigger('click')
280 assert.strictEqual($first.parents('.show').length, 1, '"show" class added on click')
281 assert.strictEqual($('#qunit-fixture .show').length, 1, 'only one dropdown is show')
282 $(document.body).trigger('focusin')
283 assert.strictEqual($('#qunit-fixture .show').length, 0, '"show" class removed')
284
285 $last.trigger('click')
286 assert.strictEqual($last.parent('.show').length, 1, '"show" class added on click')
287 assert.strictEqual($('#qunit-fixture .show').length, 1, 'only one dropdown is show')
288 $(document.body).trigger('focusin')
289 assert.strictEqual($('#qunit-fixture .show').length, 0, '"show" class removed')
290 })
291
292 QUnit.test('should fire show and hide event', function (assert) {
293 assert.expect(2)
294 var dropdownHTML = '<ul class="tabs">'
295 + '<li class="dropdown">'
296 + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
297 + '<ul class="dropdown-menu">'
298 + '<li><a href="#">Secondary link</a></li>'
299 + '<li><a href="#">Something else here</a></li>'
300 + '<li class="divider"/>'
301 + '<li><a href="#">Another link</a></li>'
302 + '</ul>'
303 + '</li>'
304 + '</ul>'
305 var $dropdown = $(dropdownHTML)
306 .appendTo('#qunit-fixture')
307 .find('[data-toggle="dropdown"]')
308 .bootstrapDropdown()
309
310 var done = assert.async()
311
312 $dropdown
313 .parent('.dropdown')
314 .on('show.bs.dropdown', function () {
315 assert.ok(true, 'show was fired')
316 })
317 .on('hide.bs.dropdown', function () {
318 assert.ok(true, 'hide was fired')
319 done()
320 })
321
322 $dropdown.trigger('click')
323 $(document.body).trigger('click')
324 })
325
326
327 QUnit.test('should fire shown and hidden event', function (assert) {
328 assert.expect(2)
329 var dropdownHTML = '<ul class="tabs">'
330 + '<li class="dropdown">'
331 + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
332 + '<ul class="dropdown-menu">'
333 + '<li><a href="#">Secondary link</a></li>'
334 + '<li><a href="#">Something else here</a></li>'
335 + '<li class="divider"/>'
336 + '<li><a href="#">Another link</a></li>'
337 + '</ul>'
338 + '</li>'
339 + '</ul>'
340 var $dropdown = $(dropdownHTML)
341 .appendTo('#qunit-fixture')
342 .find('[data-toggle="dropdown"]')
343 .bootstrapDropdown()
344
345 var done = assert.async()
346
347 $dropdown
348 .parent('.dropdown')
349 .on('shown.bs.dropdown', function () {
350 assert.ok(true, 'shown was fired')
351 })
352 .on('hidden.bs.dropdown', function () {
353 assert.ok(true, 'hidden was fired')
354 done()
355 })
356
357 $dropdown.trigger('click')
358 $(document.body).trigger('click')
359 })
360
361 QUnit.test('should fire shown and hidden event with a relatedTarget', function (assert) {
362 assert.expect(2)
363 var dropdownHTML = '<ul class="tabs">'
364 + '<li class="dropdown">'
365 + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
366 + '<ul class="dropdown-menu">'
367 + '<li><a href="#">Secondary link</a></li>'
368 + '<li><a href="#">Something else here</a></li>'
369 + '<li class="divider"/>'
370 + '<li><a href="#">Another link</a></li>'
371 + '</ul>'
372 + '</li>'
373 + '</ul>'
374 var $dropdown = $(dropdownHTML)
375 .appendTo('#qunit-fixture')
376 .find('[data-toggle="dropdown"]')
377 .bootstrapDropdown()
378 var done = assert.async()
379
380 $dropdown.parent('.dropdown')
381 .on('hidden.bs.dropdown', function (e) {
382 assert.strictEqual(e.relatedTarget, $dropdown[0])
383 done()
384 })
385 .on('shown.bs.dropdown', function (e) {
386 assert.strictEqual(e.relatedTarget, $dropdown[0])
387 $(document.body).trigger('click')
388 })
389
390 $dropdown.trigger('click')
391 })
392
393 QUnit.test('should ignore keyboard events within <input>s and <textarea>s', function (assert) {
394 assert.expect(3)
395 var done = assert.async()
396
397 var dropdownHTML = '<ul class="tabs">'
398 + '<li class="dropdown">'
399 + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
400 + '<ul class="dropdown-menu">'
401 + '<li><a href="#">Secondary link</a></li>'
402 + '<li><a href="#">Something else here</a></li>'
403 + '<li class="divider"/>'
404 + '<li><a href="#">Another link</a></li>'
405 + '<li><input type="text" id="input"></li>'
406 + '<li><textarea id="textarea"/></li>'
407 + '</ul>'
408 + '</li>'
409 + '</ul>'
410 var $dropdown = $(dropdownHTML)
411 .appendTo('#qunit-fixture')
412 .find('[data-toggle="dropdown"]')
413 .bootstrapDropdown()
414
415 var $input = $('#input')
416 var $textarea = $('#textarea')
417
418 $dropdown
419 .parent('.dropdown')
420 .on('shown.bs.dropdown', function () {
421 assert.ok(true, 'shown was fired')
422
423 $input.trigger('focus').trigger($.Event('keydown', { which: 38 }))
424 assert.ok($(document.activeElement).is($input), 'input still focused')
425
426 $textarea.trigger('focus').trigger($.Event('keydown', { which: 38 }))
427 assert.ok($(document.activeElement).is($textarea), 'textarea still focused')
428
429 done()
430 })
431
432 $dropdown.trigger('click')
433 })
434
435 QUnit.test('should skip disabled element when using keyboard navigation', function (assert) {
436 assert.expect(1)
437 var dropdownHTML = '<ul class="tabs">'
438 + '<li class="dropdown">'
439 + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
440 + '<ul class="dropdown-menu">'
441 + '<li class="disabled"><a href="#">Disabled link</a></li>'
442 + '<li><a href="#">Another link</a></li>'
443 + '</ul>'
444 + '</li>'
445 + '</ul>'
446 var $dropdown = $(dropdownHTML)
447 .appendTo('#qunit-fixture')
448 .find('[data-toggle="dropdown"]')
449 .bootstrapDropdown()
450 .trigger('click')
451
452 $dropdown.trigger($.Event('keydown', { which: 40 }))
453 $dropdown.trigger($.Event('keydown', { which: 40 }))
454
455 assert.ok(!$(document.activeElement).parent().is('.disabled'), '.disabled is not focused')
456 })
457
458 QUnit.test('should not close the dropdown if the user clicks on a text field', function (assert) {
459 assert.expect(1)
460 var dropdownHTML = '<div class="btn-group">'
461 + '<button type="button" data-toggle="dropdown">Dropdown</button>'
462 + '<ul class="dropdown-menu">'
463 + '<li><input id="textField" type="text" /></li>'
464 + '</ul>'
465 + '</div>'
466 var $dropdown = $(dropdownHTML)
467 .appendTo('#qunit-fixture')
468 .find('[data-toggle="dropdown"]')
469 .bootstrapDropdown()
470 .trigger('click')
471
472 $('#textField').trigger('click')
473
474 assert.ok($dropdown.parent('.btn-group').hasClass('show'), 'dropdown menu is shown')
475 })
476
477 QUnit.test('should not close the dropdown if the user clicks on a textarea', function (assert) {
478 assert.expect(1)
479 var dropdownHTML = '<div class="btn-group">'
480 + '<button type="button" data-toggle="dropdown">Dropdown</button>'
481 + '<ul class="dropdown-menu">'
482 + '<li><textarea id="textArea"></textarea></li>'
483 + '</ul>'
484 + '</div>'
485 var $dropdown = $(dropdownHTML)
486 .appendTo('#qunit-fixture')
487 .find('[data-toggle="dropdown"]')
488 .bootstrapDropdown()
489 .trigger('click')
490
491 $('#textArea').trigger('click')
492
493 assert.ok($dropdown.parent('.btn-group').hasClass('show'), 'dropdown menu is shown')
494 })
495})