collapse.js 28.8 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
33
34
35
36
37
38
  QUnit.test('should throw explicit error on undefined method', function (assert) {
    assert.expect(1)
    var $el = $('<div/>')
    $el.bootstrapCollapse()
    try {
      $el.bootstrapCollapse('noMethod')
    }
    catch (err) {
      assert.strictEqual(err.message, 'No method named "noMethod"')
    }
  })

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

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

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

55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73

  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')
  })

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

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

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

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

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

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

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

137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
  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')
  })

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

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

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

165
    $target.trigger('click')
XhmikosR's avatar
XhmikosR committed
166
  })
167

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

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

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

181
    $target.trigger('click')
XhmikosR's avatar
XhmikosR committed
182
  })
183

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

188
189
    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')
190
191
192
193
194
195
196
197
198

    $('<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()
      })

199
    $target.trigger('click')
200
201
202
  })

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

206
207
    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')
208

Starsam80's avatar
Starsam80 committed
209
    $('<div id="test1" class="show"/>')
210
211
212
213
      .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')
214
        done()
215
216
      })

217
    $target.trigger('click')
XhmikosR's avatar
XhmikosR committed
218
  })
219

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

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

    $test.bootstrapCollapse('show')

232
    setTimeout(done, 0)
233
234
  })

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

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

    $test.bootstrapCollapse('show')

247
    setTimeout(done, 0)
248
249
  })

250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
  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
268
    $('<div class="collapse show"></div>')
269
270
271
272
273
274
275
276
277
      .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)
  })

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

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

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

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

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

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

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

299
    $('<div id="body3" data-parent="#accordion"/>')
300
      .appendTo($groups.eq(2))
301
      .on('shown.bs.collapse', function () {
302
303
304
        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"')
305

306
        done()
307
308
      })

309
    $target3.trigger('click')
XhmikosR's avatar
XhmikosR committed
310
  })
311

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

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

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

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

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

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

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

333
    $('<div id="body3" data-parent=".accordion"/>')
334
      .appendTo($groups.eq(2))
335
      .on('shown.bs.collapse', function () {
336
337
338
        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"')
339

340
        done()
341
342
      })

343
    $target3.trigger('click')
XhmikosR's avatar
XhmikosR committed
344
345
  })

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

350
    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
351
352
353

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

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

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

366
    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
367

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

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

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

382
383
    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
384
385
386

    $('<div id="test1"/>')
      .appendTo('#qunit-fixture')
387
      .on('shown.bs.collapse', function () {
388
389
        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"')
390
        done()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
391
392
      })

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

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

400
401
    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
402

Starsam80's avatar
Starsam80 committed
403
    $('<div id="test1" class="show"/>')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
404
      .appendTo('#qunit-fixture')
405
      .on('hidden.bs.collapse', function () {
406
407
        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"')
408
        done()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
409
410
      })

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

414
  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) {
415
    assert.expect(3)
416
    var done = assert.async()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
417

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

425
    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
426

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

429
    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
430

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

433
    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
434

435
    $('<div id="body3" data-parent="#accordion"/>')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
436
      .appendTo($groups.eq(2))
437
      .on('shown.bs.collapse', function () {
438
439
440
        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
441

442
        done()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
443
444
      })

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

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

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

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

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

467
468
    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))
469

470
    $target2.trigger('click')
471
472

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

476
    $target1.trigger('click')
477
478

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

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

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

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

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

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

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

Johann-S's avatar
Johann-S committed
514
  QUnit.test('should allow accordion to use children other than card', function (assert) {
515
    assert.expect(4)
Johann-S's avatar
Johann-S committed
516
    var done = assert.async()
517
    var accordionHTML = '<div id="accordion">'
Johann-S's avatar
Johann-S committed
518
519
520
521
522
        + '<div class="item">'
        + '<a id="linkTrigger" data-parent="#accordion" data-toggle="collapse" href="#collapseOne" aria-expanded="false" aria-controls="collapseOne"></a>'
        + '<div id="collapseOne" class="collapse" role="tabpanel" aria-labelledby="headingThree"></div>'
        + '</div>'
        + '<div class="item">'
523
        + '<a id="linkTriggerTwo" data-toggle="collapse" data-parent="#accordion" href="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo"></a>'
Johann-S's avatar
Johann-S committed
524
525
526
527
528
        + '<div id="collapseTwo" class="collapse show" role="tabpanel" aria-labelledby="headingTwo"></div>'
        + '</div>'
        + '</div>'

    $(accordionHTML).appendTo('#qunit-fixture')
529
530
531
532
533
534
535
536
537
538
539
540
541
    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
542
    })
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
    $trigger.trigger($.Event('click'))
  })

  QUnit.test('should collapse accordion children but not nested accordion children', function (assert) {
    assert.expect(9)
    var done = assert.async()
    $('<div id="accordion">'
        + '<div class="item">'
        + '<a id="linkTrigger" data-parent="#accordion" data-toggle="collapse" href="#collapseOne" aria-expanded="false" aria-controls="collapseOne"></a>'
        + '<div id="collapseOne" class="collapse" role="tabpanel" aria-labelledby="headingThree">'
        + '<div id="nestedAccordion">'
        + '<div class="item">'
        + '<a id="nestedLinkTrigger" data-parent="#nestedAccordion" data-toggle="collapse" href="#nestedCollapseOne" aria-expanded="false" aria-controls="nestedCollapseOne"></a>'
        + '<div id="nestedCollapseOne" class="collapse" role="tabpanel" aria-labelledby="headingThree">'
        + '</div>'
        + '</div>'
        + '</div>'
        + '</div>'
        + '</div>'
        + '<div class="item">'
        + '<a id="linkTriggerTwo" data-toggle="collapse" data-parent="#accordion" href="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo"></a>'
        + '<div id="collapseTwo" class="collapse show" role="tabpanel" aria-labelledby="headingTwo"></div>'
        + '</div>'
        + '</div>').appendTo('#qunit-fixture')
    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
594
  })
595
596

  QUnit.test('should not prevent event for input', function (assert) {
597
    assert.expect(3)
598
599
600
601
602
603
    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 () {
604
        assert.ok($(this).hasClass('show'))
605
606
607
608
609
610
611
        assert.ok($target.attr('aria-expanded') === 'true')
        assert.ok($target.prop('checked'))
        done()
      })

    $target.trigger($.Event('click'))
  })
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

  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')
  })

645
  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) {
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
    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')
  })
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700

  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'))
  })
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744

  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')
    }
    catch (e) {
      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')
    }
    catch (e) {
      assert.ok(false, 'collapse not created')
    }
  })
Heinrich Fenkart's avatar
Heinrich Fenkart committed
745
})