collapse.js 14.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
  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" 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" 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
  QUnit.test('should remove "collapsed" class from active accordion target', function (assert) {
181
    assert.expect(3)
182
    var done = assert.async()
183

184
185
186
187
    var accordionHTML = '<div class="panel-group" id="accordion">'
        + '<div class="panel"/>'
        + '<div class="panel"/>'
        + '<div class="panel"/>'
Heinrich Fenkart's avatar
Heinrich Fenkart committed
188
        + '</div>'
189
    var $groups = $(accordionHTML).appendTo('#qunit-fixture').find('.panel')
190

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

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

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

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

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

201
202
    $('<div id="body3"/>')
      .appendTo($groups.eq(2))
203
      .on('shown.bs.collapse', function () {
204
205
206
        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"')
207

208
        done()
209
210
      })

211
    $target3.click()
XhmikosR's avatar
XhmikosR committed
212
  })
213

214
  QUnit.test('should allow dots in data-parent', function (assert) {
215
    assert.expect(3)
216
    var done = assert.async()
217

218
219
220
221
    var accordionHTML = '<div class="panel-group accordion">'
        + '<div class="panel"/>'
        + '<div class="panel"/>'
        + '<div class="panel"/>'
Heinrich Fenkart's avatar
Heinrich Fenkart committed
222
        + '</div>'
223
    var $groups = $(accordionHTML).appendTo('#qunit-fixture').find('.panel')
224

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

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

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

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

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

235
236
    $('<div id="body3"/>')
      .appendTo($groups.eq(2))
237
      .on('shown.bs.collapse', function () {
238
239
240
        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"')
241

242
        done()
243
244
      })

245
    $target3.click()
XhmikosR's avatar
XhmikosR committed
246
247
  })

248
  QUnit.test('should set aria-expanded="true" on target when collapse is shown', function (assert) {
249
    assert.expect(1)
250
    var done = assert.async()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
251
252
253
254
255

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

    $('<div id="test1"/>')
      .appendTo('#qunit-fixture')
256
      .on('shown.bs.collapse', function () {
257
        assert.strictEqual($target.attr('aria-expanded'), 'true', 'aria-expanded on target is "true"')
258
        done()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
259
260
261
262
263
      })

    $target.click()
  })

264
  QUnit.test('should set aria-expanded="false" on target when collapse is hidden', function (assert) {
265
    assert.expect(1)
266
    var done = assert.async()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
267
268
269
270
271

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

    $('<div id="test1" class="in"/>')
      .appendTo('#qunit-fixture')
272
      .on('hidden.bs.collapse', function () {
273
        assert.strictEqual($target.attr('aria-expanded'), 'false', 'aria-expanded on target is "false"')
274
        done()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
275
276
277
278
279
      })

    $target.click()
  })

280
  QUnit.test('should set aria-expanded="true" on all triggers targeting the collapse when the collapse is shown', function (assert) {
281
    assert.expect(2)
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
    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) {
299
    assert.expect(2)
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
    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()
  })

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

320
321
322
323
    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
324
        + '</div>'
325
    var $groups = $(accordionHTML).appendTo('#qunit-fixture').find('.panel')
Patrick H. Lauke's avatar
Patrick H. Lauke committed
326
327
328
329
330
331
332
333
334
335
336
337
338

    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))
339
      .on('shown.bs.collapse', function () {
340
341
342
        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
343

344
        done()
Patrick H. Lauke's avatar
Patrick H. Lauke committed
345
346
347
348
349
      })

    $target3.click()
  })

350
  QUnit.test('should not fire show event if show is prevented because other element is still transitioning', function (assert) {
351
    assert.expect(1)
352
    var done = assert.async()
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380

    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 () {
381
      assert.ok(!showFired, 'show event did not fire')
382
      done()
383
384
385
    }, 1)
  })

386
  QUnit.test('should add "collapsed" class to target when collapse is hidden via manual invocation', function (assert) {
387
    assert.expect(1)
388
    var done = assert.async()
389
390
391
392
393
394

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

    $('<div id="test1" class="in"/>')
      .appendTo('#qunit-fixture')
      .on('hidden.bs.collapse', function () {
395
        assert.ok($target.hasClass('collapsed'))
396
        done()
397
398
399
400
      })
      .bootstrapCollapse('hide')
  })

401
  QUnit.test('should remove "collapsed" class from target when collapse is shown via manual invocation', function (assert) {
402
    assert.expect(1)
403
    var done = assert.async()
404
405
406
407
408
409

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

    $('<div id="test1"/>')
      .appendTo('#qunit-fixture')
      .on('shown.bs.collapse', function () {
410
        assert.ok(!$target.hasClass('collapsed'))
411
        done()
412
413
414
415
      })
      .bootstrapCollapse('show')
  })

Heinrich Fenkart's avatar
Heinrich Fenkart committed
416
})