collapse.js 16.6 KB
Newer Older
1
$(function () {
XhmikosR's avatar
XhmikosR committed
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)
24
    assert.strictEqual($.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')

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

55
  QUnit.test('should hide a collapsed element', function (assert) {
56
    assert.expect(1)
57
58
    var $el = $('<div class="collapse"/>').bootstrapCollapse('hide')

59
    assert.ok(!$el.hasClass('in'), 'does not have class "in"')
XhmikosR's avatar
XhmikosR committed
60
61
  })

62
  QUnit.test('should not fire shown when show is prevented', function (assert) {
63
    assert.expect(1)
64
    var done = assert.async()
65

XhmikosR's avatar
XhmikosR committed
66
67
    $('<div class="collapse"/>')
      .on('show.bs.collapse', function (e) {
68
        e.preventDefault()
69
        assert.ok(true, 'show event fired')
70
        done()
71
      })
XhmikosR's avatar
XhmikosR committed
72
      .on('shown.bs.collapse', function () {
73
        assert.ok(false, 'shown event fired')
74
      })
75
      .bootstrapCollapse('show')
XhmikosR's avatar
XhmikosR committed
76
77
  })

78
  QUnit.test('should reset style to auto after finishing opening collapse', function (assert) {
79
    assert.expect(2)
80
    var done = assert.async()
81

XhmikosR's avatar
XhmikosR committed
82
83
    $('<div class="collapse" style="height: 0px"/>')
      .on('show.bs.collapse', function () {
84
        assert.strictEqual(this.style.height, '0px', 'height is 0px')
85
      })
XhmikosR's avatar
XhmikosR committed
86
      .on('shown.bs.collapse', function () {
87
        assert.strictEqual(this.style.height, '', 'height is auto')
88
        done()
89
      })
90
      .bootstrapCollapse('show')
XhmikosR's avatar
XhmikosR committed
91
  })
92

93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
  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')
  })

108
  QUnit.test('should remove "collapsed" class from target when collapse is shown', function (assert) {
109
    assert.expect(1)
110
    var done = assert.async()
111

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

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

121
    $target.trigger('click')
XhmikosR's avatar
XhmikosR committed
122
  })
123

124
  QUnit.test('should add "collapsed" class to target when collapse is hidden', function (assert) {
125
    assert.expect(1)
126
    var done = assert.async()
127

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

130
131
    $('<div id="test1" class="in"/>')
      .appendTo('#qunit-fixture')
132
      .on('hidden.bs.collapse', function () {
133
        assert.ok($target.hasClass('collapsed'), 'target has collapsed class')
134
        done()
135
136
      })

137
    $target.trigger('click')
XhmikosR's avatar
XhmikosR committed
138
  })
139

140
  QUnit.test('should remove "collapsed" class from all triggers targeting the collapse when the collapse is shown', function (assert) {
141
    assert.expect(2)
142
    var done = assert.async()
143

144
145
    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')
146
147
148
149
150
151
152
153
154

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

155
    $target.trigger('click')
156
157
158
  })

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

162
163
    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')
164
165
166
167
168
169

    $('<div id="test1" class="in"/>')
      .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')
170
        done()
171
172
      })

173
    $target.trigger('click')
XhmikosR's avatar
XhmikosR committed
174
  })
175

176
  QUnit.test('should not close a collapse when initialized with "show" option if already shown', function (assert) {
177
    assert.expect(0)
178
    var done = assert.async()
179
180
181
182

    var $test = $('<div id="test1" class="in"/>')
      .appendTo('#qunit-fixture')
      .on('hide.bs.collapse', function () {
183
        assert.ok(false)
184
185
186
187
      })

    $test.bootstrapCollapse('show')

188
    setTimeout(done, 0)
189
190
  })

191
  QUnit.test('should open a collapse when initialized with "show" option if not already shown', function (assert) {
192
    assert.expect(1)
193
    var done = assert.async()
194
195
196
197

    var $test = $('<div id="test1" />')
      .appendTo('#qunit-fixture')
      .on('show.bs.collapse', function () {
198
        assert.ok(true)
199
200
201
202
      })

    $test.bootstrapCollapse('show')

203
    setTimeout(done, 0)
204
205
  })

206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
  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()

    $('<div class="collapse in"></div>')
      .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)
  })

234
  QUnit.test('should remove "collapsed" class from active accordion target', function (assert) {
235
    assert.expect(3)
236
    var done = assert.async()
237

238
239
240
241
    var accordionHTML = '<div class="panel-group" id="accordion">'
        + '<div class="panel"/>'
        + '<div class="panel"/>'
        + '<div class="panel"/>'
Heinrich Fenkart's avatar
Heinrich Fenkart committed
242
        + '</div>'
243
    var $groups = $(accordionHTML).appendTo('#qunit-fixture').find('.panel')
244

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

247
    $('<div id="body1" class="in"/>').appendTo($groups.eq(0))
248

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

251
    $('<div id="body2"/>').appendTo($groups.eq(1))
252

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

255
256
    $('<div id="body3"/>')
      .appendTo($groups.eq(2))
257
      .on('shown.bs.collapse', function () {
258
259
260
        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"')
261

262
        done()
263
264
      })

265
    $target3.trigger('click')
XhmikosR's avatar
XhmikosR committed
266
  })
267

268
  QUnit.test('should allow dots in data-parent', function (assert) {
269
    assert.expect(3)
270
    var done = assert.async()
271

272
273
274
275
    var accordionHTML = '<div class="panel-group accordion">'
        + '<div class="panel"/>'
        + '<div class="panel"/>'
        + '<div class="panel"/>'
Heinrich Fenkart's avatar
Heinrich Fenkart committed
276
        + '</div>'
277
    var $groups = $(accordionHTML).appendTo('#qunit-fixture').find('.panel')
278

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

281
    $('<div id="body1" class="in"/>').appendTo($groups.eq(0))
282

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

285
    $('<div id="body2"/>').appendTo($groups.eq(1))
286

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

289
290
    $('<div id="body3"/>')
      .appendTo($groups.eq(2))
291
      .on('shown.bs.collapse', function () {
292
293
294
        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"')
295

296
        done()
297
298
      })

299
    $target3.trigger('click')
XhmikosR's avatar
XhmikosR committed
300
301
  })

302
  QUnit.test('should set aria-expanded="true" on target when collapse is shown', function (assert) {
303
    assert.expect(1)
304
    var done = assert.async()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
305

306
    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
307
308
309

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

315
    $target.trigger('click')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
316
317
  })

318
  QUnit.test('should set aria-expanded="false" on target when collapse is hidden', function (assert) {
319
    assert.expect(1)
320
    var done = assert.async()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
321

322
    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
323
324
325

    $('<div id="test1" class="in"/>')
      .appendTo('#qunit-fixture')
326
      .on('hidden.bs.collapse', function () {
327
        assert.strictEqual($target.attr('aria-expanded'), 'false', 'aria-expanded on target is "false"')
328
        done()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
329
330
      })

331
    $target.trigger('click')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
332
333
  })

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

338
339
    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
340
341
342

    $('<div id="test1"/>')
      .appendTo('#qunit-fixture')
343
      .on('shown.bs.collapse', function () {
344
345
        assert.strictEqual($target.attr('aria-expanded'), 'true', 'aria-expanded on target is "true"')
        assert.strictEqual($alt.attr('aria-expanded'), 'true', 'aria-expanded on alt is "true"')
346
        done()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
347
348
      })

349
    $target.trigger('click')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
350
351
  })

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

356
357
    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
358
359
360

    $('<div id="test1" class="in"/>')
      .appendTo('#qunit-fixture')
361
      .on('hidden.bs.collapse', function () {
362
363
        assert.strictEqual($target.attr('aria-expanded'), 'false', 'aria-expanded on target is "false"')
        assert.strictEqual($alt.attr('aria-expanded'), 'false', 'aria-expanded on alt is "false"')
364
        done()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
365
366
      })

367
    $target.trigger('click')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
368
369
  })

370
  QUnit.test('should change aria-expanded from active accordion target to "false" and set the newly active one to "true"', function (assert) {
371
    assert.expect(3)
372
    var done = assert.async()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
373

374
375
376
377
    var accordionHTML = '<div class="panel-group" id="accordion">'
        + '<div class="panel"/>'
        + '<div class="panel"/>'
        + '<div class="panel"/>'
Patrick H. Lauke's avatar
Patrick H. Lauke committed
378
        + '</div>'
379
    var $groups = $(accordionHTML).appendTo('#qunit-fixture').find('.panel')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
380

381
    var $target1 = $('<a role="button" data-toggle="collapse" href="#body1" data-parent="#accordion"/>').appendTo($groups.eq(0))
Patrick H. Lauke's avatar
Patrick H. Lauke committed
382
383
384

    $('<div id="body1" aria-expanded="true" class="in"/>').appendTo($groups.eq(0))

fat's avatar
fat committed
385
    var $target2 = $('<a role="button" data-toggle="collapse" href="#body2" data-parent="#accordion" class="collapsed" />').appendTo($groups.eq(1))
Patrick H. Lauke's avatar
Patrick H. Lauke committed
386
387
388

    $('<div id="body2" aria-expanded="false"/>').appendTo($groups.eq(1))

389
    var $target3 = $('<a class="collapsed" data-toggle="collapse" role="button" href="#body3" data-parent="#accordion"/>').appendTo($groups.eq(2))
Patrick H. Lauke's avatar
Patrick H. Lauke committed
390
391
392

    $('<div id="body3" aria-expanded="false"/>')
      .appendTo($groups.eq(2))
393
      .on('shown.bs.collapse', function () {
394
395
396
        assert.strictEqual($target1.attr('aria-expanded'), 'false', 'inactive target 1 has aria-expanded="false"')
        assert.strictEqual($target2.attr('aria-expanded'), 'false', 'inactive target 2 has aria-expanded="false"')
        assert.strictEqual($target3.attr('aria-expanded'), 'true', 'active target 3 has aria-expanded="false"')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
397

398
        done()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
399
400
      })

401
    $target3.trigger('click')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
402
403
  })

404
  QUnit.test('should not fire show event if show is prevented because other element is still transitioning', function (assert) {
405
    assert.expect(1)
406
    var done = assert.async()
407
408
409
410
411
412
413
414

    var accordionHTML = '<div id="accordion">'
        + '<div class="panel"/>'
        + '<div class="panel"/>'
        + '</div>'
    var showFired = false
    var $groups   = $(accordionHTML).appendTo('#qunit-fixture').find('.panel')

415
    var $target1 = $('<a role="button" data-toggle="collapse" href="#body1" data-parent="#accordion"/>').appendTo($groups.eq(0))
416
417
418
419
420
421
422

    $('<div id="body1" class="collapse"/>')
      .appendTo($groups.eq(0))
      .on('show.bs.collapse', function () {
        showFired = true
      })

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

426
    $target2.trigger('click')
427
428
429

    $body2
      .toggleClass('in collapsing')
fat's avatar
fat committed
430
      .data('bs.collapse')._isTransitioning = 1
431

432
    $target1.trigger('click')
433
434

    setTimeout(function () {
435
      assert.ok(!showFired, 'show event did not fire')
436
      done()
437
438
439
    }, 1)
  })

440
  QUnit.test('should add "collapsed" class to target when collapse is hidden via manual invocation', function (assert) {
441
    assert.expect(1)
442
    var done = assert.async()
443

444
    var $target = $('<a role="button" data-toggle="collapse" href="#test1"/>').appendTo('#qunit-fixture')
445
446
447
448

    $('<div id="test1" class="in"/>')
      .appendTo('#qunit-fixture')
      .on('hidden.bs.collapse', function () {
449
        assert.ok($target.hasClass('collapsed'))
450
        done()
451
452
453
454
      })
      .bootstrapCollapse('hide')
  })

455
  QUnit.test('should remove "collapsed" class from target when collapse is shown via manual invocation', function (assert) {
456
    assert.expect(1)
457
    var done = assert.async()
458

459
    var $target = $('<a role="button" data-toggle="collapse" class="collapsed" href="#test1"/>').appendTo('#qunit-fixture')
460
461
462
463

    $('<div id="test1"/>')
      .appendTo('#qunit-fixture')
      .on('shown.bs.collapse', function () {
464
        assert.ok(!$target.hasClass('collapsed'))
465
        done()
466
467
468
469
      })
      .bootstrapCollapse('show')
  })

Heinrich Fenkart's avatar
Heinrich Fenkart committed
470
})