collapse.js 15.9 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
  QUnit.test('should return jquery collection containing the element', function (assert) {
28
    assert.expect(2)
29
30
    var $el = $('<div/>')
    var $collapse = $el.bootstrapCollapse()
31
32
    assert.ok($collapse instanceof $, 'returns jquery collection')
    assert.strictEqual($collapse[0], $el[0], 'collection contains element')
XhmikosR's avatar
XhmikosR committed
33
34
  })

35
  QUnit.test('should show a collapsed element', function (assert) {
36
    assert.expect(2)
37
38
    var $el = $('<div class="collapse"/>').bootstrapCollapse('show')

39
40
    assert.ok($el.hasClass('in'), 'has class "in"')
    assert.ok(!/height/i.test($el.attr('style')), 'has height reset')
XhmikosR's avatar
XhmikosR committed
41
42
  })

43
  QUnit.test('should hide a collapsed element', function (assert) {
44
    assert.expect(1)
45
46
    var $el = $('<div class="collapse"/>').bootstrapCollapse('hide')

47
    assert.ok(!$el.hasClass('in'), 'does not have class "in"')
XhmikosR's avatar
XhmikosR committed
48
49
  })

50
  QUnit.test('should not fire shown when show is prevented', function (assert) {
51
    assert.expect(1)
52
    var done = assert.async()
53

XhmikosR's avatar
XhmikosR committed
54
55
    $('<div class="collapse"/>')
      .on('show.bs.collapse', function (e) {
56
        e.preventDefault()
57
        assert.ok(true, 'show event fired')
58
        done()
59
      })
XhmikosR's avatar
XhmikosR committed
60
      .on('shown.bs.collapse', function () {
61
        assert.ok(false, 'shown event fired')
62
      })
63
      .bootstrapCollapse('show')
XhmikosR's avatar
XhmikosR committed
64
65
  })

66
  QUnit.test('should reset style to auto after finishing opening collapse', function (assert) {
67
    assert.expect(2)
68
    var done = assert.async()
69

XhmikosR's avatar
XhmikosR committed
70
71
    $('<div class="collapse" style="height: 0px"/>')
      .on('show.bs.collapse', function () {
72
        assert.strictEqual(this.style.height, '0px', 'height is 0px')
73
      })
XhmikosR's avatar
XhmikosR committed
74
      .on('shown.bs.collapse', function () {
75
        assert.strictEqual(this.style.height, '', 'height is auto')
76
        done()
77
      })
78
      .bootstrapCollapse('show')
XhmikosR's avatar
XhmikosR committed
79
  })
80

81
  QUnit.test('should remove "collapsed" class from target when collapse is shown', function (assert) {
82
    assert.expect(1)
83
    var done = assert.async()
84

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

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

94
    $target.trigger('click')
XhmikosR's avatar
XhmikosR committed
95
  })
96

97
  QUnit.test('should add "collapsed" class to target when collapse is hidden', function (assert) {
98
    assert.expect(1)
99
    var done = assert.async()
100

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

103
104
    $('<div id="test1" class="in"/>')
      .appendTo('#qunit-fixture')
105
      .on('hidden.bs.collapse', function () {
106
        assert.ok($target.hasClass('collapsed'), 'target has collapsed class')
107
        done()
108
109
      })

110
    $target.trigger('click')
XhmikosR's avatar
XhmikosR committed
111
  })
112

113
  QUnit.test('should remove "collapsed" class from all triggers targeting the collapse when the collapse is shown', function (assert) {
114
    assert.expect(2)
115
    var done = assert.async()
116

117
118
    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')
119
120
121
122
123
124
125
126
127

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

128
    $target.trigger('click')
129
130
131
  })

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

135
136
    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')
137
138
139
140
141
142

    $('<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')
143
        done()
144
145
      })

146
    $target.trigger('click')
XhmikosR's avatar
XhmikosR committed
147
  })
148

149
  QUnit.test('should not close a collapse when initialized with "show" option if already shown', function (assert) {
150
    assert.expect(0)
151
    var done = assert.async()
152
153
154
155

    var $test = $('<div id="test1" class="in"/>')
      .appendTo('#qunit-fixture')
      .on('hide.bs.collapse', function () {
156
        assert.ok(false)
157
158
159
160
      })

    $test.bootstrapCollapse('show')

161
    setTimeout(done, 0)
162
163
  })

164
  QUnit.test('should open a collapse when initialized with "show" option if not already shown', function (assert) {
165
    assert.expect(1)
166
    var done = assert.async()
167
168
169
170

    var $test = $('<div id="test1" />')
      .appendTo('#qunit-fixture')
      .on('show.bs.collapse', function () {
171
        assert.ok(true)
172
173
174
175
      })

    $test.bootstrapCollapse('show')

176
    setTimeout(done, 0)
177
178
  })

179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
  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)
  })

207
  QUnit.test('should remove "collapsed" class from active accordion target', function (assert) {
208
    assert.expect(3)
209
    var done = assert.async()
210

211
212
213
214
    var accordionHTML = '<div class="panel-group" id="accordion">'
        + '<div class="panel"/>'
        + '<div class="panel"/>'
        + '<div class="panel"/>'
Heinrich Fenkart's avatar
Heinrich Fenkart committed
215
        + '</div>'
216
    var $groups = $(accordionHTML).appendTo('#qunit-fixture').find('.panel')
217

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

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

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

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

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

228
229
    $('<div id="body3"/>')
      .appendTo($groups.eq(2))
230
      .on('shown.bs.collapse', function () {
231
232
233
        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"')
234

235
        done()
236
237
      })

238
    $target3.trigger('click')
XhmikosR's avatar
XhmikosR committed
239
  })
240

241
  QUnit.test('should allow dots in data-parent', function (assert) {
242
    assert.expect(3)
243
    var done = assert.async()
244

245
246
247
248
    var accordionHTML = '<div class="panel-group accordion">'
        + '<div class="panel"/>'
        + '<div class="panel"/>'
        + '<div class="panel"/>'
Heinrich Fenkart's avatar
Heinrich Fenkart committed
249
        + '</div>'
250
    var $groups = $(accordionHTML).appendTo('#qunit-fixture').find('.panel')
251

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

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

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

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

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

262
263
    $('<div id="body3"/>')
      .appendTo($groups.eq(2))
264
      .on('shown.bs.collapse', function () {
265
266
267
        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"')
268

269
        done()
270
271
      })

272
    $target3.trigger('click')
XhmikosR's avatar
XhmikosR committed
273
274
  })

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

279
    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
280
281
282

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

288
    $target.trigger('click')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
289
290
  })

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

295
    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
296
297
298

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

304
    $target.trigger('click')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
305
306
  })

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

311
312
    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
313
314
315

    $('<div id="test1"/>')
      .appendTo('#qunit-fixture')
316
      .on('shown.bs.collapse', function () {
317
318
        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"')
319
        done()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
320
321
      })

322
    $target.trigger('click')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
323
324
  })

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

329
330
    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
331
332
333

    $('<div id="test1" class="in"/>')
      .appendTo('#qunit-fixture')
334
      .on('hidden.bs.collapse', function () {
335
336
        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"')
337
        done()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
338
339
      })

340
    $target.trigger('click')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
341
342
  })

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

347
348
349
350
    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
351
        + '</div>'
352
    var $groups = $(accordionHTML).appendTo('#qunit-fixture').find('.panel')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
353

354
    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
355
356
357

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

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

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

362
    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
363
364
365

    $('<div id="body3" aria-expanded="false"/>')
      .appendTo($groups.eq(2))
366
      .on('shown.bs.collapse', function () {
367
368
369
        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
370

371
        done()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
372
373
      })

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

377
  QUnit.test('should not fire show event if show is prevented because other element is still transitioning', function (assert) {
378
    assert.expect(1)
379
    var done = assert.async()
380
381
382
383
384
385
386
387

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

388
    var $target1 = $('<a role="button" data-toggle="collapse" href="#body1" data-parent="#accordion"/>').appendTo($groups.eq(0))
389
390
391
392
393
394
395

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

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

399
    $target2.trigger('click')
400
401
402

    $body2
      .toggleClass('in collapsing')
fat's avatar
fat committed
403
      .data('bs.collapse').transitioning = 1
404

405
    $target1.trigger('click')
406
407

    setTimeout(function () {
408
      assert.ok(!showFired, 'show event did not fire')
409
      done()
410
411
412
    }, 1)
  })

413
  QUnit.test('should add "collapsed" class to target when collapse is hidden via manual invocation', function (assert) {
414
    assert.expect(1)
415
    var done = assert.async()
416

417
    var $target = $('<a role="button" data-toggle="collapse" href="#test1"/>').appendTo('#qunit-fixture')
418
419
420
421

    $('<div id="test1" class="in"/>')
      .appendTo('#qunit-fixture')
      .on('hidden.bs.collapse', function () {
422
        assert.ok($target.hasClass('collapsed'))
423
        done()
424
425
426
427
      })
      .bootstrapCollapse('hide')
  })

428
  QUnit.test('should remove "collapsed" class from target when collapse is shown via manual invocation', function (assert) {
429
    assert.expect(1)
430
    var done = assert.async()
431

432
    var $target = $('<a role="button" data-toggle="collapse" class="collapsed" href="#test1"/>').appendTo('#qunit-fixture')
433
434
435
436

    $('<div id="test1"/>')
      .appendTo('#qunit-fixture')
      .on('shown.bs.collapse', function () {
437
        assert.ok(!$target.hasClass('collapsed'))
438
        done()
439
440
441
442
      })
      .bootstrapCollapse('show')
  })

Heinrich Fenkart's avatar
Heinrich Fenkart committed
443
})