modal.js 14 KB
Newer Older
1
$(function () {
XhmikosR's avatar
XhmikosR committed
2
  'use strict';
3

fat's avatar
fat committed
4
  QUnit.module('modal plugin')
XhmikosR's avatar
XhmikosR committed
5

fat's avatar
fat committed
6
7
8
  QUnit.test('should be defined on jquery object', function (assert) {
    assert.expect(1)
    assert.ok($(document.body).modal, 'modal method is defined')
XhmikosR's avatar
XhmikosR committed
9
10
  })

fat's avatar
fat committed
11
12
  QUnit.module('modal', {
    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.bootstrapModal = $.fn.modal.noConflict()
    },
fat's avatar
fat committed
16
    afterEach: function () {
17
18
19
20
21
      $.fn.modal = $.fn.bootstrapModal
      delete $.fn.bootstrapModal
    }
  })

fat's avatar
fat committed
22
23
24
  QUnit.test('should provide no conflict', function (assert) {
    assert.expect(1)
    assert.strictEqual($.fn.modal, undefined, 'modal was set back to undefined (orig value)')
25
26
  })

fat's avatar
fat committed
27
28
  QUnit.test('should return jquery collection containing the element', function (assert) {
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
29
30
    var $el = $('<div id="modal-test"/>')
    var $modal = $el.bootstrapModal()
fat's avatar
fat committed
31
32
    assert.ok($modal instanceof $, 'returns jquery collection')
    assert.strictEqual($modal[0], $el[0], 'collection contains element')
XhmikosR's avatar
XhmikosR committed
33
34
  })

fat's avatar
fat committed
35
36
  QUnit.test('should expose defaults var for settings', function (assert) {
    assert.expect(1)
37
    assert.ok($.fn.bootstrapModal.Constructor.Default, 'default object exposed')
XhmikosR's avatar
XhmikosR committed
38
39
  })

fat's avatar
fat committed
40
41
  QUnit.test('should insert into dom when show method is called', function (assert) {
    assert.expect(1)
42
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
43
44

    $('<div id="modal-test"/>')
XhmikosR's avatar
XhmikosR committed
45
      .on('shown.bs.modal', function () {
fat's avatar
fat committed
46
        assert.notEqual($('#modal-test').length, 0, 'modal inserted into dom')
47
        done()
XhmikosR's avatar
XhmikosR committed
48
      })
49
      .bootstrapModal('show')
XhmikosR's avatar
XhmikosR committed
50
51
  })

fat's avatar
fat committed
52
53
  QUnit.test('should fire show event', function (assert) {
    assert.expect(1)
54
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
55
56

    $('<div id="modal-test"/>')
XhmikosR's avatar
XhmikosR committed
57
      .on('show.bs.modal', function () {
fat's avatar
fat committed
58
        assert.ok(true, 'show event fired')
59
        done()
XhmikosR's avatar
XhmikosR committed
60
      })
61
      .bootstrapModal('show')
XhmikosR's avatar
XhmikosR committed
62
63
  })

fat's avatar
fat committed
64
65
  QUnit.test('should not fire shown when show was prevented', function (assert) {
    assert.expect(1)
66
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
67
68

    $('<div id="modal-test"/>')
XhmikosR's avatar
XhmikosR committed
69
70
      .on('show.bs.modal', function (e) {
        e.preventDefault()
fat's avatar
fat committed
71
        assert.ok(true, 'show event fired')
72
        done()
XhmikosR's avatar
XhmikosR committed
73
74
      })
      .on('shown.bs.modal', function () {
fat's avatar
fat committed
75
        assert.ok(false, 'shown event fired')
XhmikosR's avatar
XhmikosR committed
76
      })
77
      .bootstrapModal('show')
XhmikosR's avatar
XhmikosR committed
78
79
  })

fat's avatar
fat committed
80
81
  QUnit.test('should hide modal when hide is called', function (assert) {
    assert.expect(3)
82
    var done = assert.async()
XhmikosR's avatar
XhmikosR committed
83

Heinrich Fenkart's avatar
Heinrich Fenkart committed
84
    $('<div id="modal-test"/>')
XhmikosR's avatar
XhmikosR committed
85
      .on('shown.bs.modal', function () {
fat's avatar
fat committed
86
87
        assert.ok($('#modal-test').is(':visible'), 'modal visible')
        assert.notEqual($('#modal-test').length, 0, 'modal inserted into dom')
88
        $(this).bootstrapModal('hide')
XhmikosR's avatar
XhmikosR committed
89
90
      })
      .on('hidden.bs.modal', function () {
fat's avatar
fat committed
91
        assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
92
        done()
XhmikosR's avatar
XhmikosR committed
93
      })
94
      .bootstrapModal('show')
XhmikosR's avatar
XhmikosR committed
95
96
  })

fat's avatar
fat committed
97
98
  QUnit.test('should toggle when toggle is called', function (assert) {
    assert.expect(3)
99
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
100
101

    $('<div id="modal-test"/>')
XhmikosR's avatar
XhmikosR committed
102
      .on('shown.bs.modal', function () {
fat's avatar
fat committed
103
104
        assert.ok($('#modal-test').is(':visible'), 'modal visible')
        assert.notEqual($('#modal-test').length, 0, 'modal inserted into dom')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
105
        $(this).bootstrapModal('toggle')
XhmikosR's avatar
XhmikosR committed
106
107
      })
      .on('hidden.bs.modal', function () {
fat's avatar
fat committed
108
        assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
109
        done()
XhmikosR's avatar
XhmikosR committed
110
      })
111
      .bootstrapModal('toggle')
XhmikosR's avatar
XhmikosR committed
112
113
  })

fat's avatar
fat committed
114
115
  QUnit.test('should remove from dom when click [data-dismiss="modal"]', function (assert) {
    assert.expect(3)
116
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
117
118

    $('<div id="modal-test"><span class="close" data-dismiss="modal"/></div>')
XhmikosR's avatar
XhmikosR committed
119
      .on('shown.bs.modal', function () {
fat's avatar
fat committed
120
121
122
        assert.ok($('#modal-test').is(':visible'), 'modal visible')
        assert.notEqual($('#modal-test').length, 0, 'modal inserted into dom')
        $(this).find('.close').trigger('click')
XhmikosR's avatar
XhmikosR committed
123
124
      })
      .on('hidden.bs.modal', function () {
fat's avatar
fat committed
125
        assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
126
        done()
XhmikosR's avatar
XhmikosR committed
127
      })
128
      .bootstrapModal('toggle')
XhmikosR's avatar
XhmikosR committed
129
130
  })

fat's avatar
fat committed
131
132
  QUnit.test('should allow modal close with "backdrop:false"', function (assert) {
    assert.expect(2)
133
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
134
135

    $('<div id="modal-test" data-backdrop="false"/>')
XhmikosR's avatar
XhmikosR committed
136
      .on('shown.bs.modal', function () {
fat's avatar
fat committed
137
        assert.ok($('#modal-test').is(':visible'), 'modal visible')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
138
        $(this).bootstrapModal('hide')
XhmikosR's avatar
XhmikosR committed
139
140
      })
      .on('hidden.bs.modal', function () {
fat's avatar
fat committed
141
        assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
142
        done()
XhmikosR's avatar
XhmikosR committed
143
      })
144
      .bootstrapModal('show')
XhmikosR's avatar
XhmikosR committed
145
146
  })

fat's avatar
fat committed
147
148
  QUnit.test('should close modal when clicking outside of modal-content', function (assert) {
    assert.expect(3)
149
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
150
151

    $('<div id="modal-test"><div class="contents"/></div>')
152
      .on('shown.bs.modal', function () {
fat's avatar
fat committed
153
154
155
156
        assert.notEqual($('#modal-test').length, 0, 'modal inserted into dom')
        $('.contents').trigger('click')
        assert.ok($('#modal-test').is(':visible'), 'modal visible')
        $('#modal-test').trigger('click')
XhmikosR's avatar
XhmikosR committed
157
      })
158
      .on('hidden.bs.modal', function () {
fat's avatar
fat committed
159
        assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
160
        done()
XhmikosR's avatar
XhmikosR committed
161
      })
162
      .bootstrapModal('show')
XhmikosR's avatar
XhmikosR committed
163
164
  })

fat's avatar
fat committed
165
166
  QUnit.test('should close modal when escape key is pressed via keydown', function (assert) {
    assert.expect(3)
167
    var done = assert.async()
168

fat's avatar
fat committed
169
170
    var $div = $('<div id="modal-test"/>')
    $div
171
      .on('shown.bs.modal', function () {
fat's avatar
fat committed
172
173
174
        assert.ok($('#modal-test').length, 'modal insterted into dom')
        assert.ok($('#modal-test').is(':visible'), 'modal visible')
        $div.trigger($.Event('keydown', { which: 27 }))
175
176

        setTimeout(function () {
fat's avatar
fat committed
177
178
          assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
          $div.remove()
179
          done()
180
181
182
183
184
        }, 0)
      })
      .bootstrapModal('show')
  })

fat's avatar
fat committed
185
186
  QUnit.test('should not close modal when escape key is pressed via keyup', function (assert) {
    assert.expect(3)
187
    var done = assert.async()
188

fat's avatar
fat committed
189
190
    var $div = $('<div id="modal-test"/>')
    $div
191
      .on('shown.bs.modal', function () {
fat's avatar
fat committed
192
193
194
        assert.ok($('#modal-test').length, 'modal inserted into dom')
        assert.ok($('#modal-test').is(':visible'), 'modal visible')
        $div.trigger($.Event('keyup', { which: 27 }))
195
196

        setTimeout(function () {
fat's avatar
fat committed
197
198
          assert.ok($div.is(':visible'), 'modal still visible')
          $div.remove()
199
          done()
200
201
202
203
204
        }, 0)
      })
      .bootstrapModal('show')
  })

fat's avatar
fat committed
205
206
  QUnit.test('should trigger hide event once when clicking outside of modal-content', function (assert) {
    assert.expect(1)
207
    var done = assert.async()
XhmikosR's avatar
XhmikosR committed
208
209
210

    var triggered

Heinrich Fenkart's avatar
Heinrich Fenkart committed
211
    $('<div id="modal-test"><div class="contents"/></div>')
212
      .on('shown.bs.modal', function () {
XhmikosR's avatar
XhmikosR committed
213
        triggered = 0
fat's avatar
fat committed
214
        $('#modal-test').trigger('click')
XhmikosR's avatar
XhmikosR committed
215
      })
216
      .on('hide.bs.modal', function () {
XhmikosR's avatar
XhmikosR committed
217
        triggered += 1
fat's avatar
fat committed
218
        assert.strictEqual(triggered, 1, 'modal hide triggered once')
219
        done()
XhmikosR's avatar
XhmikosR committed
220
      })
221
      .bootstrapModal('show')
XhmikosR's avatar
XhmikosR committed
222
223
  })

fat's avatar
fat committed
224
225
  QUnit.test('should close reopened modal with [data-dismiss="modal"] click', function (assert) {
    assert.expect(2)
226
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
227
228

    $('<div id="modal-test"><div class="contents"><div id="close" data-dismiss="modal"/></div></div>')
229
      .one('shown.bs.modal', function () {
fat's avatar
fat committed
230
        $('#close').trigger('click')
XhmikosR's avatar
XhmikosR committed
231
232
      })
      .one('hidden.bs.modal', function () {
233
        // after one open-close cycle
fat's avatar
fat committed
234
        assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
235
        $(this)
236
          .one('shown.bs.modal', function () {
fat's avatar
fat committed
237
            $('#close').trigger('click')
238
          })
Heinrich Fenkart's avatar
Heinrich Fenkart committed
239
          .one('hidden.bs.modal', function () {
fat's avatar
fat committed
240
            assert.ok(!$('#modal-test').is(':visible'), 'modal hidden')
241
            done()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
242
243
          })
          .bootstrapModal('show')
XhmikosR's avatar
XhmikosR committed
244
      })
245
      .bootstrapModal('show')
XhmikosR's avatar
XhmikosR committed
246
  })
Chris Rebert's avatar
Chris Rebert committed
247

fat's avatar
fat committed
248
249
  QUnit.test('should restore focus to toggling element when modal is hidden after having been opened via data-api', function (assert) {
    assert.expect(1)
250
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
251
252
253
254

    var $toggleBtn = $('<button data-toggle="modal" data-target="#modal-test"/>').appendTo('#qunit-fixture')

    $('<div id="modal-test"><div class="contents"><div id="close" data-dismiss="modal"/></div></div>')
Chris Rebert's avatar
Chris Rebert committed
255
      .on('hidden.bs.modal', function () {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
256
        setTimeout(function () {
fat's avatar
fat committed
257
          assert.ok($(document.activeElement).is($toggleBtn), 'toggling element is once again focused')
258
          done()
Chris Rebert's avatar
Chris Rebert committed
259
260
261
        }, 0)
      })
      .on('shown.bs.modal', function () {
fat's avatar
fat committed
262
        $('#close').trigger('click')
Chris Rebert's avatar
Chris Rebert committed
263
264
      })
      .appendTo('#qunit-fixture')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
265

fat's avatar
fat committed
266
    $toggleBtn.trigger('click')
Chris Rebert's avatar
Chris Rebert committed
267
268
  })

fat's avatar
fat committed
269
270
  QUnit.test('should not restore focus to toggling element if the associated show event gets prevented', function (assert) {
    assert.expect(1)
271
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
272
273
274
275
    var $toggleBtn = $('<button data-toggle="modal" data-target="#modal-test"/>').appendTo('#qunit-fixture')
    var $otherBtn = $('<button id="other-btn"/>').appendTo('#qunit-fixture')

    $('<div id="modal-test"><div class="contents"><div id="close" data-dismiss="modal"/></div>')
Chris Rebert's avatar
Chris Rebert committed
276
277
      .one('show.bs.modal', function (e) {
        e.preventDefault()
fat's avatar
fat committed
278
        $otherBtn.trigger('focus')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
279
280
281
        setTimeout($.proxy(function () {
          $(this).bootstrapModal('show')
        }, this), 0)
Chris Rebert's avatar
Chris Rebert committed
282
283
      })
      .on('hidden.bs.modal', function () {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
284
        setTimeout(function () {
fat's avatar
fat committed
285
          assert.ok($(document.activeElement).is($otherBtn), 'focus returned to toggling element')
286
          done()
Chris Rebert's avatar
Chris Rebert committed
287
288
289
        }, 0)
      })
      .on('shown.bs.modal', function () {
fat's avatar
fat committed
290
        $('#close').trigger('click')
Chris Rebert's avatar
Chris Rebert committed
291
292
      })
      .appendTo('#qunit-fixture')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
293

fat's avatar
fat committed
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
    $toggleBtn.trigger('click')
  })

  QUnit.test('should restore inline body padding after closing', function (assert) {
    assert.expect(2)
    var done = assert.async()
    var originalBodyPad = 0
    var $body = $(document.body)

    $body.css('padding-right', originalBodyPad)

    $('<div id="modal-test"/>')
      .on('hidden.bs.modal', function () {
        var currentBodyPad = parseInt($body.css('padding-right'), 10)
        assert.notStrictEqual($body.attr('style'), '', 'body has non-empty style attribute')
        assert.strictEqual(currentBodyPad, originalBodyPad, 'original body padding was not changed')
        $body.removeAttr('style')
        done()
      })
      .on('shown.bs.modal', function () {
        $(this).bootstrapModal('hide')
      })
      .bootstrapModal('show')
  })

  QUnit.test('should ignore values set via CSS when trying to restore body padding after closing', function (assert) {
    assert.expect(1)
    var done = assert.async()
    var $body = $(document.body)
    var $style = $('<style>body { padding-right: 42px; }</style>').appendTo('head')

    $('<div id="modal-test"/>')
      .on('hidden.bs.modal', function () {
        assert.ok(!$body.attr('style'), 'body does not have inline padding set')
        $style.remove()
        done()
      })
      .on('shown.bs.modal', function () {
        $(this).bootstrapModal('hide')
      })
      .bootstrapModal('show')
  })

337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
  QUnit.test('should have a paddingRight when the modal is taller than the viewport', function (assert) {
    assert.expect(2)
    var done = assert.async()
    $('<div class="navbar-fixed-top navbar-fixed-bottom is-fixed">@Johann-S</div>').appendTo('#qunit-fixture')
    $('.navbar-fixed-top, .navbar-fixed-bottom, .is-fixed').css('padding-right', '10px')

    $('<div id="modal-test"/>')
      .on('shown.bs.modal', function () {
        var paddingRight = parseInt($(document.body).css('padding-right'), 10)
        assert.strictEqual(isNaN(paddingRight), false)
        assert.strictEqual(paddingRight !== 0, true)
        $(document.body).css('padding-right', ''); // Because test case "should ignore other inline styles when trying to restore body padding after closing" fail if not
        done()
      })
      .bootstrapModal('show')
  })

  QUnit.test('should remove padding-right on modal after closing', function (assert) {
    assert.expect(3)
    var done = assert.async()
    $('<div class="navbar-fixed-top navbar-fixed-bottom is-fixed">@Johann-S</div>').appendTo('#qunit-fixture')
    $('.navbar-fixed-top, .navbar-fixed-bottom, .is-fixed').css('padding-right', '10px')

    $('<div id="modal-test"/>')
      .on('shown.bs.modal', function () {
        var paddingRight = parseInt($(document.body).css('padding-right'), 10)
        assert.strictEqual(isNaN(paddingRight), false)
        assert.strictEqual(paddingRight !== 0, true)
        $(this).bootstrapModal('hide')
      })
      .on('hidden.bs.modal', function () {
        var paddingRight = parseInt($(document.body).css('padding-right'), 10)
        assert.strictEqual(paddingRight, 0)
        done()
      })
      .bootstrapModal('show')
  })

fat's avatar
fat committed
375
376
377
378
379
380
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
409
410
411
412
413
  QUnit.test('should ignore other inline styles when trying to restore body padding after closing', function (assert) {
    assert.expect(2)
    var done = assert.async()
    var $body = $(document.body)
    var $style = $('<style>body { padding-right: 42px; }</style>').appendTo('head')

    $body.css('color', 'red')

    $('<div id="modal-test"/>')
      .on('hidden.bs.modal', function () {
        assert.strictEqual($body[0].style.paddingRight, '', 'body does not have inline padding set')
        assert.strictEqual($body[0].style.color, 'red', 'body still has other inline styles set')
        $body.removeAttr('style')
        $style.remove()
        done()
      })
      .on('shown.bs.modal', function () {
        $(this).bootstrapModal('hide')
      })
      .bootstrapModal('show')
  })

  QUnit.test('should properly restore non-pixel inline body padding after closing', function (assert) {
    assert.expect(1)
    var done = assert.async()
    var $body = $(document.body)

    $body.css('padding-right', '5%')

    $('<div id="modal-test"/>')
      .on('hidden.bs.modal', function () {
        assert.strictEqual($body[0].style.paddingRight, '5%', 'body does not have inline padding set')
        $body.removeAttr('style')
        done()
      })
      .on('shown.bs.modal', function () {
        $(this).bootstrapModal('hide')
      })
      .bootstrapModal('show')
Chris Rebert's avatar
Chris Rebert committed
414
  })
415
})