collapse.js 15.5 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(2)
45
46
    var $el = $('<div class="collapse"/>').bootstrapCollapse('hide')

47
48
    assert.ok(!$el.hasClass('in'), 'does not have class "in"')
    assert.ok(/height/i.test($el.attr('style')), 'has height set')
XhmikosR's avatar
XhmikosR committed
49
50
  })

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

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

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

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

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

Patrick H. Lauke's avatar
Patrick H. Lauke committed
86
    var $target = $('<a data-toggle="collapse" class="collapsed" href="#test1"/>').appendTo('#qunit-fixture')
87

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

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

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

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

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

    $target.click()
  })

  QUnit.test('should remove "collapsed" class from all triggers targeting the collapse when the collapse is shown', function (assert) {
115
    assert.expect(2)
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
    var done = assert.async()

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

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

    $target.click()
  })

  QUnit.test('should add "collapsed" class to all triggers targeting the collapse when the collapse is hidden', function (assert) {
133
    assert.expect(2)
134
135
136
137
138
139
140
141
142
143
    var done = assert.async()

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

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

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

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

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

    $test.bootstrapCollapse('show')

162
    setTimeout(done, 0)
163
164
  })

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

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

    $test.bootstrapCollapse('show')

177
    setTimeout(done, 0)
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
207
  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)
  })

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

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

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

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

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

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

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

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

236
        done()
237
238
      })

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

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

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

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

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

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

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

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

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

270
        done()
271
272
      })

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

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

    var $target = $('<a data-toggle="collapse" class="collapsed" href="#test1" aria-expanded="false"/>').appendTo('#qunit-fixture')

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

    $target.click()
  })

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

    var $target = $('<a data-toggle="collapse" href="#test1" aria-expanded="true"/>').appendTo('#qunit-fixture')

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

    $target.click()
  })

308
  QUnit.test('should set aria-expanded="true" on all triggers targeting the collapse when the collapse is shown', function (assert) {
309
    assert.expect(2)
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
    var done = assert.async()

    var $target = $('<a data-toggle="collapse" class="collapsed" href="#test1" aria-expanded="false"/>').appendTo('#qunit-fixture')
    var $alt = $('<a data-toggle="collapse" class="collapsed" href="#test1" aria-expanded="false"/>').appendTo('#qunit-fixture')

    $('<div id="test1"/>')
      .appendTo('#qunit-fixture')
      .on('shown.bs.collapse', function () {
        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"')
        done()
      })

    $target.click()
  })

  QUnit.test('should set aria-expanded="false" on all triggers targeting the collapse when the collapse is hidden', function (assert) {
327
    assert.expect(2)
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
    var done = assert.async()

    var $target = $('<a data-toggle="collapse" href="#test1" aria-expanded="true"/>').appendTo('#qunit-fixture')
    var $alt = $('<a data-toggle="collapse" href="#test1" aria-expanded="true"/>').appendTo('#qunit-fixture')

    $('<div id="test1" class="in"/>')
      .appendTo('#qunit-fixture')
      .on('hidden.bs.collapse', function () {
        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"')
        done()
      })

    $target.click()
  })

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

348
349
350
351
    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
352
        + '</div>'
353
    var $groups = $(accordionHTML).appendTo('#qunit-fixture').find('.panel')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
354
355
356
357
358
359
360
361
362
363
364
365
366

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

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

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

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

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

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

372
        done()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
373
374
375
376
377
      })

    $target3.click()
  })

378
  QUnit.test('should not fire show event if show is prevented because other element is still transitioning', function (assert) {
379
    assert.expect(1)
380
    var done = assert.async()
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408

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

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

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

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

    $target2.click()

    $body2
      .toggleClass('in collapsing')
      .data('bs.collapse').transitioning = 1

    $target1.click()

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

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

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

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

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

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

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

Heinrich Fenkart's avatar
Heinrich Fenkart committed
444
})