4 QUnit.module('collapse plugin')
6 QUnit.test('should be defined on jquery object', function (assert) {
8 assert.ok($(document.body).collapse, 'collapse method is defined')
11 QUnit.module('collapse', {
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.bootstrapCollapse = $.fn.collapse.noConflict()
16 afterEach: function () {
17 $.fn.collapse = $.fn.bootstrapCollapse
18 delete $.fn.bootstrapCollapse
22 QUnit.test('should provide no conflict', function (assert) {
24 assert.strictEqual($.fn.collapse, undefined, 'collapse was set back to undefined (org value)')
27 QUnit.test('should return jquery collection containing the element', function (assert) {
30 var $collapse = $el.bootstrapCollapse()
31 assert.ok($collapse instanceof $, 'returns jquery collection')
32 assert.strictEqual($collapse[0], $el[0], 'collection contains element')
35 QUnit.test('should show a collapsed element', function (assert) {
37 var $el = $('<div class="collapse"/>').bootstrapCollapse('show')
39 assert.ok($el.hasClass('in'), 'has class "in"')
40 assert.ok(!/height/i.test($el.attr('style')), 'has height reset')
43 QUnit.test('should hide a collapsed element', function (assert) {
45 var $el = $('<div class="collapse"/>').bootstrapCollapse('hide')
47 assert.ok(!$el.hasClass('in'), 'does not have class "in"')
50 QUnit.test('should not fire shown when show is prevented', function (assert) {
52 var done = assert.async()
54 $('<div class="collapse"/>')
55 .on('show.bs.collapse', function (e) {
57 assert.ok(true, 'show event fired')
60 .on('shown.bs.collapse', function () {
61 assert.ok(false, 'shown event fired')
63 .bootstrapCollapse('show')
66 QUnit.test('should reset style to auto after finishing opening collapse', function (assert) {
68 var done = assert.async()
70 $('<div class="collapse" style="height: 0px"/>')
71 .on('show.bs.collapse', function () {
72 assert.strictEqual(this.style.height, '0px', 'height is 0px')
74 .on('shown.bs.collapse', function () {
75 assert.strictEqual(this.style.height, '', 'height is auto')
78 .bootstrapCollapse('show')
81 QUnit.test('should remove "collapsed" class from target when collapse is shown', function (assert) {
83 var done = assert.async()
85 var $target = $('<a data-toggle="collapse" class="collapsed" href="#test1"/>').appendTo('#qunit-fixture')
87 $('<div id="test1"/>')
88 .appendTo('#qunit-fixture')
89 .on('shown.bs.collapse', function () {
90 assert.ok(!$target.hasClass('collapsed'), 'target does not have collapsed class')
94 $target.trigger('click')
97 QUnit.test('should add "collapsed" class to target when collapse is hidden', function (assert) {
99 var done = assert.async()
101 var $target = $('<a data-toggle="collapse" href="#test1"/>').appendTo('#qunit-fixture')
103 $('<div id="test1" class="in"/>')
104 .appendTo('#qunit-fixture')
105 .on('hidden.bs.collapse', function () {
106 assert.ok($target.hasClass('collapsed'), 'target has collapsed class')
110 $target.trigger('click')
113 QUnit.test('should remove "collapsed" class from all triggers targeting the collapse when the collapse is shown', function (assert) {
115 var done = assert.async()
117 var $target = $('<a data-toggle="collapse" class="collapsed" href="#test1"/>').appendTo('#qunit-fixture')
118 var $alt = $('<a data-toggle="collapse" class="collapsed" href="#test1"/>').appendTo('#qunit-fixture')
120 $('<div id="test1"/>')
121 .appendTo('#qunit-fixture')
122 .on('shown.bs.collapse', function () {
123 assert.ok(!$target.hasClass('collapsed'), 'target trigger does not have collapsed class')
124 assert.ok(!$alt.hasClass('collapsed'), 'alt trigger does not have collapsed class')
128 $target.trigger('click')
131 QUnit.test('should add "collapsed" class to all triggers targeting the collapse when the collapse is hidden', function (assert) {
133 var done = assert.async()
135 var $target = $('<a data-toggle="collapse" href="#test1"/>').appendTo('#qunit-fixture')
136 var $alt = $('<a data-toggle="collapse" href="#test1"/>').appendTo('#qunit-fixture')
138 $('<div id="test1" class="in"/>')
139 .appendTo('#qunit-fixture')
140 .on('hidden.bs.collapse', function () {
141 assert.ok($target.hasClass('collapsed'), 'target has collapsed class')
142 assert.ok($alt.hasClass('collapsed'), 'alt trigger has collapsed class')
146 $target.trigger('click')
149 QUnit.test('should not close a collapse when initialized with "show" option if already shown', function (assert) {
151 var done = assert.async()
153 var $test = $('<div id="test1" class="in"/>')
154 .appendTo('#qunit-fixture')
155 .on('hide.bs.collapse', function () {
159 $test.bootstrapCollapse('show')
164 QUnit.test('should open a collapse when initialized with "show" option if not already shown', function (assert) {
166 var done = assert.async()
168 var $test = $('<div id="test1" />')
169 .appendTo('#qunit-fixture')
170 .on('show.bs.collapse', function () {
174 $test.bootstrapCollapse('show')
179 QUnit.test('should not show a collapse when initialized with "hide" option if already hidden', function (assert) {
181 var done = assert.async()
183 $('<div class="collapse"></div>')
184 .appendTo('#qunit-fixture')
185 .on('show.bs.collapse', function () {
186 assert.ok(false, 'showing a previously-uninitialized hidden collapse when the "hide" method is called')
188 .bootstrapCollapse('hide')
193 QUnit.test('should hide a collapse when initialized with "hide" option if not already hidden', function (assert) {
195 var done = assert.async()
197 $('<div class="collapse in"></div>')
198 .appendTo('#qunit-fixture')
199 .on('hide.bs.collapse', function () {
200 assert.ok(true, 'hiding a previously-uninitialized shown collapse when the "hide" method is called')
202 .bootstrapCollapse('hide')
207 QUnit.test('should remove "collapsed" class from active accordion target', function (assert) {
209 var done = assert.async()
211 var accordionHTML = '<div class="panel-group" id="accordion">'
212 + '<div class="panel"/>'
213 + '<div class="panel"/>'
214 + '<div class="panel"/>'
216 var $groups = $(accordionHTML).appendTo('#qunit-fixture').find('.panel')
218 var $target1 = $('<a data-toggle="collapse" href="#body1" data-parent="#accordion"/>').appendTo($groups.eq(0))
220 $('<div id="body1" class="in"/>').appendTo($groups.eq(0))
222 var $target2 = $('<a class="collapsed" data-toggle="collapse" href="#body2" data-parent="#accordion"/>').appendTo($groups.eq(1))
224 $('<div id="body2"/>').appendTo($groups.eq(1))
226 var $target3 = $('<a class="collapsed" data-toggle="collapse" href="#body3" data-parent="#accordion"/>').appendTo($groups.eq(2))
228 $('<div id="body3"/>')
229 .appendTo($groups.eq(2))
230 .on('shown.bs.collapse', function () {
231 assert.ok($target1.hasClass('collapsed'), 'inactive target 1 does have class "collapsed"')
232 assert.ok($target2.hasClass('collapsed'), 'inactive target 2 does have class "collapsed"')
233 assert.ok(!$target3.hasClass('collapsed'), 'active target 3 does not have class "collapsed"')
238 $target3.trigger('click')
241 QUnit.test('should allow dots in data-parent', function (assert) {
243 var done = assert.async()
245 var accordionHTML = '<div class="panel-group accordion">'
246 + '<div class="panel"/>'
247 + '<div class="panel"/>'
248 + '<div class="panel"/>'
250 var $groups = $(accordionHTML).appendTo('#qunit-fixture').find('.panel')
252 var $target1 = $('<a data-toggle="collapse" href="#body1" data-parent=".accordion"/>').appendTo($groups.eq(0))
254 $('<div id="body1" class="in"/>').appendTo($groups.eq(0))
256 var $target2 = $('<a class="collapsed" data-toggle="collapse" href="#body2" data-parent=".accordion"/>').appendTo($groups.eq(1))
258 $('<div id="body2"/>').appendTo($groups.eq(1))
260 var $target3 = $('<a class="collapsed" data-toggle="collapse" href="#body3" data-parent=".accordion"/>').appendTo($groups.eq(2))
262 $('<div id="body3"/>')
263 .appendTo($groups.eq(2))
264 .on('shown.bs.collapse', function () {
265 assert.ok($target1.hasClass('collapsed'), 'inactive target 1 does have class "collapsed"')
266 assert.ok($target2.hasClass('collapsed'), 'inactive target 2 does have class "collapsed"')
267 assert.ok(!$target3.hasClass('collapsed'), 'active target 3 does not have class "collapsed"')
272 $target3.trigger('click')
275 QUnit.test('should set aria-expanded="true" on target when collapse is shown', function (assert) {
277 var done = assert.async()
279 var $target = $('<a data-toggle="collapse" class="collapsed" href="#test1" aria-expanded="false"/>').appendTo('#qunit-fixture')
281 $('<div id="test1"/>')
282 .appendTo('#qunit-fixture')
283 .on('shown.bs.collapse', function () {
284 assert.strictEqual($target.attr('aria-expanded'), 'true', 'aria-expanded on target is "true"')
288 $target.trigger('click')
291 QUnit.test('should set aria-expanded="false" on target when collapse is hidden', function (assert) {
293 var done = assert.async()
295 var $target = $('<a data-toggle="collapse" href="#test1" aria-expanded="true"/>').appendTo('#qunit-fixture')
297 $('<div id="test1" class="in"/>')
298 .appendTo('#qunit-fixture')
299 .on('hidden.bs.collapse', function () {
300 assert.strictEqual($target.attr('aria-expanded'), 'false', 'aria-expanded on target is "false"')
304 $target.trigger('click')
307 QUnit.test('should set aria-expanded="true" on all triggers targeting the collapse when the collapse is shown', function (assert) {
309 var done = assert.async()
311 var $target = $('<a data-toggle="collapse" class="collapsed" href="#test1" aria-expanded="false"/>').appendTo('#qunit-fixture')
312 var $alt = $('<a data-toggle="collapse" class="collapsed" href="#test1" aria-expanded="false"/>').appendTo('#qunit-fixture')
314 $('<div id="test1"/>')
315 .appendTo('#qunit-fixture')
316 .on('shown.bs.collapse', function () {
317 assert.strictEqual($target.attr('aria-expanded'), 'true', 'aria-expanded on target is "true"')
318 assert.strictEqual($alt.attr('aria-expanded'), 'true', 'aria-expanded on alt is "true"')
322 $target.trigger('click')
325 QUnit.test('should set aria-expanded="false" on all triggers targeting the collapse when the collapse is hidden', function (assert) {
327 var done = assert.async()
329 var $target = $('<a data-toggle="collapse" href="#test1" aria-expanded="true"/>').appendTo('#qunit-fixture')
330 var $alt = $('<a data-toggle="collapse" href="#test1" aria-expanded="true"/>').appendTo('#qunit-fixture')
332 $('<div id="test1" class="in"/>')
333 .appendTo('#qunit-fixture')
334 .on('hidden.bs.collapse', function () {
335 assert.strictEqual($target.attr('aria-expanded'), 'false', 'aria-expanded on target is "false"')
336 assert.strictEqual($alt.attr('aria-expanded'), 'false', 'aria-expanded on alt is "false"')
340 $target.trigger('click')
343 QUnit.test('should change aria-expanded from active accordion target to "false" and set the newly active one to "true"', function (assert) {
345 var done = assert.async()
347 var accordionHTML = '<div class="panel-group" id="accordion">'
348 + '<div class="panel"/>'
349 + '<div class="panel"/>'
350 + '<div class="panel"/>'
352 var $groups = $(accordionHTML).appendTo('#qunit-fixture').find('.panel')
354 var $target1 = $('<a data-toggle="collapse" href="#body1" data-parent="#accordion"/>').appendTo($groups.eq(0))
356 $('<div id="body1" aria-expanded="true" class="in"/>').appendTo($groups.eq(0))
358 var $target2 = $('<a class="collapsed" data-toggle="collapse" href="#body2" data-parent="#accordion"/>').appendTo($groups.eq(1))
360 $('<div id="body2" aria-expanded="false"/>').appendTo($groups.eq(1))
362 var $target3 = $('<a class="collapsed" data-toggle="collapse" href="#body3" data-parent="#accordion"/>').appendTo($groups.eq(2))
364 $('<div id="body3" aria-expanded="false"/>')
365 .appendTo($groups.eq(2))
366 .on('shown.bs.collapse', function () {
367 assert.strictEqual($target1.attr('aria-expanded'), 'false', 'inactive target 1 has aria-expanded="false"')
368 assert.strictEqual($target2.attr('aria-expanded'), 'false', 'inactive target 2 has aria-expanded="false"')
369 assert.strictEqual($target3.attr('aria-expanded'), 'true', 'active target 3 has aria-expanded="false"')
374 $target3.trigger('click')
377 QUnit.test('should not fire show event if show is prevented because other element is still transitioning', function (assert) {
379 var done = assert.async()
381 var accordionHTML = '<div id="accordion">'
382 + '<div class="panel"/>'
383 + '<div class="panel"/>'
385 var showFired = false
386 var $groups = $(accordionHTML).appendTo('#qunit-fixture').find('.panel')
388 var $target1 = $('<a data-toggle="collapse" href="#body1" data-parent="#accordion"/>').appendTo($groups.eq(0))
390 $('<div id="body1" class="collapse"/>')
391 .appendTo($groups.eq(0))
392 .on('show.bs.collapse', function () {
396 var $target2 = $('<a data-toggle="collapse" href="#body2" data-parent="#accordion"/>').appendTo($groups.eq(1))
397 var $body2 = $('<div id="body2" class="collapse"/>').appendTo($groups.eq(1))
399 $target2.trigger('click')
402 .toggleClass('in collapsing')
403 .data('bs.collapse').transitioning = 1
405 $target1.trigger('click')
407 setTimeout(function () {
408 assert.ok(!showFired, 'show event did not fire')
413 QUnit.test('should add "collapsed" class to target when collapse is hidden via manual invocation', function (assert) {
415 var done = assert.async()
417 var $target = $('<a data-toggle="collapse" href="#test1"/>').appendTo('#qunit-fixture')
419 $('<div id="test1" class="in"/>')
420 .appendTo('#qunit-fixture')
421 .on('hidden.bs.collapse', function () {
422 assert.ok($target.hasClass('collapsed'))
425 .bootstrapCollapse('hide')
428 QUnit.test('should remove "collapsed" class from target when collapse is shown via manual invocation', function (assert) {
430 var done = assert.async()
432 var $target = $('<a data-toggle="collapse" class="collapsed" href="#test1"/>').appendTo('#qunit-fixture')
434 $('<div id="test1"/>')
435 .appendTo('#qunit-fixture')
436 .on('shown.bs.collapse', function () {
437 assert.ok(!$target.hasClass('collapsed'))
440 .bootstrapCollapse('show')