4 QUnit.module('dropdowns plugin')
6 QUnit.test('should be defined on jquery object', function (assert) {
8 assert.ok($(document.body).dropdown, 'dropdown method is defined')
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()
16 afterEach: function () {
17 $.fn.dropdown = $.fn.bootstrapDropdown
18 delete $.fn.bootstrapDropdown
22 QUnit.test('should provide no conflict', function (assert) {
24 assert.strictEqual($.fn.dropdown, undefined, 'dropdown was set back to undefined (org value)')
27 QUnit.test('should return jquery collection containing the element', function (assert) {
30 var $dropdown = $el.bootstrapDropdown()
31 assert.ok($dropdown instanceof $, 'returns jquery collection')
32 assert.strictEqual($dropdown[0], $el[0], 'collection contains element')
35 QUnit.test('should not open dropdown if target is disabled via attribute', function (assert) {
37 var dropdownHTML = '<ul class="tabs">'
38 + '<li class="dropdown">'
39 + '<button disabled href="#" class="btn dropdown-toggle" data-toggle="dropdown">Dropdown</button>'
40 + '<ul class="dropdown-menu">'
41 + '<li><a href="#">Secondary link</a></li>'
42 + '<li><a href="#">Something else here</a></li>'
43 + '<li class="divider"/>'
44 + '<li><a href="#">Another link</a></li>'
48 var $dropdown = $(dropdownHTML).find('[data-toggle="dropdown"]').bootstrapDropdown().trigger('click')
50 assert.ok(!$dropdown.parent('.dropdown').hasClass('open'), '"open" class added on click')
53 QUnit.test('should set aria-expanded="true" on target when dropdown menu is shown', function (assert) {
55 var dropdownHTML = '<ul class="tabs">'
56 + '<li class="dropdown">'
57 + '<a href="#" class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false">Dropdown</a>'
58 + '<ul class="dropdown-menu">'
59 + '<li><a href="#">Secondary link</a></li>'
60 + '<li><a href="#">Something else here</a></li>'
61 + '<li class="divider"/>'
62 + '<li><a href="#">Another link</a></li>'
66 var $dropdown = $(dropdownHTML)
67 .find('[data-toggle="dropdown"]')
71 assert.strictEqual($dropdown.attr('aria-expanded'), 'true', 'aria-expanded is set to string "true" on click')
74 QUnit.test('should set aria-expanded="false" on target when dropdown menu is hidden', function (assert) {
76 var done = assert.async()
77 var dropdownHTML = '<ul class="tabs">'
78 + '<li class="dropdown">'
79 + '<a href="#" class="dropdown-toggle" aria-expanded="false" data-toggle="dropdown">Dropdown</a>'
80 + '<ul class="dropdown-menu">'
81 + '<li><a href="#">Secondary link</a></li>'
82 + '<li><a href="#">Something else here</a></li>'
83 + '<li class="divider"/>'
84 + '<li><a href="#">Another link</a></li>'
88 var $dropdown = $(dropdownHTML)
89 .appendTo('#qunit-fixture')
90 .find('[data-toggle="dropdown"]')
95 .on('hidden.bs.dropdown', function () {
96 assert.strictEqual($dropdown.attr('aria-expanded'), 'false', 'aria-expanded is set to string "false" on hide')
100 $dropdown.trigger('click')
101 $(document.body).trigger('click')
104 QUnit.test('should not open dropdown if target is disabled via class', function (assert) {
106 var dropdownHTML = '<ul class="tabs">'
107 + '<li class="dropdown">'
108 + '<button href="#" class="btn dropdown-toggle disabled" data-toggle="dropdown">Dropdown</button>'
109 + '<ul class="dropdown-menu">'
110 + '<li><a href="#">Secondary link</a></li>'
111 + '<li><a href="#">Something else here</a></li>'
112 + '<li class="divider"/>'
113 + '<li><a href="#">Another link</a></li>'
117 var $dropdown = $(dropdownHTML).find('[data-toggle="dropdown"]').bootstrapDropdown().trigger('click')
119 assert.ok(!$dropdown.parent('.dropdown').hasClass('open'), '"open" class added on click')
122 QUnit.test('should add class open to menu if clicked', function (assert) {
124 var dropdownHTML = '<ul class="tabs">'
125 + '<li class="dropdown">'
126 + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
127 + '<ul class="dropdown-menu">'
128 + '<li><a href="#">Secondary link</a></li>'
129 + '<li><a href="#">Something else here</a></li>'
130 + '<li class="divider"/>'
131 + '<li><a href="#">Another link</a></li>'
135 var $dropdown = $(dropdownHTML).find('[data-toggle="dropdown"]').bootstrapDropdown().trigger('click')
137 assert.ok($dropdown.parent('.dropdown').hasClass('open'), '"open" class added on click')
140 QUnit.test('should test if element has a # before assuming it\'s a selector', function (assert) {
142 var dropdownHTML = '<ul class="tabs">'
143 + '<li class="dropdown">'
144 + '<a href="/foo/" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
145 + '<ul class="dropdown-menu">'
146 + '<li><a href="#">Secondary link</a></li>'
147 + '<li><a href="#">Something else here</a></li>'
148 + '<li class="divider"/>'
149 + '<li><a href="#">Another link</a></li>'
153 var $dropdown = $(dropdownHTML).find('[data-toggle="dropdown"]').bootstrapDropdown().trigger('click')
155 assert.ok($dropdown.parent('.dropdown').hasClass('open'), '"open" class added on click')
159 QUnit.test('should remove "open" class if body is clicked', function (assert) {
161 var dropdownHTML = '<ul class="tabs">'
162 + '<li class="dropdown">'
163 + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
164 + '<ul class="dropdown-menu">'
165 + '<li><a href="#">Secondary link</a></li>'
166 + '<li><a href="#">Something else here</a></li>'
167 + '<li class="divider"/>'
168 + '<li><a href="#">Another link</a></li>'
172 var $dropdown = $(dropdownHTML)
173 .appendTo('#qunit-fixture')
174 .find('[data-toggle="dropdown"]')
178 assert.ok($dropdown.parent('.dropdown').hasClass('open'), '"open" class added on click')
179 $(document.body).trigger('click')
180 assert.ok(!$dropdown.parent('.dropdown').hasClass('open'), '"open" class removed')
183 QUnit.test('should remove "open" class if body is clicked, with multiple dropdowns', function (assert) {
185 var dropdownHTML = '<ul class="nav">'
186 + '<li><a href="#menu1">Menu 1</a></li>'
187 + '<li class="dropdown" id="testmenu">'
188 + '<a class="dropdown-toggle" data-toggle="dropdown" href="#testmenu">Test menu <span class="caret"/></a>'
189 + '<ul class="dropdown-menu" role="menu">'
190 + '<li><a href="#sub1">Submenu 1</a></li>'
194 + '<div class="btn-group">'
195 + '<button class="btn">Actions</button>'
196 + '<button class="btn dropdown-toggle" data-toggle="dropdown"><span class="caret"/></button>'
197 + '<ul class="dropdown-menu">'
198 + '<li><a href="#">Action 1</a></li>'
201 var $dropdowns = $(dropdownHTML).appendTo('#qunit-fixture').find('[data-toggle="dropdown"]')
202 var $first = $dropdowns.first()
203 var $last = $dropdowns.last()
205 assert.strictEqual($dropdowns.length, 2, 'two dropdowns')
207 $first.trigger('click')
208 assert.strictEqual($first.parents('.open').length, 1, '"open" class added on click')
209 assert.strictEqual($('#qunit-fixture .open').length, 1, 'only one dropdown is open')
210 $(document.body).trigger('click')
211 assert.strictEqual($('#qunit-fixture .open').length, 0, '"open" class removed')
213 $last.trigger('click')
214 assert.strictEqual($last.parent('.open').length, 1, '"open" class added on click')
215 assert.strictEqual($('#qunit-fixture .open').length, 1, 'only one dropdown is open')
216 $(document.body).trigger('click')
217 assert.strictEqual($('#qunit-fixture .open').length, 0, '"open" class removed')
220 QUnit.test('should fire show and hide event', function (assert) {
222 var dropdownHTML = '<ul class="tabs">'
223 + '<li class="dropdown">'
224 + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
225 + '<ul class="dropdown-menu">'
226 + '<li><a href="#">Secondary link</a></li>'
227 + '<li><a href="#">Something else here</a></li>'
228 + '<li class="divider"/>'
229 + '<li><a href="#">Another link</a></li>'
233 var $dropdown = $(dropdownHTML)
234 .appendTo('#qunit-fixture')
235 .find('[data-toggle="dropdown"]')
238 var done = assert.async()
242 .on('show.bs.dropdown', function () {
243 assert.ok(true, 'show was fired')
245 .on('hide.bs.dropdown', function () {
246 assert.ok(true, 'hide was fired')
250 $dropdown.trigger('click')
251 $(document.body).trigger('click')
255 QUnit.test('should fire shown and hidden event', function (assert) {
257 var dropdownHTML = '<ul class="tabs">'
258 + '<li class="dropdown">'
259 + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
260 + '<ul class="dropdown-menu">'
261 + '<li><a href="#">Secondary link</a></li>'
262 + '<li><a href="#">Something else here</a></li>'
263 + '<li class="divider"/>'
264 + '<li><a href="#">Another link</a></li>'
268 var $dropdown = $(dropdownHTML)
269 .appendTo('#qunit-fixture')
270 .find('[data-toggle="dropdown"]')
273 var done = assert.async()
277 .on('shown.bs.dropdown', function () {
278 assert.ok(true, 'shown was fired')
280 .on('hidden.bs.dropdown', function () {
281 assert.ok(true, 'hidden was fired')
285 $dropdown.trigger('click')
286 $(document.body).trigger('click')
289 QUnit.test('should ignore keyboard events within <input>s and <textarea>s', function (assert) {
291 var done = assert.async()
293 var dropdownHTML = '<ul class="tabs">'
294 + '<li class="dropdown">'
295 + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
296 + '<ul class="dropdown-menu" role="menu">'
297 + '<li><a href="#">Secondary link</a></li>'
298 + '<li><a href="#">Something else here</a></li>'
299 + '<li class="divider"/>'
300 + '<li><a href="#">Another link</a></li>'
301 + '<li><input type="text" id="input"></li>'
302 + '<li><textarea id="textarea"/></li>'
306 var $dropdown = $(dropdownHTML)
307 .appendTo('#qunit-fixture')
308 .find('[data-toggle="dropdown"]')
311 var $input = $('#input')
312 var $textarea = $('#textarea')
316 .on('shown.bs.dropdown', function () {
317 assert.ok(true, 'shown was fired')
319 $input.trigger('focus').trigger($.Event('keydown', { which: 38 }))
320 assert.ok($(document.activeElement).is($input), 'input still focused')
322 $textarea.trigger('focus').trigger($.Event('keydown', { which: 38 }))
323 assert.ok($(document.activeElement).is($textarea), 'textarea still focused')
328 $dropdown.trigger('click')
331 QUnit.test('should skip disabled element when using keyboard navigation', function (assert) {
333 var dropdownHTML = '<ul class="tabs">'
334 + '<li class="dropdown">'
335 + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
336 + '<ul class="dropdown-menu" role="menu">'
337 + '<li class="disabled"><a href="#">Disabled link</a></li>'
338 + '<li><a href="#">Another link</a></li>'
342 var $dropdown = $(dropdownHTML)
343 .appendTo('#qunit-fixture')
344 .find('[data-toggle="dropdown"]')
348 $dropdown.trigger($.Event('keydown', { which: 40 }))
349 $dropdown.trigger($.Event('keydown', { which: 40 }))
351 assert.ok(!$(document.activeElement).parent().is('.disabled'), '.disabled is not focused')