tooltip.js 32.4 KB
Newer Older
Jacob Thornton's avatar
Jacob Thornton committed
1
$(function () {
2
  'use strict'
Jacob Thornton's avatar
Jacob Thornton committed
3

fat's avatar
fat committed
4
  QUnit.module('tooltip 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).tooltip, 'tooltip method is defined')
XhmikosR's avatar
XhmikosR committed
9
10
  })

fat's avatar
fat committed
11
12
  QUnit.module('tooltip', {
    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.bootstrapTooltip = $.fn.tooltip.noConflict()
    },
fat's avatar
fat committed
16
    afterEach: function () {
17
18
      $.fn.tooltip = $.fn.bootstrapTooltip
      delete $.fn.bootstrapTooltip
19
      $('.tooltip').remove()
20
      $('#qunit-fixture').html('')
21
22
23
    }
  })

fat's avatar
fat committed
24
25
  QUnit.test('should provide no conflict', function (assert) {
    assert.expect(1)
XhmikosR's avatar
XhmikosR committed
26
    assert.strictEqual(typeof $.fn.tooltip, 'undefined', 'tooltip was set back to undefined (org value)')
27
28
  })

29
30
31
32
33
34
  QUnit.test('should throw explicit error on undefined method', function (assert) {
    assert.expect(1)
    var $el = $('<div/>')
    $el.bootstrapTooltip()
    try {
      $el.bootstrapTooltip('noMethod')
XhmikosR's avatar
XhmikosR committed
35
    } catch (err) {
36
37
38
39
      assert.strictEqual(err.message, 'No method named "noMethod"')
    }
  })

fat's avatar
fat committed
40
41
  QUnit.test('should return jquery collection containing the element', function (assert) {
    assert.expect(2)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
42
43
    var $el = $('<div/>')
    var $tooltip = $el.bootstrapTooltip()
fat's avatar
fat committed
44
45
    assert.ok($tooltip instanceof $, 'returns jquery collection')
    assert.strictEqual($tooltip[0], $el[0], 'collection contains element')
XhmikosR's avatar
XhmikosR committed
46
47
  })

fat's avatar
fat committed
48
49
  QUnit.test('should expose default settings', function (assert) {
    assert.expect(1)
50
    assert.ok($.fn.bootstrapTooltip.Constructor.Default, 'defaults is defined')
XhmikosR's avatar
XhmikosR committed
51
52
  })

fat's avatar
fat committed
53
54
  QUnit.test('should empty title attribute', function (assert) {
    assert.expect(1)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
55
    var $trigger = $('<a href="#" rel="tooltip" title="Another tooltip"/>').bootstrapTooltip()
fat's avatar
fat committed
56
    assert.strictEqual($trigger.attr('title'), '', 'title attribute was emptied')
XhmikosR's avatar
XhmikosR committed
57
58
  })

fat's avatar
fat committed
59
60
  QUnit.test('should add data attribute for referencing original title', function (assert) {
    assert.expect(1)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
61
    var $trigger = $('<a href="#" rel="tooltip" title="Another tooltip"/>').bootstrapTooltip()
fat's avatar
fat committed
62
    assert.strictEqual($trigger.attr('data-original-title'), 'Another tooltip', 'original title preserved in data attribute')
XhmikosR's avatar
XhmikosR committed
63
64
  })

fat's avatar
fat committed
65
66
67
  QUnit.test('should add aria-describedby to the trigger on show', function (assert) {
    assert.expect(3)
    var $trigger = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
68
      .bootstrapTooltip()
69
70
      .appendTo('#qunit-fixture')
      .bootstrapTooltip('show')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
71

72
73
    var id = $('.tooltip').attr('id')

fat's avatar
fat committed
74
75
76
    assert.strictEqual($('#' + id).length, 1, 'has a unique id')
    assert.strictEqual($('.tooltip').attr('aria-describedby'), $trigger.attr('id'), 'tooltip id and aria-describedby on trigger match')
    assert.ok($trigger[0].hasAttribute('aria-describedby'), 'trigger has aria-describedby')
77
78
  })

fat's avatar
fat committed
79
80
  QUnit.test('should remove aria-describedby from trigger on hide', function (assert) {
    assert.expect(2)
81
    var done = assert.async()
fat's avatar
fat committed
82
    var $trigger = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
83
      .bootstrapTooltip()
84
      .appendTo('#qunit-fixture')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
85

86
87
88
89
90
91
92
93
94
95
    $trigger
      .one('shown.bs.tooltip', function () {
        assert.ok($trigger[0].hasAttribute('aria-describedby'), 'trigger has aria-describedby')
        $trigger.bootstrapTooltip('hide')
      })
      .one('hidden.bs.tooltip', function () {
        assert.ok(!$trigger[0].hasAttribute('aria-describedby'), 'trigger does not have aria-describedby')
        done()
      })
      .bootstrapTooltip('show')
96
97
  })

fat's avatar
fat committed
98
99
100
  QUnit.test('should assign a unique id tooltip element', function (assert) {
    assert.expect(2)
    $('<a href="#" rel="tooltip" title="Another tooltip"/>')
101
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
102
      .bootstrapTooltip('show')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
103

XhmikosR's avatar
XhmikosR committed
104
    var id = $('.tooltip').attr('id')
105

fat's avatar
fat committed
106
107
    assert.strictEqual($('#' + id).length, 1, 'tooltip has unique id')
    assert.strictEqual(id.indexOf('tooltip'), 0, 'tooltip id has prefix')
108
109
  })

fat's avatar
fat committed
110
  QUnit.test('should place tooltips relative to placement option', function (assert) {
fat's avatar
fat committed
111
    assert.expect(2)
112
    var done = assert.async()
fat's avatar
fat committed
113
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
XhmikosR's avatar
XhmikosR committed
114
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
115
116
117
      .bootstrapTooltip({
        placement: 'bottom'
      })
XhmikosR's avatar
XhmikosR committed
118

119
120
121
122
    $tooltip
      .one('shown.bs.tooltip', function () {
        assert.ok($('.tooltip')
          .is('.fade.bs-tooltip-bottom.show'), 'has correct classes applied')
123

124
125
126
127
128
129
130
        $tooltip.bootstrapTooltip('hide')
      })
      .one('hidden.bs.tooltip', function () {
        assert.strictEqual($tooltip.data('bs.tooltip').tip.parentNode, null, 'tooltip removed')
        done()
      })
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
131
132
  })

fat's avatar
fat committed
133
134
  QUnit.test('should allow html entities', function (assert) {
    assert.expect(2)
135
    var done = assert.async()
fat's avatar
fat committed
136
    var $tooltip = $('<a href="#" rel="tooltip" title="&lt;b&gt;@fat&lt;/b&gt;"/>')
XhmikosR's avatar
XhmikosR committed
137
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
138
139
140
      .bootstrapTooltip({
        html: true
      })
XhmikosR's avatar
XhmikosR committed
141

142
143
144
145
146
147
148
149
150
151
    $tooltip
      .one('shown.bs.tooltip', function () {
        assert.notEqual($('.tooltip b').length, 0, 'b tag was inserted')
        $tooltip.bootstrapTooltip('hide')
      })
      .one('hidden.bs.tooltip', function () {
        assert.strictEqual($tooltip.data('bs.tooltip').tip.parentNode, null, 'tooltip removed')
        done()
      })
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
152
153
  })

154
155
  QUnit.test('should allow DOMElement title (html: false)', function (assert) {
    assert.expect(3)
156
    var done = assert.async()
157
158
159
    var title = document.createTextNode('<3 writing tests')
    var $tooltip = $('<a href="#" rel="tooltip"/>')
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
160
161
162
      .bootstrapTooltip({
        title: title
      })
163

164
165
166
167
168
169
170
171
    $tooltip
      .one('shown.bs.tooltip', function () {
        assert.notEqual($('.tooltip').length, 0, 'tooltip inserted')
        assert.strictEqual($('.tooltip').text(), '<3 writing tests', 'title inserted')
        assert.ok(!$.contains($('.tooltip').get(0), title), 'title node copied, not moved')
        done()
      })
      .bootstrapTooltip('show')
172
173
174
175
  })

  QUnit.test('should allow DOMElement title (html: true)', function (assert) {
    assert.expect(3)
176
    var done = assert.async()
177
178
179
    var title = document.createTextNode('<3 writing tests')
    var $tooltip = $('<a href="#" rel="tooltip"/>')
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
180
181
182
183
      .bootstrapTooltip({
        html: true,
        title: title
      })
184

185
186
187
188
189
190
191
192
    $tooltip
      .one('shown.bs.tooltip', function () {
        assert.notEqual($('.tooltip').length, 0, 'tooltip inserted')
        assert.strictEqual($('.tooltip').text(), '<3 writing tests', 'title inserted')
        assert.ok($.contains($('.tooltip').get(0), title), 'title node moved, not copied')
        done()
      })
      .bootstrapTooltip('show')
193
194
  })

fat's avatar
fat committed
195
196
  QUnit.test('should respect custom classes', function (assert) {
    assert.expect(2)
197
    var done = assert.async()
fat's avatar
fat committed
198
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
XhmikosR's avatar
XhmikosR committed
199
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
200
201
202
      .bootstrapTooltip({
        template: '<div class="tooltip some-class"><div class="tooltip-arrow"/><div class="tooltip-inner"/></div>'
      })
XhmikosR's avatar
XhmikosR committed
203

204
205
206
207
208
209
210
211
212
213
    $tooltip
      .one('shown.bs.tooltip', function () {
        assert.ok($('.tooltip').hasClass('some-class'), 'custom class is present')
        $tooltip.bootstrapTooltip('hide')
      })
      .one('hidden.bs.tooltip', function () {
        assert.strictEqual($tooltip.data('bs.tooltip').tip.parentNode, null, 'tooltip removed')
        done()
      })
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
214
215
  })

fat's avatar
fat committed
216
217
  QUnit.test('should fire show event', function (assert) {
    assert.expect(1)
218
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
219

fat's avatar
fat committed
220
    $('<div title="tooltip title"/>')
XhmikosR's avatar
XhmikosR committed
221
      .on('show.bs.tooltip', function () {
fat's avatar
fat committed
222
        assert.ok(true, 'show event fired')
223
        done()
XhmikosR's avatar
XhmikosR committed
224
      })
225
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
226
227
  })

228
229
230
231
232
233
  QUnit.test('should throw an error when show is called on hidden elements', function (assert) {
    assert.expect(1)
    var done = assert.async()

    try {
      $('<div title="tooltip title" style="display: none"/>').bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
234
    } catch (err) {
235
236
237
238
239
      assert.strictEqual(err.message, 'Please use show on visible elements')
      done()
    }
  })

fat's avatar
fat committed
240
241
  QUnit.test('should fire inserted event', function (assert) {
    assert.expect(2)
242
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
243

fat's avatar
fat committed
244
    $('<div title="tooltip title"/>')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
245
      .appendTo('#qunit-fixture')
fat's avatar
fat committed
246
247
248
      .on('inserted.bs.tooltip', function () {
        assert.notEqual($('.tooltip').length, 0, 'tooltip was inserted')
        assert.ok(true, 'inserted event fired')
249
        done()
XhmikosR's avatar
XhmikosR committed
250
      })
251
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
252
253
  })

fat's avatar
fat committed
254
255
  QUnit.test('should fire shown event', function (assert) {
    assert.expect(1)
256
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
257

fat's avatar
fat committed
258
    $('<div title="tooltip title"></div>')
259
      .appendTo('#qunit-fixture')
fat's avatar
fat committed
260
261
262
263
264
265
266
267
268
269
270
271
      .on('shown.bs.tooltip', function () {
        assert.ok(true, 'shown was called')
        done()
      })
      .bootstrapTooltip('show')
  })

  QUnit.test('should not fire shown event when show was prevented', function (assert) {
    assert.expect(1)
    var done = assert.async()

    $('<div title="tooltip title"/>')
XhmikosR's avatar
XhmikosR committed
272
273
      .on('show.bs.tooltip', function (e) {
        e.preventDefault()
fat's avatar
fat committed
274
        assert.ok(true, 'show event fired')
275
        done()
XhmikosR's avatar
XhmikosR committed
276
277
      })
      .on('shown.bs.tooltip', function () {
fat's avatar
fat committed
278
        assert.ok(false, 'shown event fired')
XhmikosR's avatar
XhmikosR committed
279
      })
280
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
281
282
  })

fat's avatar
fat committed
283
284
  QUnit.test('should fire hide event', function (assert) {
    assert.expect(1)
285
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
286

fat's avatar
fat committed
287
    $('<div title="tooltip title"/>')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
288
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
289
      .on('shown.bs.tooltip', function () {
290
        $(this).bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
291
292
      })
      .on('hide.bs.tooltip', function () {
fat's avatar
fat committed
293
        assert.ok(true, 'hide event fired')
294
        done()
XhmikosR's avatar
XhmikosR committed
295
      })
296
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
297
298
  })

fat's avatar
fat committed
299
300
  QUnit.test('should fire hidden event', function (assert) {
    assert.expect(1)
301
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
302

fat's avatar
fat committed
303
    $('<div title="tooltip title"/>')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
304
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
305
      .on('shown.bs.tooltip', function () {
306
        $(this).bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
307
308
      })
      .on('hidden.bs.tooltip', function () {
fat's avatar
fat committed
309
        assert.ok(true, 'hidden event fired')
310
        done()
XhmikosR's avatar
XhmikosR committed
311
      })
312
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
313
314
  })

fat's avatar
fat committed
315
316
  QUnit.test('should not fire hidden event when hide was prevented', function (assert) {
    assert.expect(1)
317
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
318

fat's avatar
fat committed
319
    $('<div title="tooltip title"/>')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
320
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
321
      .on('shown.bs.tooltip', function () {
322
        $(this).bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
323
324
325
      })
      .on('hide.bs.tooltip', function (e) {
        e.preventDefault()
fat's avatar
fat committed
326
        assert.ok(true, 'hide event fired')
327
        done()
XhmikosR's avatar
XhmikosR committed
328
329
      })
      .on('hidden.bs.tooltip', function () {
fat's avatar
fat committed
330
        assert.ok(false, 'hidden event fired')
XhmikosR's avatar
XhmikosR committed
331
      })
332
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
333
334
  })

fat's avatar
fat committed
335
336
337
  QUnit.test('should destroy tooltip', function (assert) {
    assert.expect(7)
    var $tooltip = $('<div/>')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
338
      .bootstrapTooltip()
XhmikosR's avatar
XhmikosR committed
339
      .on('click.foo', function () {})  // eslint-disable-line no-empty-function
Heinrich Fenkart's avatar
Heinrich Fenkart committed
340

fat's avatar
fat committed
341
342
343
    assert.ok($tooltip.data('bs.tooltip'), 'tooltip has data')
    assert.ok($._data($tooltip[0], 'events').mouseover && $._data($tooltip[0], 'events').mouseout, 'tooltip has hover events')
    assert.strictEqual($._data($tooltip[0], 'events').click[0].namespace, 'foo', 'tooltip has extra click.foo event')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
344
345

    $tooltip.bootstrapTooltip('show')
fat's avatar
fat committed
346
    $tooltip.bootstrapTooltip('dispose')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
347

Starsam80's avatar
Starsam80 committed
348
    assert.ok(!$tooltip.hasClass('show'), 'tooltip is hidden')
fat's avatar
fat committed
349
350
351
    assert.ok(!$._data($tooltip[0], 'bs.tooltip'), 'tooltip does not have data')
    assert.strictEqual($._data($tooltip[0], 'events').click[0].namespace, 'foo', 'tooltip still has click.foo')
    assert.ok(!$._data($tooltip[0], 'events').mouseover && !$._data($tooltip[0], 'events').mouseout, 'tooltip does not have hover events')
XhmikosR's avatar
XhmikosR committed
352
353
  })

354
355
356
357
358
359
360
361
  // QUnit.test('should show tooltip with delegate selector on click', function (assert) {
  //   assert.expect(2)
  //   var $div = $('<div><a href="#" rel="tooltip" title="Another tooltip"/></div>')
  //     .appendTo('#qunit-fixture')
  //     .bootstrapTooltip({
  //       selector: 'a[rel="tooltip"]',
  //       trigger: 'click'
  //     })
Heinrich Fenkart's avatar
Heinrich Fenkart committed
362

363
364
  //   $div.find('a').trigger('click')
  //   assert.ok($('.tooltip').is('.fade.in'), 'tooltip is faded in')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
365

366
367
368
  //   $div.find('a').trigger('click')
  //   assert.strictEqual($div.data('bs.tooltip').tip.parentNode, null, 'tooltip removed')
  // })
XhmikosR's avatar
XhmikosR committed
369

fat's avatar
fat committed
370
371
372
  QUnit.test('should show tooltip when toggle is called', function (assert) {
    assert.expect(1)
    $('<a href="#" rel="tooltip" title="tooltip on toggle"/>')
XhmikosR's avatar
XhmikosR committed
373
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
374
375
376
      .bootstrapTooltip({
        trigger: 'manual'
      })
377
      .bootstrapTooltip('toggle')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
378

Starsam80's avatar
Starsam80 committed
379
    assert.ok($('.tooltip').is('.fade.show'), 'tooltip is faded active')
XhmikosR's avatar
XhmikosR committed
380
381
  })

fat's avatar
fat committed
382
383
  QUnit.test('should hide previously shown tooltip when toggle is called on tooltip', function (assert) {
    assert.expect(1)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
384
    $('<a href="#" rel="tooltip" title="tooltip on toggle">@ResentedHook</a>')
385
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
386
387
388
      .bootstrapTooltip({
        trigger: 'manual'
      })
Heinrich Fenkart's avatar
Heinrich Fenkart committed
389
390
391
      .bootstrapTooltip('show')

    $('.tooltip').bootstrapTooltip('toggle')
Starsam80's avatar
Starsam80 committed
392
    assert.ok($('.tooltip').not('.fade.show'), 'tooltip was faded out')
393
394
  })

fat's avatar
fat committed
395
396
  QUnit.test('should place tooltips inside body when container is body', function (assert) {
    assert.expect(3)
397
    var done = assert.async()
fat's avatar
fat committed
398
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
XhmikosR's avatar
XhmikosR committed
399
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
400
401
402
      .bootstrapTooltip({
        container: 'body'
      })
Heinrich Fenkart's avatar
Heinrich Fenkart committed
403

404
405
406
407
408
409
410
411
412
413
414
    $tooltip
      .one('shown.bs.tooltip', function () {
        assert.notEqual($('body > .tooltip').length, 0, 'tooltip is direct descendant of body')
        assert.strictEqual($('#qunit-fixture > .tooltip').length, 0, 'tooltip is not in parent')
        $tooltip.bootstrapTooltip('hide')
      })
      .one('hidden.bs.tooltip', function () {
        assert.strictEqual($('body > .tooltip').length, 0, 'tooltip was removed from dom')
        done()
      })
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
415
416
  })

fat's avatar
fat committed
417
  QUnit.test('should add position class before positioning so that position-specific styles are taken into account', function (assert) {
Johann-S's avatar
Johann-S committed
418
419
    assert.expect(2)
    var done = assert.async()
XhmikosR's avatar
XhmikosR committed
420
421
422
423
    var styles = '<style>' +
      '.bs-tooltip-right { white-space: nowrap; }' +
      '.bs-tooltip-right .tooltip-inner { max-width: none; }' +
      '</style>'
424
    var $styles = $(styles).appendTo('head')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
425

fat's avatar
fat committed
426
    var $container = $('<div/>').appendTo('#qunit-fixture')
Johann-S's avatar
Johann-S committed
427
    $('<a href="#" rel="tooltip" title="very very very very very very very very long tooltip in one line"/>')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
428
429
      .appendTo($container)
      .bootstrapTooltip({
Johann-S's avatar
Johann-S committed
430
431
432
433
434
435
        placement: 'right',
        trigger: 'manual'
      })
      .on('inserted.bs.tooltip', function () {
        var $tooltip = $($(this).data('bs.tooltip').tip)
        assert.ok($tooltip.hasClass('bs-tooltip-right'))
XhmikosR's avatar
XhmikosR committed
436
        assert.ok(typeof $tooltip.attr('style') === 'undefined')
Johann-S's avatar
Johann-S committed
437
438
        $styles.remove()
        done()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
439
440
      })
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
441
442
  })

fat's avatar
fat committed
443
444
  QUnit.test('should use title attribute for tooltip text', function (assert) {
    assert.expect(2)
445
    var done = assert.async()
fat's avatar
fat committed
446
    var $tooltip = $('<a href="#" rel="tooltip" title="Simple tooltip"/>')
XhmikosR's avatar
XhmikosR committed
447
      .appendTo('#qunit-fixture')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
448
449
      .bootstrapTooltip()

450
451
452
453
454
455
456
457
458
459
    $tooltip
      .one('shown.bs.tooltip', function () {
        assert.strictEqual($('.tooltip').children('.tooltip-inner').text(), 'Simple tooltip', 'title from title attribute is set')
        $tooltip.bootstrapTooltip('hide')
      })
      .one('hidden.bs.tooltip', function () {
        assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
        done()
      })
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
460
461
  })

fat's avatar
fat committed
462
463
  QUnit.test('should prefer title attribute over title option', function (assert) {
    assert.expect(2)
464
    var done = assert.async()
fat's avatar
fat committed
465
    var $tooltip = $('<a href="#" rel="tooltip" title="Simple tooltip"/>')
XhmikosR's avatar
XhmikosR committed
466
      .appendTo('#qunit-fixture')
467
      .bootstrapTooltip({
XhmikosR's avatar
XhmikosR committed
468
469
        title: 'This is a tooltip with some content'
      })
Heinrich Fenkart's avatar
Heinrich Fenkart committed
470

471
472
473
474
475
476
477
478
479
480
    $tooltip
      .one('shown.bs.tooltip', function () {
        assert.strictEqual($('.tooltip').children('.tooltip-inner').text(), 'Simple tooltip', 'title is set from title attribute while preferred over title option')
        $tooltip.bootstrapTooltip('hide')
      })
      .one('hidden.bs.tooltip', function () {
        assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
        done()
      })
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
481
482
  })

fat's avatar
fat committed
483
484
  QUnit.test('should use title option', function (assert) {
    assert.expect(2)
485
    var done = assert.async()
fat's avatar
fat committed
486
    var $tooltip = $('<a href="#" rel="tooltip"/>')
XhmikosR's avatar
XhmikosR committed
487
      .appendTo('#qunit-fixture')
488
      .bootstrapTooltip({
XhmikosR's avatar
XhmikosR committed
489
490
        title: 'This is a tooltip with some content'
      })
Heinrich Fenkart's avatar
Heinrich Fenkart committed
491

492
493
494
495
496
497
498
499
500
501
    $tooltip
      .one('shown.bs.tooltip', function () {
        assert.strictEqual($('.tooltip').children('.tooltip-inner').text(), 'This is a tooltip with some content', 'title from title option is set')
        $tooltip.bootstrapTooltip('hide')
      })
      .one('hidden.bs.tooltip', function () {
        assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
        done()
      })
      .bootstrapTooltip('show')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
502
503
  })

504
  QUnit.test('should not error when trying to show an top-placed tooltip that has been removed from the dom', function (assert) {
fat's avatar
fat committed
505
    assert.expect(1)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
506
    var passed = true
fat's avatar
fat committed
507
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
508
      .appendTo('#qunit-fixture')
Chris Rebert's avatar
Chris Rebert committed
509
      .one('show.bs.tooltip', function () {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
510
        $(this).remove()
Chris Rebert's avatar
Chris Rebert committed
511
      })
XhmikosR's avatar
XhmikosR committed
512
513
514
      .bootstrapTooltip({
        placement: 'top'
      })
Chris Rebert's avatar
Chris Rebert committed
515
516

    try {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
517
518
      $tooltip.bootstrapTooltip('show')
    } catch (err) {
Chris Rebert's avatar
Chris Rebert committed
519
520
521
522
      passed = false
      console.log(err)
    }

fat's avatar
fat committed
523
    assert.ok(passed, '.tooltip(\'show\') should not throw an error if element no longer is in dom')
Chris Rebert's avatar
Chris Rebert committed
524
  })
fat's avatar
fat committed
525

fat's avatar
fat committed
526
527
  QUnit.test('should show tooltip if leave event hasn\'t occurred before delay expires', function (assert) {
    assert.expect(2)
528
    var done = assert.async()
fat's avatar
fat committed
529

fat's avatar
fat committed
530
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
fat's avatar
fat committed
531
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
532
533
534
      .bootstrapTooltip({
        delay: 150
      })
fat's avatar
fat committed
535
536

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
537
      assert.ok(!$('.tooltip').is('.fade.show'), '100ms: tooltip is not faded active')
538
    }, 100)
fat's avatar
fat committed
539
540

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
541
      assert.ok($('.tooltip').is('.fade.show'), '200ms: tooltip is faded active')
542
      done()
543
    }, 200)
fat's avatar
fat committed
544
545
546
547

    $tooltip.trigger('mouseenter')
  })

fat's avatar
fat committed
548
549
  QUnit.test('should not show tooltip if leave event occurs before delay expires', function (assert) {
    assert.expect(2)
550
    var done = assert.async()
fat's avatar
fat committed
551

fat's avatar
fat committed
552
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
fat's avatar
fat committed
553
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
554
555
556
      .bootstrapTooltip({
        delay: 150
      })
fat's avatar
fat committed
557
558

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
559
      assert.ok(!$('.tooltip').is('.fade.show'), '100ms: tooltip not faded active')
fat's avatar
fat committed
560
      $tooltip.trigger('mouseout')
561
    }, 100)
fat's avatar
fat committed
562
563

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
564
      assert.ok(!$('.tooltip').is('.fade.show'), '200ms: tooltip not faded active')
565
      done()
566
    }, 200)
fat's avatar
fat committed
567
568
569
570

    $tooltip.trigger('mouseenter')
  })

fat's avatar
fat committed
571
572
  QUnit.test('should not hide tooltip if leave event occurs and enter event occurs within the hide delay', function (assert) {
    assert.expect(3)
573
    var done = assert.async()
fat's avatar
fat committed
574

fat's avatar
fat committed
575
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
fat's avatar
fat committed
576
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
577
578
579
580
581
582
      .bootstrapTooltip({
        delay: {
          show: 0,
          hide: 150
        }
      })
fat's avatar
fat committed
583
584

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
585
      assert.ok($('.tooltip').is('.fade.show'), '1ms: tooltip faded active')
fat's avatar
fat committed
586
587
588
      $tooltip.trigger('mouseout')

      setTimeout(function () {
Starsam80's avatar
Starsam80 committed
589
        assert.ok($('.tooltip').is('.fade.show'), '100ms: tooltip still faded active')
fat's avatar
fat committed
590
        $tooltip.trigger('mouseenter')
591
      }, 100)
fat's avatar
fat committed
592
593

      setTimeout(function () {
Starsam80's avatar
Starsam80 committed
594
        assert.ok($('.tooltip').is('.fade.show'), '200ms: tooltip still faded active')
595
        done()
596
      }, 200)
fat's avatar
fat committed
597
598
599
600
601
    }, 0)

    $tooltip.trigger('mouseenter')
  })

fat's avatar
fat committed
602
603
  QUnit.test('should not show tooltip if leave event occurs before delay expires', function (assert) {
    assert.expect(2)
604
    var done = assert.async()
fat's avatar
fat committed
605

fat's avatar
fat committed
606
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
fat's avatar
fat committed
607
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
608
609
610
      .bootstrapTooltip({
        delay: 150
      })
fat's avatar
fat committed
611
612

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
613
      assert.ok(!$('.tooltip').is('.fade.show'), '100ms: tooltip not faded active')
fat's avatar
fat committed
614
      $tooltip.trigger('mouseout')
615
    }, 100)
fat's avatar
fat committed
616
617

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
618
      assert.ok(!$('.tooltip').is('.fade.show'), '200ms: tooltip not faded active')
619
      done()
620
    }, 200)
fat's avatar
fat committed
621
622
623
624

    $tooltip.trigger('mouseenter')
  })

fat's avatar
fat committed
625
626
  QUnit.test('should not show tooltip if leave event occurs before delay expires, even if hide delay is 0', function (assert) {
    assert.expect(2)
627
    var done = assert.async()
fat's avatar
fat committed
628

fat's avatar
fat committed
629
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
fat's avatar
fat committed
630
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
631
632
633
634
635
636
      .bootstrapTooltip({
        delay: {
          show: 150,
          hide: 0
        }
      })
fat's avatar
fat committed
637
638

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
639
      assert.ok(!$('.tooltip').is('.fade.show'), '100ms: tooltip not faded active')
fat's avatar
fat committed
640
      $tooltip.trigger('mouseout')
641
    }, 100)
fat's avatar
fat committed
642
643

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
644
      assert.ok(!$('.tooltip').is('.fade.show'), '250ms: tooltip not faded active')
645
      done()
646
    }, 250)
fat's avatar
fat committed
647
648
649
650

    $tooltip.trigger('mouseenter')
  })

fat's avatar
fat committed
651
652
  QUnit.test('should wait 200ms before hiding the tooltip', function (assert) {
    assert.expect(3)
653
    var done = assert.async()
fat's avatar
fat committed
654

fat's avatar
fat committed
655
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
fat's avatar
fat committed
656
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
657
658
659
660
661
662
      .bootstrapTooltip({
        delay: {
          show: 0,
          hide: 150
        }
      })
fat's avatar
fat committed
663
664

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
665
      assert.ok($($tooltip.data('bs.tooltip').tip).is('.fade.show'), '1ms: tooltip faded active')
fat's avatar
fat committed
666
667
668
669

      $tooltip.trigger('mouseout')

      setTimeout(function () {
Starsam80's avatar
Starsam80 committed
670
        assert.ok($($tooltip.data('bs.tooltip').tip).is('.fade.show'), '100ms: tooltip still faded active')
671
      }, 100)
fat's avatar
fat committed
672
673

      setTimeout(function () {
Starsam80's avatar
Starsam80 committed
674
        assert.ok(!$($tooltip.data('bs.tooltip').tip).is('.show'), '200ms: tooltip removed')
fat's avatar
fat committed
675
        done()
676
      }, 200)
fat's avatar
fat committed
677
678
679
680
681
    }, 0)

    $tooltip.trigger('mouseenter')
  })

fat's avatar
fat committed
682
683
  QUnit.test('should not reload the tooltip on subsequent mouseenter events', function (assert) {
    assert.expect(1)
684
    var titleHtml = function () {
685
      var uid = Util.getUID('tooltip')
686
687
688
      return '<p id="tt-content">' + uid + '</p><p>' + uid + '</p><p>' + uid + '</p>'
    }

fat's avatar
fat committed
689
    var $tooltip = $('<span id="tt-outer" rel="tooltip" data-trigger="hover" data-placement="top">some text</span>')
690
691
692
693
694
695
      .appendTo('#qunit-fixture')

    $tooltip.bootstrapTooltip({
      html: true,
      animation: false,
      trigger: 'hover',
XhmikosR's avatar
XhmikosR committed
696
697
698
699
      delay: {
        show: 0,
        hide: 500
      },
700
701
702
703
704
705
706
707
708
      container: $tooltip,
      title: titleHtml
    })

    $('#tt-outer').trigger('mouseenter')

    var currentUid = $('#tt-content').text()

    $('#tt-content').trigger('mouseenter')
fat's avatar
fat committed
709
    assert.strictEqual(currentUid, $('#tt-content').text())
710
711
  })

fat's avatar
fat committed
712
713
  QUnit.test('should not reload the tooltip if the mouse leaves and re-enters before hiding', function (assert) {
    assert.expect(4)
714

715
    var titleHtml = function () {
716
      var uid = Util.getUID('tooltip')
717
718
719
      return '<p id="tt-content">' + uid + '</p><p>' + uid + '</p><p>' + uid + '</p>'
    }

fat's avatar
fat committed
720
    var $tooltip = $('<span id="tt-outer" rel="tooltip" data-trigger="hover" data-placement="top">some text</span>')
721
722
723
724
725
726
      .appendTo('#qunit-fixture')

    $tooltip.bootstrapTooltip({
      html: true,
      animation: false,
      trigger: 'hover',
XhmikosR's avatar
XhmikosR committed
727
728
729
730
      delay: {
        show: 0,
        hide: 500
      },
731
732
733
734
735
736
737
738
739
740
      title: titleHtml
    })

    var obj = $tooltip.data('bs.tooltip')

    $('#tt-outer').trigger('mouseenter')

    var currentUid = $('#tt-content').text()

    $('#tt-outer').trigger('mouseleave')
fat's avatar
fat committed
741
    assert.strictEqual(currentUid, $('#tt-content').text())
fat's avatar
fat committed
742

743
    assert.ok(obj._hoverState === 'out', 'the tooltip hoverState should be set to "out"')
744

745
    $('#tt-outer').trigger('mouseenter')
Starsam80's avatar
Starsam80 committed
746
    assert.ok(obj._hoverState === 'show', 'the tooltip hoverState should be set to "show"')
747

fat's avatar
fat committed
748
    assert.strictEqual(currentUid, $('#tt-content').text())
749
750
  })

fat's avatar
fat committed
751
  QUnit.test('should do nothing when an attempt is made to hide an uninitialized tooltip', function (assert) {
752
753
    assert.expect(1)

fat's avatar
fat committed
754
755
756
757
758
759
    var $tooltip = $('<span data-toggle="tooltip" title="some tip">some text</span>')
      .appendTo('#qunit-fixture')
      .on('hidden.bs.tooltip shown.bs.tooltip', function () {
        assert.ok(false, 'should not fire any tooltip events')
      })
      .bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
760
    assert.strictEqual(typeof $tooltip.data('bs.tooltip'), 'undefined', 'should not initialize the tooltip')
fat's avatar
fat committed
761
762
763
764
765
766
  })

  QUnit.test('should not remove tooltip if multiple triggers are set and one is still active', function (assert) {
    assert.expect(41)
    var $el = $('<button>Trigger</button>')
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
767
768
769
770
      .bootstrapTooltip({
        trigger: 'click hover focus',
        animation: false
      })
fat's avatar
fat committed
771
    var tooltip = $el.data('bs.tooltip')
772
    var $tooltip = $(tooltip.getTipElement())
fat's avatar
fat committed
773

XhmikosR's avatar
XhmikosR committed
774
775
776
    function showingTooltip() {
      return $tooltip.hasClass('show') || tooltip._hoverState === 'show'
    }
fat's avatar
fat committed
777
778

    var tests = [
XhmikosR's avatar
XhmikosR committed
779
      ['mouseenter', 'mouseleave'],
780

XhmikosR's avatar
XhmikosR committed
781
      ['focusin', 'focusout'],
fat's avatar
fat committed
782

XhmikosR's avatar
XhmikosR committed
783
      ['click', 'click'],
fat's avatar
fat committed
784

XhmikosR's avatar
XhmikosR committed
785
786
      ['mouseenter', 'focusin', 'focusout', 'mouseleave'],
      ['mouseenter', 'focusin', 'mouseleave', 'focusout'],
fat's avatar
fat committed
787

XhmikosR's avatar
XhmikosR committed
788
789
      ['focusin', 'mouseenter', 'mouseleave', 'focusout'],
      ['focusin', 'mouseenter', 'focusout', 'mouseleave'],
fat's avatar
fat committed
790

XhmikosR's avatar
XhmikosR committed
791
792
793
      ['click', 'focusin', 'mouseenter', 'focusout', 'mouseleave', 'click'],
      ['mouseenter', 'click', 'focusin', 'focusout', 'mouseleave', 'click'],
      ['mouseenter', 'focusin', 'click', 'click', 'mouseleave', 'focusout']
fat's avatar
fat committed
794
795
796
797
798
799
    ]

    assert.ok(!showingTooltip())

    $.each(tests, function (idx, triggers) {
      for (var i = 0, len = triggers.length; i < len; i++) {
800
801
        $el.trigger(triggers[i])
        assert.equal(i < len - 1, showingTooltip())
fat's avatar
fat committed
802
803
      }
    })
804
805
  })

806
807
808
809
  QUnit.test('should show on first trigger after hide', function (assert) {
    assert.expect(3)
    var $el = $('<a href="#" rel="tooltip" title="Test tooltip"/>')
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
810
811
812
813
      .bootstrapTooltip({
        trigger: 'click hover focus',
        animation: false
      })
814
815
816
817

    var tooltip = $el.data('bs.tooltip')
    var $tooltip = $(tooltip.getTipElement())

XhmikosR's avatar
XhmikosR committed
818
819
820
    function showingTooltip() {
      return $tooltip.hasClass('show') || tooltip._hoverState === 'show'
    }
821
822
823
824
825
826
827
828
829
830
831

    $el.trigger('click')
    assert.ok(showingTooltip(), 'tooltip is faded in')

    $el.bootstrapTooltip('hide')
    assert.ok(!showingTooltip(), 'tooltip was faded out')

    $el.trigger('click')
    assert.ok(showingTooltip(), 'tooltip is faded in again')
  })

832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
  QUnit.test('should hide tooltip when their containing modal is closed', function (assert) {
    assert.expect(1)
    var done = assert.async()
    var templateHTML = '<div id="modal-test" class="modal">' +
                          '<div class="modal-dialog" role="document">' +
                            '<div class="modal-content">' +
                              '<div class="modal-body">' +
                                '<a id="tooltipTest" href="#" data-toggle="tooltip" title="Some tooltip text!">Tooltip</a>' +
                              '</div>' +
                            '</div>' +
                          '</div>' +
                        '</div>'

    $(templateHTML).appendTo('#qunit-fixture')
    $('#tooltipTest')
XhmikosR's avatar
XhmikosR committed
847
848
849
      .bootstrapTooltip({
        trigger: 'manuel'
      })
850
851
852
853
854
855
856
857
858
859
860
861
862
863
      .on('shown.bs.tooltip', function () {
        $('#modal-test').modal('hide')
      })
      .on('hide.bs.tooltip', function () {
        assert.ok(true, 'tooltip hide')
        done()
      })

    $('#modal-test')
      .on('shown.bs.modal', function () {
        $('#tooltipTest').bootstrapTooltip('show')
      })
      .modal('show')
  })
864

865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
  QUnit.test('should allow to close modal if the tooltip element is detached', function (assert) {
    assert.expect(1)
    var done = assert.async()
    var templateHTML = [
      '<div id="modal-test" class="modal">',
      '  <div class="modal-dialog" role="document">',
      '    <div class="modal-content">',
      '      <div class="modal-body">',
      '        <a id="tooltipTest" href="#" data-toggle="tooltip" title="Some tooltip text!">Tooltip</a>',
      '      </div>',
      '    </div>',
      '  </div>',
      '</div>'
    ].join('')

    $(templateHTML).appendTo('#qunit-fixture')
    var $tooltip = $('#tooltipTest')
    var $modal = $('#modal-test')

    $tooltip.on('shown.bs.tooltip', function () {
      $tooltip.detach()
      $tooltip.bootstrapTooltip('dispose')
      $modal.modal('hide')
    })

    $modal.on('shown.bs.modal', function () {
      $tooltip.bootstrapTooltip({
        trigger: 'manuel'
      })
        .bootstrapTooltip('show')
    })
      .on('hidden.bs.modal', function () {
        assert.ok(true, 'modal hidden')
        done()
      })
      .modal('show')
  })

903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
  QUnit.test('should reset tip classes when hidden event triggered', function (assert) {
    assert.expect(2)
    var done = assert.async()
    var $el = $('<a href="#" rel="tooltip" title="Test tooltip"/>')
      .appendTo('#qunit-fixture')
      .bootstrapTooltip('show')
      .on('hidden.bs.tooltip', function () {
        var tooltip = $el.data('bs.tooltip')
        var $tooltip = $(tooltip.getTipElement())
        assert.ok($tooltip.hasClass('tooltip'))
        assert.ok($tooltip.hasClass('fade'))
        done()
      })

    $el.bootstrapTooltip('hide')
  })
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933

  QUnit.test('should convert number in title to string', function (assert) {
    assert.expect(1)
    var done = assert.async()
    var $el = $('<a href="#" rel="tooltip" title="7"/>')
      .appendTo('#qunit-fixture')
      .on('shown.bs.tooltip', function () {
        var tooltip = $el.data('bs.tooltip')
        var $tooltip = $(tooltip.getTipElement())
        assert.strictEqual($tooltip.children().text(), '7')
        done()
      })

    $el.bootstrapTooltip('show')
  })
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954

  QUnit.test('tooltip should be shown right away after the call of disable/enable', function (assert) {
    assert.expect(2)
    var done = assert.async()

    var $trigger = $('<a href="#" rel="tooltip" data-trigger="click" title="Another tooltip"/>')
      .appendTo('#qunit-fixture')
      .bootstrapTooltip()
      .on('shown.bs.tooltip', function () {
        assert.strictEqual($('.tooltip').hasClass('show'), true)
        done()
      })

    $trigger.bootstrapTooltip('disable')
    $trigger.trigger($.Event('click'))
    setTimeout(function () {
      assert.strictEqual($('.tooltip').length === 0, true)
      $trigger.bootstrapTooltip('enable')
      $trigger.trigger($.Event('click'))
    }, 200)
  })
Johann-S's avatar
Johann-S committed
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983

  QUnit.test('should call Popper.js to update', function (assert) {
    assert.expect(2)

    var $tooltip = $('<a href="#" rel="tooltip" data-trigger="click" title="Another tooltip"/>')
      .appendTo('#qunit-fixture')
      .bootstrapTooltip()

    var tooltip = $tooltip.data('bs.tooltip')
    tooltip.show()
    assert.ok(tooltip._popper)

    var spyPopper = sinon.spy(tooltip._popper, 'scheduleUpdate')
    tooltip.update()
    assert.ok(spyPopper.called)
  })

  QUnit.test('should not call Popper.js to update', function (assert) {
    assert.expect(1)

    var $tooltip = $('<a href="#" rel="tooltip" data-trigger="click" title="Another tooltip"/>')
      .appendTo('#qunit-fixture')
      .bootstrapTooltip()

    var tooltip = $tooltip.data('bs.tooltip')
    tooltip.update()

    assert.ok(tooltip._popper === null)
  })
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000

  QUnit.test('should use Popper.js to get the tip on placement change', function (assert) {
    assert.expect(1)

    var $tooltip = $('<a href="#" rel="tooltip" data-trigger="click" title="Another tooltip"/>')
      .appendTo('#qunit-fixture')
      .bootstrapTooltip()

    var $tipTest = $('<div class="bs-tooltip" />')
      .appendTo('#qunit-fixture')

    var tooltip = $tooltip.data('bs.tooltip')
    tooltip.tip = null

    tooltip._handlePopperPlacementChange({
      instance: {
        popper: $tipTest[0]
For faster browsing, not all history is shown. View entire blame