collapse.js 33.3 KB
Newer Older
1
$(function () {
2
  'use strict'
3

4
  QUnit.module('collapse plugin')
XhmikosR's avatar
XhmikosR committed
5

6
  QUnit.test('should be defined on jquery object', function (assert) {
7
    assert.expect(1)
8
    assert.ok($(document.body).collapse, 'collapse method is defined')
XhmikosR's avatar
XhmikosR committed
9
10
  })

11
  QUnit.module('collapse', {
12
    beforeEach: function () {
13
14
15
      // Run all tests in noConflict mode -- it's the only way to ensure that the plugin works in noConflict mode
      $.fn.bootstrapCollapse = $.fn.collapse.noConflict()
    },
16
    afterEach: function () {
17
18
19
20
21
      $.fn.collapse = $.fn.bootstrapCollapse
      delete $.fn.bootstrapCollapse
    }
  })

22
  QUnit.test('should provide no conflict', function (assert) {
23
    assert.expect(1)
XhmikosR's avatar
XhmikosR committed
24
    assert.strictEqual(typeof $.fn.collapse, 'undefined', 'collapse was set back to undefined (org value)')
25
26
  })

27
28
29
30
31
32
  QUnit.test('should throw explicit error on undefined method', function (assert) {
    assert.expect(1)
    var $el = $('<div/>')
    $el.bootstrapCollapse()
    try {
      $el.bootstrapCollapse('noMethod')
XhmikosR's avatar
XhmikosR committed
33
    } catch (err) {
34
35
36
37
      assert.strictEqual(err.message, 'No method named "noMethod"')
    }
  })

38
  QUnit.test('should return jquery collection containing the element', function (assert) {
39
    assert.expect(2)
40
41
    var $el = $('<div/>')
    var $collapse = $el.bootstrapCollapse()
42
43
    assert.ok($collapse instanceof $, 'returns jquery collection')
    assert.strictEqual($collapse[0], $el[0], 'collection contains element')
XhmikosR's avatar
XhmikosR committed
44
45
  })

46
  QUnit.test('should show a collapsed element', function (assert) {
47
    assert.expect(2)
48
49
    var $el = $('<div class="collapse"/>').bootstrapCollapse('show')

Starsam80's avatar
Starsam80 committed
50
    assert.ok($el.hasClass('show'), 'has class "show"')
51
    assert.ok(!/height/i.test($el.attr('style')), 'has height reset')
XhmikosR's avatar
XhmikosR committed
52
53
  })

54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
  QUnit.test('should show multiple collapsed elements', function (assert) {
    assert.expect(4)
    var done = assert.async()
    var $target = $('<a role="button" data-toggle="collapse" class="collapsed" href=".multi"/>').appendTo('#qunit-fixture')
    var $el = $('<div class="collapse multi"/>').appendTo('#qunit-fixture')
    var $el2 = $('<div class="collapse multi"/>').appendTo('#qunit-fixture')
    $el.one('shown.bs.collapse', function () {
      assert.ok($el.hasClass('show'), 'has class "show"')
      assert.ok(!/height/i.test($el.attr('style')), 'has height reset')
    })
    $el2.one('shown.bs.collapse', function () {
      assert.ok($el2.hasClass('show'), 'has class "show"')
      assert.ok(!/height/i.test($el2.attr('style')), 'has height reset')
      done()
    })
    $target.trigger('click')
  })

72
73
  QUnit.test('should collapse only the first collapse', function (assert) {
    assert.expect(2)
74
    var done = assert.async()
75
76
    var html = [
      '<div class="panel-group" id="accordion1">',
77
78
79
      '<div class="panel">',
      '<div id="collapse1" class="collapse"/>',
      '</div>',
80
81
      '</div>',
      '<div class="panel-group" id="accordion2">',
82
      '<div class="panel">',
Starsam80's avatar
Starsam80 committed
83
      '<div id="collapse2" class="collapse show"/>',
84
      '</div>',
85
86
87
88
89
      '</div>'
    ].join('')
    $(html).appendTo('#qunit-fixture')
    var $el1 = $('#collapse1')
    var $el2 = $('#collapse2')
90
91
92
93
94
    $el1.one('shown.bs.collapse', function () {
      assert.ok($el1.hasClass('show'))
      assert.ok($el2.hasClass('show'))
      done()
    }).bootstrapCollapse('show')
95
96
  })

97
  QUnit.test('should hide a collapsed element', function (assert) {
98
    assert.expect(1)
99
100
    var $el = $('<div class="collapse"/>').bootstrapCollapse('hide')

Starsam80's avatar
Starsam80 committed
101
    assert.ok(!$el.hasClass('show'), 'does not have class "show"')
XhmikosR's avatar
XhmikosR committed
102
103
  })

104
  QUnit.test('should not fire shown when show is prevented', function (assert) {
105
    assert.expect(1)
106
    var done = assert.async()
107

XhmikosR's avatar
XhmikosR committed
108
109
    $('<div class="collapse"/>')
      .on('show.bs.collapse', function (e) {
110
        e.preventDefault()
111
        assert.ok(true, 'show event fired')
112
        done()
113
      })
XhmikosR's avatar
XhmikosR committed
114
      .on('shown.bs.collapse', function () {
115
        assert.ok(false, 'shown event fired')
116
      })
117
      .bootstrapCollapse('show')
XhmikosR's avatar
XhmikosR committed
118
119
  })

120
  QUnit.test('should reset style to auto after finishing opening collapse', function (assert) {
121
    assert.expect(2)
122
    var done = assert.async()
123

XhmikosR's avatar
XhmikosR committed
124
125
    $('<div class="collapse" style="height: 0px"/>')
      .on('show.bs.collapse', function () {
126
        assert.strictEqual(this.style.height, '0px', 'height is 0px')
127
      })
XhmikosR's avatar
XhmikosR committed
128
      .on('shown.bs.collapse', function () {
129
        assert.strictEqual(this.style.height, '', 'height is auto')
130
        done()
131
      })
132
      .bootstrapCollapse('show')
XhmikosR's avatar
XhmikosR committed
133
  })
134

135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
  QUnit.test('should reset style to auto after finishing closing collapse', function (assert) {
    assert.expect(1)
    var done = assert.async()

    $('<div class="collapse"/>')
      .on('shown.bs.collapse', function () {
        $(this).bootstrapCollapse('hide')
      })
      .on('hidden.bs.collapse', function () {
        assert.strictEqual(this.style.height, '', 'height is auto')
        done()
      })
      .bootstrapCollapse('show')
  })

150
  QUnit.test('should remove "collapsed" class from target when collapse is shown', function (assert) {
151
    assert.expect(1)
152
    var done = assert.async()
153

154
    var $target = $('<a role="button" data-toggle="collapse" class="collapsed" href="#test1"/>').appendTo('#qunit-fixture')
155

156
157
    $('<div id="test1"/>')
      .appendTo('#qunit-fixture')
158
      .on('shown.bs.collapse', function () {
159
        assert.ok(!$target.hasClass('collapsed'), 'target does not have collapsed class')
160
        done()
161
162
      })

163
    $target.trigger('click')
XhmikosR's avatar
XhmikosR committed
164
  })
165

166
  QUnit.test('should add "collapsed" class to target when collapse is hidden', function (assert) {
167
    assert.expect(1)
168
    var done = assert.async()
169

170
    var $target = $('<a role="button" data-toggle="collapse" href="#test1"/>').appendTo('#qunit-fixture')
171

Starsam80's avatar
Starsam80 committed
172
    $('<div id="test1" class="show"/>')
173
      .appendTo('#qunit-fixture')
174
      .on('hidden.bs.collapse', function () {
175
        assert.ok($target.hasClass('collapsed'), 'target has collapsed class')
176
        done()
177
178
      })

179
    $target.trigger('click')
XhmikosR's avatar
XhmikosR committed
180
  })
181

182
  QUnit.test('should remove "collapsed" class from all triggers targeting the collapse when the collapse is shown', function (assert) {
183
    assert.expect(2)
184
    var done = assert.async()
185

186
187
    var $target = $('<a role="button" data-toggle="collapse" class="collapsed" href="#test1"/>').appendTo('#qunit-fixture')
    var $alt = $('<a role="button" data-toggle="collapse" class="collapsed" href="#test1"/>').appendTo('#qunit-fixture')
188
189
190
191
192
193
194
195
196

    $('<div id="test1"/>')
      .appendTo('#qunit-fixture')
      .on('shown.bs.collapse', function () {
        assert.ok(!$target.hasClass('collapsed'), 'target trigger does not have collapsed class')
        assert.ok(!$alt.hasClass('collapsed'), 'alt trigger does not have collapsed class')
        done()
      })

197
    $target.trigger('click')
198
199
200
  })

  QUnit.test('should add "collapsed" class to all triggers targeting the collapse when the collapse is hidden', function (assert) {
201
    assert.expect(2)
202
203
    var done = assert.async()

204
205
    var $target = $('<a role="button" data-toggle="collapse" href="#test1"/>').appendTo('#qunit-fixture')
    var $alt = $('<a role="button" data-toggle="collapse" href="#test1"/>').appendTo('#qunit-fixture')
206

Starsam80's avatar
Starsam80 committed
207
    $('<div id="test1" class="show"/>')
208
209
210
211
      .appendTo('#qunit-fixture')
      .on('hidden.bs.collapse', function () {
        assert.ok($target.hasClass('collapsed'), 'target has collapsed class')
        assert.ok($alt.hasClass('collapsed'), 'alt trigger has collapsed class')
212
        done()
213
214
      })

215
    $target.trigger('click')
XhmikosR's avatar
XhmikosR committed
216
  })
217

218
  QUnit.test('should not close a collapse when initialized with "show" option if already shown', function (assert) {
219
    assert.expect(0)
220
    var done = assert.async()
221

Starsam80's avatar
Starsam80 committed
222
    var $test = $('<div id="test1" class="show"/>')
223
224
      .appendTo('#qunit-fixture')
      .on('hide.bs.collapse', function () {
225
        assert.ok(false)
226
227
228
229
      })

    $test.bootstrapCollapse('show')

230
    setTimeout(done, 0)
231
232
  })

233
  QUnit.test('should open a collapse when initialized with "show" option if not already shown', function (assert) {
234
    assert.expect(1)
235
    var done = assert.async()
236
237
238
239

    var $test = $('<div id="test1" />')
      .appendTo('#qunit-fixture')
      .on('show.bs.collapse', function () {
240
        assert.ok(true)
241
242
243
244
      })

    $test.bootstrapCollapse('show')

245
    setTimeout(done, 0)
246
247
  })

248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
  QUnit.test('should not show a collapse when initialized with "hide" option if already hidden', function (assert) {
    assert.expect(0)
    var done = assert.async()

    $('<div class="collapse"></div>')
      .appendTo('#qunit-fixture')
      .on('show.bs.collapse', function () {
        assert.ok(false, 'showing a previously-uninitialized hidden collapse when the "hide" method is called')
      })
      .bootstrapCollapse('hide')

    setTimeout(done, 0)
  })

  QUnit.test('should hide a collapse when initialized with "hide" option if not already hidden', function (assert) {
    assert.expect(1)
    var done = assert.async()

Starsam80's avatar
Starsam80 committed
266
    $('<div class="collapse show"></div>')
267
268
269
270
271
272
273
274
275
      .appendTo('#qunit-fixture')
      .on('hide.bs.collapse', function () {
        assert.ok(true, 'hiding a previously-uninitialized shown collapse when the "hide" method is called')
      })
      .bootstrapCollapse('hide')

    setTimeout(done, 0)
  })

276
  QUnit.test('should remove "collapsed" class from active accordion target', function (assert) {
277
    assert.expect(3)
278
    var done = assert.async()
279

XhmikosR's avatar
XhmikosR committed
280
281
282
283
284
    var accordionHTML = '<div id="accordion">' +
        '<div class="card"/>' +
        '<div class="card"/>' +
        '<div class="card"/>' +
        '</div>'
Johann-S's avatar
Johann-S committed
285
    var $groups = $(accordionHTML).appendTo('#qunit-fixture').find('.card')
286

287
    var $target1 = $('<a role="button" data-toggle="collapse" href="#body1" />').appendTo($groups.eq(0))
288

289
    $('<div id="body1" class="show" data-parent="#accordion"/>').appendTo($groups.eq(0))
290

291
    var $target2 = $('<a class="collapsed" data-toggle="collapse" role="button" href="#body2" />').appendTo($groups.eq(1))
292

293
    $('<div id="body2" data-parent="#accordion"/>').appendTo($groups.eq(1))
294

295
    var $target3 = $('<a class="collapsed" data-toggle="collapse" role="button" href="#body3" />').appendTo($groups.eq(2))
296

297
    $('<div id="body3" data-parent="#accordion"/>')
298
      .appendTo($groups.eq(2))
299
      .on('shown.bs.collapse', function () {
300
301
302
        assert.ok($target1.hasClass('collapsed'), 'inactive target 1 does have class "collapsed"')
        assert.ok($target2.hasClass('collapsed'), 'inactive target 2 does have class "collapsed"')
        assert.ok(!$target3.hasClass('collapsed'), 'active target 3 does not have class "collapsed"')
303

304
        done()
305
306
      })

307
    $target3.trigger('click')
XhmikosR's avatar
XhmikosR committed
308
  })
309

310
  QUnit.test('should allow dots in data-parent', function (assert) {
311
    assert.expect(3)
312
    var done = assert.async()
313

XhmikosR's avatar
XhmikosR committed
314
315
316
317
318
    var accordionHTML = '<div class="accordion">' +
        '<div class="card"/>' +
        '<div class="card"/>' +
        '<div class="card"/>' +
        '</div>'
Johann-S's avatar
Johann-S committed
319
    var $groups = $(accordionHTML).appendTo('#qunit-fixture').find('.card')
320

321
    var $target1 = $('<a role="button" data-toggle="collapse" href="#body1"/>').appendTo($groups.eq(0))
322

323
    $('<div id="body1" class="show" data-parent=".accordion"/>').appendTo($groups.eq(0))
324

325
    var $target2 = $('<a class="collapsed" data-toggle="collapse" role="button" href="#body2"/>').appendTo($groups.eq(1))
326

327
    $('<div id="body2" data-parent=".accordion"/>').appendTo($groups.eq(1))
328

329
    var $target3 = $('<a class="collapsed" data-toggle="collapse" role="button" href="#body3"/>').appendTo($groups.eq(2))
330

331
    $('<div id="body3" data-parent=".accordion"/>')
332
      .appendTo($groups.eq(2))
333
      .on('shown.bs.collapse', function () {
334
335
336
        assert.ok($target1.hasClass('collapsed'), 'inactive target 1 does have class "collapsed"')
        assert.ok($target2.hasClass('collapsed'), 'inactive target 2 does have class "collapsed"')
        assert.ok(!$target3.hasClass('collapsed'), 'active target 3 does not have class "collapsed"')
337

338
        done()
339
340
      })

341
    $target3.trigger('click')
XhmikosR's avatar
XhmikosR committed
342
343
  })

344
  QUnit.test('should set aria-expanded="true" on trigger/control when collapse is shown', function (assert) {
345
    assert.expect(1)
346
    var done = assert.async()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
347

348
    var $target = $('<a role="button" data-toggle="collapse" class="collapsed" href="#test1" aria-expanded="false"/>').appendTo('#qunit-fixture')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
349
350
351

    $('<div id="test1"/>')
      .appendTo('#qunit-fixture')
352
      .on('shown.bs.collapse', function () {
353
        assert.strictEqual($target.attr('aria-expanded'), 'true', 'aria-expanded on target is "true"')
354
        done()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
355
356
      })

357
    $target.trigger('click')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
358
359
  })

360
  QUnit.test('should set aria-expanded="false" on trigger/control when collapse is hidden', function (assert) {
361
    assert.expect(1)
362
    var done = assert.async()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
363

364
    var $target = $('<a role="button" data-toggle="collapse" href="#test1" aria-expanded="true"/>').appendTo('#qunit-fixture')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
365

Starsam80's avatar
Starsam80 committed
366
    $('<div id="test1" class="show"/>')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
367
      .appendTo('#qunit-fixture')
368
      .on('hidden.bs.collapse', function () {
369
        assert.strictEqual($target.attr('aria-expanded'), 'false', 'aria-expanded on target is "false"')
370
        done()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
371
372
      })

373
    $target.trigger('click')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
374
375
  })

376
  QUnit.test('should set aria-expanded="true" on all triggers targeting the collapse when the collapse is shown', function (assert) {
377
    assert.expect(2)
378
    var done = assert.async()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
379

380
381
    var $target = $('<a role="button" data-toggle="collapse" class="collapsed" href="#test1" aria-expanded="false"/>').appendTo('#qunit-fixture')
    var $alt = $('<a role="button" data-toggle="collapse" class="collapsed" href="#test1" aria-expanded="false"/>').appendTo('#qunit-fixture')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
382
383
384

    $('<div id="test1"/>')
      .appendTo('#qunit-fixture')
385
      .on('shown.bs.collapse', function () {
386
387
        assert.strictEqual($target.attr('aria-expanded'), 'true', 'aria-expanded on trigger/control is "true"')
        assert.strictEqual($alt.attr('aria-expanded'), 'true', 'aria-expanded on alternative trigger/control is "true"')
388
        done()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
389
390
      })

391
    $target.trigger('click')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
392
393
  })

394
  QUnit.test('should set aria-expanded="false" on all triggers targeting the collapse when the collapse is hidden', function (assert) {
395
    assert.expect(2)
396
    var done = assert.async()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
397

398
399
    var $target = $('<a role="button" data-toggle="collapse" href="#test1" aria-expanded="true"/>').appendTo('#qunit-fixture')
    var $alt = $('<a role="button" data-toggle="collapse" href="#test1" aria-expanded="true"/>').appendTo('#qunit-fixture')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
400

Starsam80's avatar
Starsam80 committed
401
    $('<div id="test1" class="show"/>')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
402
      .appendTo('#qunit-fixture')
403
      .on('hidden.bs.collapse', function () {
404
405
        assert.strictEqual($target.attr('aria-expanded'), 'false', 'aria-expanded on trigger/control is "false"')
        assert.strictEqual($alt.attr('aria-expanded'), 'false', 'aria-expanded on alternative trigger/control is "false"')
406
        done()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
407
408
      })

409
    $target.trigger('click')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
410
411
  })

412
  QUnit.test('should change aria-expanded from active accordion trigger/control to "false" and set the trigger/control for the newly active one to "true"', function (assert) {
413
    assert.expect(3)
414
    var done = assert.async()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
415

XhmikosR's avatar
XhmikosR committed
416
417
418
419
420
    var accordionHTML = '<div id="accordion">' +
        '<div class="card"/>' +
        '<div class="card"/>' +
        '<div class="card"/>' +
        '</div>'
Johann-S's avatar
Johann-S committed
421
    var $groups = $(accordionHTML).appendTo('#qunit-fixture').find('.card')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
422

423
    var $target1 = $('<a role="button" data-toggle="collapse" aria-expanded="true" href="#body1"/>').appendTo($groups.eq(0))
Patrick H. Lauke's avatar
Patrick H. Lauke committed
424

425
    $('<div id="body1" class="show" data-parent="#accordion"/>').appendTo($groups.eq(0))
Patrick H. Lauke's avatar
Patrick H. Lauke committed
426

427
    var $target2 = $('<a role="button" data-toggle="collapse" aria-expanded="false" href="#body2" class="collapsed" aria-expanded="false" />').appendTo($groups.eq(1))
Patrick H. Lauke's avatar
Patrick H. Lauke committed
428

429
    $('<div id="body2" data-parent="#accordion"/>').appendTo($groups.eq(1))
Patrick H. Lauke's avatar
Patrick H. Lauke committed
430

431
    var $target3 = $('<a class="collapsed" data-toggle="collapse" aria-expanded="false" role="button" href="#body3"/>').appendTo($groups.eq(2))
Patrick H. Lauke's avatar
Patrick H. Lauke committed
432

433
    $('<div id="body3" data-parent="#accordion"/>')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
434
      .appendTo($groups.eq(2))
435
      .on('shown.bs.collapse', function () {
436
437
438
        assert.strictEqual($target1.attr('aria-expanded'), 'false', 'inactive trigger/control 1 has aria-expanded="false"')
        assert.strictEqual($target2.attr('aria-expanded'), 'false', 'inactive trigger/control 2 has aria-expanded="false"')
        assert.strictEqual($target3.attr('aria-expanded'), 'true', 'active trigger/control 3 has aria-expanded="true"')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
439

440
        done()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
441
442
      })

443
    $target3.trigger('click')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
444
445
  })

446
  QUnit.test('should not fire show event if show is prevented because other element is still transitioning', function (assert) {
447
    assert.expect(1)
448
    var done = assert.async()
449

XhmikosR's avatar
XhmikosR committed
450
451
452
453
    var accordionHTML = '<div id="accordion">' +
        '<div class="card"/>' +
        '<div class="card"/>' +
        '</div>'
454
    var showFired = false
Johann-S's avatar
Johann-S committed
455
    var $groups   = $(accordionHTML).appendTo('#qunit-fixture').find('.card')
456

457
    var $target1 = $('<a role="button" data-toggle="collapse" href="#body1"/>').appendTo($groups.eq(0))
458

459
    $('<div id="body1" class="collapse" data-parent="#accordion"/>')
460
461
462
463
464
      .appendTo($groups.eq(0))
      .on('show.bs.collapse', function () {
        showFired = true
      })

465
466
    var $target2 = $('<a role="button" data-toggle="collapse" href="#body2"/>').appendTo($groups.eq(1))
    var $body2   = $('<div id="body2" class="collapse" data-parent="#accordion"/>').appendTo($groups.eq(1))
467

468
    $target2.trigger('click')
469
470

    $body2
Starsam80's avatar
Starsam80 committed
471
      .toggleClass('show collapsing')
fat's avatar
fat committed
472
      .data('bs.collapse')._isTransitioning = 1
473

474
    $target1.trigger('click')
475
476

    setTimeout(function () {
477
      assert.ok(!showFired, 'show event did not fire')
478
      done()
479
480
481
    }, 1)
  })

482
  QUnit.test('should add "collapsed" class to target when collapse is hidden via manual invocation', function (assert) {
483
    assert.expect(1)
484
    var done = assert.async()
485

486
    var $target = $('<a role="button" data-toggle="collapse" href="#test1"/>').appendTo('#qunit-fixture')
487

Starsam80's avatar
Starsam80 committed
488
    $('<div id="test1" class="show"/>')
489
490
      .appendTo('#qunit-fixture')
      .on('hidden.bs.collapse', function () {
491
        assert.ok($target.hasClass('collapsed'))
492
        done()
493
494
495
496
      })
      .bootstrapCollapse('hide')
  })

497
  QUnit.test('should remove "collapsed" class from target when collapse is shown via manual invocation', function (assert) {
498
    assert.expect(1)
499
    var done = assert.async()
500

501
    var $target = $('<a role="button" data-toggle="collapse" class="collapsed" href="#test1"/>').appendTo('#qunit-fixture')
502
503
504
505

    $('<div id="test1"/>')
      .appendTo('#qunit-fixture')
      .on('shown.bs.collapse', function () {
506
        assert.ok(!$target.hasClass('collapsed'))
507
        done()
508
509
510
511
      })
      .bootstrapCollapse('show')
  })

Johann-S's avatar
Johann-S committed
512
  QUnit.test('should allow accordion to use children other than card', function (assert) {
513
    assert.expect(4)
Johann-S's avatar
Johann-S committed
514
    var done = assert.async()
XhmikosR's avatar
XhmikosR committed
515
516
517
518
519
520
521
522
523
524
    var accordionHTML = '<div id="accordion">' +
        '<div class="item">' +
        '<a id="linkTrigger" data-toggle="collapse" href="#collapseOne" aria-expanded="false" aria-controls="collapseOne"></a>' +
        '<div id="collapseOne" class="collapse" role="tabpanel" aria-labelledby="headingThree" data-parent="#accordion"></div>' +
        '</div>' +
        '<div class="item">' +
        '<a id="linkTriggerTwo" data-toggle="collapse" href="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo"></a>' +
        '<div id="collapseTwo" class="collapse show" role="tabpanel" aria-labelledby="headingTwo" data-parent="#accordion"></div>' +
        '</div>' +
        '</div>'
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546

    $(accordionHTML).appendTo('#qunit-fixture')
    var $trigger = $('#linkTrigger')
    var $triggerTwo = $('#linkTriggerTwo')
    var $collapseOne = $('#collapseOne')
    var $collapseTwo = $('#collapseTwo')
    $collapseOne.on('shown.bs.collapse', function () {
      assert.ok($collapseOne.hasClass('show'), '#collapseOne is shown')
      assert.ok(!$collapseTwo.hasClass('show'), '#collapseTwo is not shown')
      $collapseTwo.on('shown.bs.collapse', function () {
        assert.ok(!$collapseOne.hasClass('show'), '#collapseOne is not shown')
        assert.ok($collapseTwo.hasClass('show'), '#collapseTwo is shown')
        done()
      })
      $triggerTwo.trigger($.Event('click'))
    })
    $trigger.trigger($.Event('click'))
  })

  QUnit.test('should allow accordion to contain nested elements', function (assert) {
    assert.expect(4)
    var done = assert.async()
XhmikosR's avatar
XhmikosR committed
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
    var accordionHTML = '<div id="accordion">' +
        '<div class="row">' +
        '<div class="col-lg-6">' +
        '<div class="item">' +
        '<a id="linkTrigger" data-toggle="collapse" href="#collapseOne" aria-expanded="false" aria-controls="collapseOne"></a>' +
        '<div id="collapseOne" class="collapse" role="tabpanel" aria-labelledby="headingThree" data-parent="#accordion"></div>' +
        '</div>' +
        '</div>' +
        '<div class="col-lg-6">' +
        '<div class="item">' +
        '<a id="linkTriggerTwo" data-toggle="collapse" href="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo"></a>' +
        '<div id="collapseTwo" class="collapse show" role="tabpanel" aria-labelledby="headingTwo" data-parent="#accordion"></div>' +
        '</div>' +
        '</div>' +
        '</div>' +
        '</div>'
Johann-S's avatar
Johann-S committed
563
564

    $(accordionHTML).appendTo('#qunit-fixture')
565
566
567
568
569
570
571
572
573
574
575
576
577
    var $trigger = $('#linkTrigger')
    var $triggerTwo = $('#linkTriggerTwo')
    var $collapseOne = $('#collapseOne')
    var $collapseTwo = $('#collapseTwo')
    $collapseOne.on('shown.bs.collapse', function () {
      assert.ok($collapseOne.hasClass('show'), '#collapseOne is shown')
      assert.ok(!$collapseTwo.hasClass('show'), '#collapseTwo is not shown')
      $collapseTwo.on('shown.bs.collapse', function () {
        assert.ok(!$collapseOne.hasClass('show'), '#collapseOne is not shown')
        assert.ok($collapseTwo.hasClass('show'), '#collapseTwo is shown')
        done()
      })
      $triggerTwo.trigger($.Event('click'))
Johann-S's avatar
Johann-S committed
578
    })
579
580
581
    $trigger.trigger($.Event('click'))
  })

582
583
584
  QUnit.test('should allow accordion to target multiple elements', function (assert) {
    assert.expect(8)
    var done = assert.async()
XhmikosR's avatar
XhmikosR committed
585
586
587
588
589
590
591
592
    var accordionHTML = '<div id="accordion">' +
      '<a id="linkTriggerOne" data-toggle="collapse" data-target=".collapseOne" href="#" aria-expanded="false" aria-controls="collapseOne"></a>' +
      '<a id="linkTriggerTwo" data-toggle="collapse" data-target=".collapseTwo" href="#" aria-expanded="false" aria-controls="collapseTwo"></a>' +
      '<div id="collapseOneOne" class="collapse collapseOne" role="tabpanel" data-parent="#accordion"></div>' +
      '<div id="collapseOneTwo" class="collapse collapseOne" role="tabpanel" data-parent="#accordion"></div>' +
      '<div id="collapseTwoOne" class="collapse collapseTwo" role="tabpanel" data-parent="#accordion"></div>' +
      '<div id="collapseTwoTwo" class="collapse collapseTwo" role="tabpanel" data-parent="#accordion"></div>' +
      '</div>'
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656

    $(accordionHTML).appendTo('#qunit-fixture')
    var $trigger = $('#linkTriggerOne')
    var $triggerTwo = $('#linkTriggerTwo')
    var $collapseOneOne = $('#collapseOneOne')
    var $collapseOneTwo = $('#collapseOneTwo')
    var $collapseTwoOne = $('#collapseTwoOne')
    var $collapseTwoTwo = $('#collapseTwoTwo')
    var collapsedElements = {
      one : false,
      two : false
    }

    function firstTest() {
      assert.ok($collapseOneOne.hasClass('show'), '#collapseOneOne is shown')
      assert.ok($collapseOneTwo.hasClass('show'), '#collapseOneTwo is shown')
      assert.ok(!$collapseTwoOne.hasClass('show'), '#collapseTwoOne is not shown')
      assert.ok(!$collapseTwoTwo.hasClass('show'), '#collapseTwoTwo is not shown')
      $triggerTwo.trigger($.Event('click'))
    }

    function secondTest() {
      assert.ok(!$collapseOneOne.hasClass('show'), '#collapseOneOne is not shown')
      assert.ok(!$collapseOneTwo.hasClass('show'), '#collapseOneTwo is not shown')
      assert.ok($collapseTwoOne.hasClass('show'), '#collapseTwoOne is shown')
      assert.ok($collapseTwoTwo.hasClass('show'), '#collapseTwoTwo is shown')
      done()
    }

    $collapseOneOne.on('shown.bs.collapse', function () {
      if (collapsedElements.one) {
        firstTest()
      } else {
        collapsedElements.one = true
      }
    })

    $collapseOneTwo.on('shown.bs.collapse', function () {
      if (collapsedElements.one) {
        firstTest()
      } else {
        collapsedElements.one = true
      }
    })

    $collapseTwoOne.on('shown.bs.collapse', function () {
      if (collapsedElements.two) {
        secondTest()
      } else {
        collapsedElements.two = true
      }
    })

    $collapseTwoTwo.on('shown.bs.collapse', function () {
      if (collapsedElements.two) {
        secondTest()
      } else {
        collapsedElements.two = true
      }
    })

    $trigger.trigger($.Event('click'))
  })

657
658
659
  QUnit.test('should collapse accordion children but not nested accordion children', function (assert) {
    assert.expect(9)
    var done = assert.async()
XhmikosR's avatar
XhmikosR committed
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
    $('<div id="accordion">' +
        '<div class="item">' +
        '<a id="linkTrigger" data-toggle="collapse" href="#collapseOne" aria-expanded="false" aria-controls="collapseOne"></a>' +
        '<div id="collapseOne" data-parent="#accordion" class="collapse" role="tabpanel" aria-labelledby="headingThree">' +
        '<div id="nestedAccordion">' +
        '<div class="item">' +
        '<a id="nestedLinkTrigger" data-toggle="collapse" href="#nestedCollapseOne" aria-expanded="false" aria-controls="nestedCollapseOne"></a>' +
        '<div id="nestedCollapseOne" data-parent="#nestedAccordion" class="collapse" role="tabpanel" aria-labelledby="headingThree">' +
        '</div>' +
        '</div>' +
        '</div>' +
        '</div>' +
        '</div>' +
        '<div class="item">' +
        '<a id="linkTriggerTwo" data-toggle="collapse" href="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo"></a>' +
        '<div id="collapseTwo" data-parent="#accordion" class="collapse show" role="tabpanel" aria-labelledby="headingTwo"></div>' +
        '</div>' +
        '</div>').appendTo('#qunit-fixture')
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
    var $trigger = $('#linkTrigger')
    var $triggerTwo = $('#linkTriggerTwo')
    var $nestedTrigger = $('#nestedLinkTrigger')
    var $collapseOne = $('#collapseOne')
    var $collapseTwo = $('#collapseTwo')
    var $nestedCollapseOne = $('#nestedCollapseOne')

    $collapseOne.one('shown.bs.collapse', function () {
      assert.ok($collapseOne.hasClass('show'), '#collapseOne is shown')
      assert.ok(!$collapseTwo.hasClass('show'), '#collapseTwo is not shown')
      assert.ok(!$('#nestedCollapseOne').hasClass('show'), '#nestedCollapseOne is not shown')
      $nestedCollapseOne.one('shown.bs.collapse', function () {
        assert.ok($collapseOne.hasClass('show'), '#collapseOne is shown')
        assert.ok(!$collapseTwo.hasClass('show'), '#collapseTwo is not shown')
        assert.ok($nestedCollapseOne.hasClass('show'), '#nestedCollapseOne is shown')
        $collapseTwo.one('shown.bs.collapse', function () {
          assert.ok(!$collapseOne.hasClass('show'), '#collapseOne is not shown')
          assert.ok($collapseTwo.hasClass('show'), '#collapseTwo is shown')
          assert.ok($nestedCollapseOne.hasClass('show'), '#nestedCollapseOne is shown')
          done()
        })
        $triggerTwo.trigger($.Event('click'))
      })
      $nestedTrigger.trigger($.Event('click'))
    })
    $trigger.trigger($.Event('click'))
Johann-S's avatar
Johann-S committed
704
  })
705
706

  QUnit.test('should not prevent event for input', function (assert) {
707
    assert.expect(3)
708
709
710
711
712
713
    var done = assert.async()
    var $target = $('<input type="checkbox" data-toggle="collapse" data-target="#collapsediv1" />').appendTo('#qunit-fixture')

    $('<div id="collapsediv1"/>')
      .appendTo('#qunit-fixture')
      .on('shown.bs.collapse', function () {
714
        assert.ok($(this).hasClass('show'))
715
716
717
718
719
720
721
        assert.ok($target.attr('aria-expanded') === 'true')
        assert.ok($target.prop('checked'))
        done()
      })

    $target.trigger($.Event('click'))
  })
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754

  QUnit.test('should add "collapsed" class to triggers only when all the targeted collapse are hidden', function (assert) {
    assert.expect(9)
    var done = assert.async()

    var $trigger1 = $('<a role="button" data-toggle="collapse" href="#test1"/>').appendTo('#qunit-fixture')
    var $trigger2 = $('<a role="button" data-toggle="collapse" href="#test2"/>').appendTo('#qunit-fixture')
    var $trigger3 = $('<a role="button" data-toggle="collapse" href=".multi"/>').appendTo('#qunit-fixture')

    var $target1 = $('<div id="test1" class="multi"/>').appendTo('#qunit-fixture')
    var $target2 = $('<div id="test2" class="multi"/>').appendTo('#qunit-fixture')

    $target2.one('shown.bs.collapse', function () {
      assert.ok(!$trigger1.hasClass('collapsed'), 'trigger1 does not have collapsed class')
      assert.ok(!$trigger2.hasClass('collapsed'), 'trigger2 does not have collapsed class')
      assert.ok(!$trigger3.hasClass('collapsed'), 'trigger3 does not have collapsed class')
      $target2.one('hidden.bs.collapse', function () {
        assert.ok(!$trigger1.hasClass('collapsed'), 'trigger1 does not have collapsed class')
        assert.ok($trigger2.hasClass('collapsed'), 'trigger2 has collapsed class')
        assert.ok(!$trigger3.hasClass('collapsed'), 'trigger3 does not have collapsed class')
        $target1.one('hidden.bs.collapse', function () {
          assert.ok($trigger1.hasClass('collapsed'), 'trigger1 has collapsed class')
          assert.ok($trigger2.hasClass('collapsed'), 'trigger2 has collapsed class')
          assert.ok($trigger3.hasClass('collapsed'), 'trigger3 has collapsed class')
          done()
        })
        $trigger1.trigger('click')
      })
      $trigger2.trigger('click')
    })
    $trigger3.trigger('click')
  })

755
  QUnit.test('should set aria-expanded="true" to triggers targeting shown collaspe and aria-expanded="false" only when all the targeted collapses are shown', function (assert) {
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
    assert.expect(9)
    var done = assert.async()

    var $trigger1 = $('<a role="button" data-toggle="collapse" href="#test1"/>').appendTo('#qunit-fixture')
    var $trigger2 = $('<a role="button" data-toggle="collapse" href="#test2"/>').appendTo('#qunit-fixture')
    var $trigger3 = $('<a role="button" data-toggle="collapse" href=".multi"/>').appendTo('#qunit-fixture')

    var $target1 = $('<div id="test1" class="multi collapse"/>').appendTo('#qunit-fixture')
    var $target2 = $('<div id="test2" class="multi collapse"/>').appendTo('#qunit-fixture')

    $target2.one('shown.bs.collapse', function () {
      assert.strictEqual($trigger1.attr('aria-expanded'), 'true', 'aria-expanded on trigger1 is "true"')
      assert.strictEqual($trigger2.attr('aria-expanded'), 'true', 'aria-expanded on trigger2 is "true"')
      assert.strictEqual($trigger3.attr('aria-expanded'), 'true', 'aria-expanded on trigger3 is "true"')
      $target2.one('hidden.bs.collapse', function () {
        assert.strictEqual($trigger1.attr('aria-expanded'), 'true', 'aria-expanded on trigger1 is "true"')
        assert.strictEqual($trigger2.attr('aria-expanded'), 'false', 'aria-expanded on trigger2 is "false"')
        assert.strictEqual($trigger3.attr('aria-expanded'), 'true', 'aria-expanded on trigger3 is "true"')
        $target1.one('hidden.bs.collapse', function () {
          assert.strictEqual($trigger1.attr('aria-expanded'), 'false', 'aria-expanded on trigger1 is "fasle"')
          assert.strictEqual($trigger2.attr('aria-expanded'), 'false', 'aria-expanded on trigger2 is "false"')
          assert.strictEqual($trigger3.attr('aria-expanded'), 'false', 'aria-expanded on trigger3 is "false"')
          done()
        })
        $trigger1.trigger('click')
      })
      $trigger2.trigger('click')
    })
    $trigger3.trigger('click')
  })
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810

  QUnit.test('should not prevent interactions inside the collapse element', function (assert) {
    assert.expect(2)
    var done = assert.async()

    var $target = $('<input type="checkbox" data-toggle="collapse" data-target="#collapsediv1" />').appendTo('#qunit-fixture')
    var htmlCollapse =
      '<div id="collapsediv1" class="collapse">' +
      ' <input type="checkbox" id="testCheckbox" />' +
      '</div>'

    $(htmlCollapse)
      .appendTo('#qunit-fixture')
      .on('shown.bs.collapse', function () {
        assert.ok($target.prop('checked'), '$trigger is checked')
        var $testCheckbox = $('#testCheckbox')
        $testCheckbox.trigger($.Event('click'))
        setTimeout(function () {
          assert.ok($testCheckbox.prop('checked'), '$testCheckbox is checked too')
          done()
        }, 5)
      })

    $target.trigger($.Event('click'))
  })
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827

  QUnit.test('should allow jquery object in parent config', function (assert) {
    assert.expect(1)
    var html =
    '<div class="my-collapse">' +
    '  <div class="item">' +
    '    <a data-toggle="collapse" href="#">Toggle item</a>' +
    '    <div class="collapse">Lorem ipsum</div>' +
    '  </div>' +
    '</div>'

    $(html).appendTo('#qunit-fixture')
    try {
      $('[data-toggle="collapse"]').bootstrapCollapse({
        parent: $('.my-collapse')
      })
      assert.ok(true, 'collapse correctly created')
XhmikosR's avatar
XhmikosR committed
828
    } catch (err) {
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
      assert.ok(false, 'collapse not created')
    }
  })

  QUnit.test('should allow DOM object in parent config', function (assert) {
    assert.expect(1)
    var html =
    '<div class="my-collapse">' +
    '  <div class="item">' +
    '    <a data-toggle="collapse" href="#">Toggle item</a>' +
    '    <div class="collapse">Lorem ipsum</div>' +
    '  </div>' +
    '</div>'

    $(html).appendTo('#qunit-fixture')
    try {
      $('[data-toggle="collapse"]').bootstrapCollapse({
        parent: $('.my-collapse')[0]
      })
      assert.ok(true, 'collapse correctly created')
XhmikosR's avatar
XhmikosR committed
849
    } catch (err) {
850
851
852
      assert.ok(false, 'collapse not created')
    }
  })
Heinrich Fenkart's avatar
Heinrich Fenkart committed
853
})