tooltip.js 29 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
21
22
    }
  })

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

28
29
30
31
32
33
  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
34
    } catch (err) {
35
36
37
38
      assert.strictEqual(err.message, 'No method named "noMethod"')
    }
  })

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

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

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

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

fat's avatar
fat committed
64
65
66
  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
67
      .bootstrapTooltip()
68
69
      .appendTo('#qunit-fixture')
      .bootstrapTooltip('show')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
70

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

fat's avatar
fat committed
73
74
75
    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')
76
77
  })

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

    $trigger.bootstrapTooltip('show')
fat's avatar
fat committed
85
    assert.ok($trigger[0].hasAttribute('aria-describedby'), 'trigger has aria-describedby')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
86
87

    $trigger.bootstrapTooltip('hide')
fat's avatar
fat committed
88
    assert.ok(!$trigger[0].hasAttribute('aria-describedby'), 'trigger does not have aria-describedby')
89
90
  })

fat's avatar
fat committed
91
92
93
  QUnit.test('should assign a unique id tooltip element', function (assert) {
    assert.expect(2)
    $('<a href="#" rel="tooltip" title="Another tooltip"/>')
94
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
95
      .bootstrapTooltip('show')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
96

XhmikosR's avatar
XhmikosR committed
97
    var id = $('.tooltip').attr('id')
98

fat's avatar
fat committed
99
100
    assert.strictEqual($('#' + id).length, 1, 'tooltip has unique id')
    assert.strictEqual(id.indexOf('tooltip'), 0, 'tooltip id has prefix')
101
102
  })

fat's avatar
fat committed
103
  QUnit.test('should place tooltips relative to placement option', function (assert) {
fat's avatar
fat committed
104
105
    assert.expect(2)
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
XhmikosR's avatar
XhmikosR committed
106
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
107
108
109
      .bootstrapTooltip({
        placement: 'bottom'
      })
XhmikosR's avatar
XhmikosR committed
110

Heinrich Fenkart's avatar
Heinrich Fenkart committed
111
    $tooltip.bootstrapTooltip('show')
112
113
114

    assert
      .ok($('.tooltip')
XhmikosR's avatar
XhmikosR committed
115
        .is('.fade.bs-tooltip-bottom.show'), 'has correct classes applied')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
116
117

    $tooltip.bootstrapTooltip('hide')
118
119

    assert.strictEqual($tooltip.data('bs.tooltip').tip.parentNode, null, 'tooltip removed')
XhmikosR's avatar
XhmikosR committed
120
121
  })

fat's avatar
fat committed
122
123
124
  QUnit.test('should allow html entities', function (assert) {
    assert.expect(2)
    var $tooltip = $('<a href="#" rel="tooltip" title="&lt;b&gt;@fat&lt;/b&gt;"/>')
XhmikosR's avatar
XhmikosR committed
125
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
126
127
128
      .bootstrapTooltip({
        html: true
      })
XhmikosR's avatar
XhmikosR committed
129

Heinrich Fenkart's avatar
Heinrich Fenkart committed
130
    $tooltip.bootstrapTooltip('show')
fat's avatar
fat committed
131
    assert.notEqual($('.tooltip b').length, 0, 'b tag was inserted')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
132
133

    $tooltip.bootstrapTooltip('hide')
134
    assert.strictEqual($tooltip.data('bs.tooltip').tip.parentNode, null, 'tooltip removed')
XhmikosR's avatar
XhmikosR committed
135
136
  })

137
138
139
140
141
  QUnit.test('should allow DOMElement title (html: false)', function (assert) {
    assert.expect(3)
    var title = document.createTextNode('<3 writing tests')
    var $tooltip = $('<a href="#" rel="tooltip"/>')
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
142
143
144
      .bootstrapTooltip({
        title: title
      })
145
146
147
148
149
150
151
152
153
154
155
156
157

    $tooltip.bootstrapTooltip('show')

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

  QUnit.test('should allow DOMElement title (html: true)', function (assert) {
    assert.expect(3)
    var title = document.createTextNode('<3 writing tests')
    var $tooltip = $('<a href="#" rel="tooltip"/>')
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
158
159
160
161
      .bootstrapTooltip({
        html: true,
        title: title
      })
162
163
164
165
166
167
168
169

    $tooltip.bootstrapTooltip('show')

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

fat's avatar
fat committed
170
171
172
  QUnit.test('should respect custom classes', function (assert) {
    assert.expect(2)
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
XhmikosR's avatar
XhmikosR committed
173
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
174
175
176
      .bootstrapTooltip({
        template: '<div class="tooltip some-class"><div class="tooltip-arrow"/><div class="tooltip-inner"/></div>'
      })
XhmikosR's avatar
XhmikosR committed
177

Heinrich Fenkart's avatar
Heinrich Fenkart committed
178
    $tooltip.bootstrapTooltip('show')
fat's avatar
fat committed
179
    assert.ok($('.tooltip').hasClass('some-class'), 'custom class is present')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
180
181

    $tooltip.bootstrapTooltip('hide')
182
    assert.strictEqual($tooltip.data('bs.tooltip').tip.parentNode, null, 'tooltip removed')
XhmikosR's avatar
XhmikosR committed
183
184
  })

fat's avatar
fat committed
185
186
  QUnit.test('should fire show event', function (assert) {
    assert.expect(1)
187
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
188

fat's avatar
fat committed
189
    $('<div title="tooltip title"/>')
XhmikosR's avatar
XhmikosR committed
190
      .on('show.bs.tooltip', function () {
fat's avatar
fat committed
191
        assert.ok(true, 'show event fired')
192
        done()
XhmikosR's avatar
XhmikosR committed
193
      })
194
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
195
196
  })

197
198
199
200
201
202
  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
203
    } catch (err) {
204
205
206
207
208
      assert.strictEqual(err.message, 'Please use show on visible elements')
      done()
    }
  })

fat's avatar
fat committed
209
210
  QUnit.test('should fire inserted event', function (assert) {
    assert.expect(2)
211
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
212

fat's avatar
fat committed
213
    $('<div title="tooltip title"/>')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
214
      .appendTo('#qunit-fixture')
fat's avatar
fat committed
215
216
217
      .on('inserted.bs.tooltip', function () {
        assert.notEqual($('.tooltip').length, 0, 'tooltip was inserted')
        assert.ok(true, 'inserted event fired')
218
        done()
XhmikosR's avatar
XhmikosR committed
219
      })
220
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
221
222
  })

fat's avatar
fat committed
223
224
  QUnit.test('should fire shown event', function (assert) {
    assert.expect(1)
225
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
226

fat's avatar
fat committed
227
    $('<div title="tooltip title"></div>')
228
      .appendTo('#qunit-fixture')
fat's avatar
fat committed
229
230
231
232
233
234
235
236
237
238
239
240
      .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
241
242
      .on('show.bs.tooltip', function (e) {
        e.preventDefault()
fat's avatar
fat committed
243
        assert.ok(true, 'show event fired')
244
        done()
XhmikosR's avatar
XhmikosR committed
245
246
      })
      .on('shown.bs.tooltip', function () {
fat's avatar
fat committed
247
        assert.ok(false, 'shown event fired')
XhmikosR's avatar
XhmikosR committed
248
      })
249
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
250
251
  })

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

fat's avatar
fat committed
256
    $('<div title="tooltip title"/>')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
257
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
258
      .on('shown.bs.tooltip', function () {
259
        $(this).bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
260
261
      })
      .on('hide.bs.tooltip', function () {
fat's avatar
fat committed
262
        assert.ok(true, 'hide event fired')
263
        done()
XhmikosR's avatar
XhmikosR committed
264
      })
265
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
266
267
  })

fat's avatar
fat committed
268
269
  QUnit.test('should fire hidden event', function (assert) {
    assert.expect(1)
270
    var done = assert.async()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
271

fat's avatar
fat committed
272
    $('<div title="tooltip title"/>')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
273
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
274
      .on('shown.bs.tooltip', function () {
275
        $(this).bootstrapTooltip('hide')
XhmikosR's avatar
XhmikosR committed
276
277
      })
      .on('hidden.bs.tooltip', function () {
fat's avatar
fat committed
278
        assert.ok(true, 'hidden event fired')
279
        done()
XhmikosR's avatar
XhmikosR committed
280
      })
281
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
282
283
  })

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

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

fat's avatar
fat committed
304
305
306
  QUnit.test('should destroy tooltip', function (assert) {
    assert.expect(7)
    var $tooltip = $('<div/>')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
307
      .bootstrapTooltip()
XhmikosR's avatar
XhmikosR committed
308
      .on('click.foo', function () {})  // eslint-disable-line no-empty-function
Heinrich Fenkart's avatar
Heinrich Fenkart committed
309

fat's avatar
fat committed
310
311
312
    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
313
314

    $tooltip.bootstrapTooltip('show')
fat's avatar
fat committed
315
    $tooltip.bootstrapTooltip('dispose')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
316

Starsam80's avatar
Starsam80 committed
317
    assert.ok(!$tooltip.hasClass('show'), 'tooltip is hidden')
fat's avatar
fat committed
318
319
320
    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
321
322
  })

323
324
325
326
327
328
329
330
  // 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
331

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

335
336
337
  //   $div.find('a').trigger('click')
  //   assert.strictEqual($div.data('bs.tooltip').tip.parentNode, null, 'tooltip removed')
  // })
XhmikosR's avatar
XhmikosR committed
338

fat's avatar
fat committed
339
340
341
  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
342
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
343
344
345
      .bootstrapTooltip({
        trigger: 'manual'
      })
346
      .bootstrapTooltip('toggle')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
347

Starsam80's avatar
Starsam80 committed
348
    assert.ok($('.tooltip').is('.fade.show'), 'tooltip is faded active')
XhmikosR's avatar
XhmikosR committed
349
350
  })

fat's avatar
fat committed
351
352
  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
353
    $('<a href="#" rel="tooltip" title="tooltip on toggle">@ResentedHook</a>')
354
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
355
356
357
      .bootstrapTooltip({
        trigger: 'manual'
      })
Heinrich Fenkart's avatar
Heinrich Fenkart committed
358
359
360
      .bootstrapTooltip('show')

    $('.tooltip').bootstrapTooltip('toggle')
Starsam80's avatar
Starsam80 committed
361
    assert.ok($('.tooltip').not('.fade.show'), 'tooltip was faded out')
362
363
  })

fat's avatar
fat committed
364
365
366
  QUnit.test('should place tooltips inside body when container is body', function (assert) {
    assert.expect(3)
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
XhmikosR's avatar
XhmikosR committed
367
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
368
369
370
      .bootstrapTooltip({
        container: 'body'
      })
371
      .bootstrapTooltip('show')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
372

fat's avatar
fat committed
373
374
    assert.notEqual($('body > .tooltip').length, 0, 'tooltip is direct descendant of body')
    assert.strictEqual($('#qunit-fixture > .tooltip').length, 0, 'tooltip is not in parent')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
375
376

    $tooltip.bootstrapTooltip('hide')
fat's avatar
fat committed
377
    assert.strictEqual($('body > .tooltip').length, 0, 'tooltip was removed from dom')
XhmikosR's avatar
XhmikosR committed
378
379
  })

fat's avatar
fat committed
380
  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
381
382
    assert.expect(2)
    var done = assert.async()
XhmikosR's avatar
XhmikosR committed
383
384
385
386
    var styles = '<style>' +
      '.bs-tooltip-right { white-space: nowrap; }' +
      '.bs-tooltip-right .tooltip-inner { max-width: none; }' +
      '</style>'
387
    var $styles = $(styles).appendTo('head')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
388

fat's avatar
fat committed
389
    var $container = $('<div/>').appendTo('#qunit-fixture')
Johann-S's avatar
Johann-S committed
390
    $('<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
391
392
      .appendTo($container)
      .bootstrapTooltip({
Johann-S's avatar
Johann-S committed
393
394
395
396
397
398
        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
399
        assert.ok(typeof $tooltip.attr('style') === 'undefined')
Johann-S's avatar
Johann-S committed
400
401
        $styles.remove()
        done()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
402
403
      })
      .bootstrapTooltip('show')
XhmikosR's avatar
XhmikosR committed
404
405
  })

fat's avatar
fat committed
406
407
408
  QUnit.test('should use title attribute for tooltip text', function (assert) {
    assert.expect(2)
    var $tooltip = $('<a href="#" rel="tooltip" title="Simple tooltip"/>')
XhmikosR's avatar
XhmikosR committed
409
      .appendTo('#qunit-fixture')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
410
411
412
      .bootstrapTooltip()

    $tooltip.bootstrapTooltip('show')
fat's avatar
fat committed
413
    assert.strictEqual($('.tooltip').children('.tooltip-inner').text(), 'Simple tooltip', 'title from title attribute is set')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
414
415

    $tooltip.bootstrapTooltip('hide')
fat's avatar
fat committed
416
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
XhmikosR's avatar
XhmikosR committed
417
418
  })

fat's avatar
fat committed
419
420
421
  QUnit.test('should prefer title attribute over title option', function (assert) {
    assert.expect(2)
    var $tooltip = $('<a href="#" rel="tooltip" title="Simple tooltip"/>')
XhmikosR's avatar
XhmikosR committed
422
      .appendTo('#qunit-fixture')
423
      .bootstrapTooltip({
XhmikosR's avatar
XhmikosR committed
424
425
        title: 'This is a tooltip with some content'
      })
Heinrich Fenkart's avatar
Heinrich Fenkart committed
426
427

    $tooltip.bootstrapTooltip('show')
fat's avatar
fat committed
428
    assert.strictEqual($('.tooltip').children('.tooltip-inner').text(), 'Simple tooltip', 'title is set from title attribute while preferred over title option')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
429
430

    $tooltip.bootstrapTooltip('hide')
fat's avatar
fat committed
431
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
XhmikosR's avatar
XhmikosR committed
432
433
  })

fat's avatar
fat committed
434
435
436
  QUnit.test('should use title option', function (assert) {
    assert.expect(2)
    var $tooltip = $('<a href="#" rel="tooltip"/>')
XhmikosR's avatar
XhmikosR committed
437
      .appendTo('#qunit-fixture')
438
      .bootstrapTooltip({
XhmikosR's avatar
XhmikosR committed
439
440
        title: 'This is a tooltip with some content'
      })
Heinrich Fenkart's avatar
Heinrich Fenkart committed
441
442

    $tooltip.bootstrapTooltip('show')
fat's avatar
fat committed
443
    assert.strictEqual($('.tooltip').children('.tooltip-inner').text(), 'This is a tooltip with some content', 'title from title option is set')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
444
445

    $tooltip.bootstrapTooltip('hide')
fat's avatar
fat committed
446
    assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
447
448
  })

449
  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
450
    assert.expect(1)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
451
    var passed = true
fat's avatar
fat committed
452
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
453
      .appendTo('#qunit-fixture')
Chris Rebert's avatar
Chris Rebert committed
454
      .one('show.bs.tooltip', function () {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
455
        $(this).remove()
Chris Rebert's avatar
Chris Rebert committed
456
      })
XhmikosR's avatar
XhmikosR committed
457
458
459
      .bootstrapTooltip({
        placement: 'top'
      })
Chris Rebert's avatar
Chris Rebert committed
460
461

    try {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
462
463
      $tooltip.bootstrapTooltip('show')
    } catch (err) {
Chris Rebert's avatar
Chris Rebert committed
464
465
466
467
      passed = false
      console.log(err)
    }

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

fat's avatar
fat committed
471
472
  QUnit.test('should place tooltip on top of element', function (assert) {
    assert.expect(1)
473
    var done = assert.async()
fat's avatar
fat committed
474

XhmikosR's avatar
XhmikosR committed
475
476
477
478
479
    var containerHTML = '<div id="test">' +
        '<p style="margin-top: 200px">' +
        '<a href="#" title="very very very very very very very long tooltip">Hover me</a>' +
        '</p>' +
        '</div>'
fat's avatar
fat committed
480
481
482
483
484
485
486
487
488
489
490
491

    var $container = $(containerHTML)
      .css({
        position: 'absolute',
        bottom: 0,
        left: 0,
        textAlign: 'right',
        width: 300,
        height: 300
      })
      .appendTo('#qunit-fixture')

492
    $container
fat's avatar
fat committed
493
494
495
      .find('a')
      .css('margin-top', 200)
      .bootstrapTooltip({
fat's avatar
fat committed
496
        placement: 'top',
fat's avatar
fat committed
497
498
        animate: false
      })
499
500
      .on('shown.bs.tooltip', function () {
        var $tooltip = $($(this).data('bs.tooltip').tip)
Johann-S's avatar
Johann-S committed
501
502
        if (/iPhone|iPad|iPod/.test(navigator.userAgent)) {
          assert.ok(Math.round($tooltip.offset().top + $tooltip.outerHeight()) <= Math.round($(this).offset().top))
XhmikosR's avatar
XhmikosR committed
503
        } else {
Johann-S's avatar
Johann-S committed
504
505
          assert.ok(Math.round($tooltip.offset().top + $tooltip.outerHeight()) >= Math.round($(this).offset().top))
        }
506
        done()
Johann-S's avatar
Johann-S committed
507
      })
508
      .bootstrapTooltip('show')
fat's avatar
fat committed
509
510
  })

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

fat's avatar
fat committed
515
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
fat's avatar
fat committed
516
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
517
518
519
      .bootstrapTooltip({
        delay: 150
      })
fat's avatar
fat committed
520
521

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
522
      assert.ok(!$('.tooltip').is('.fade.show'), '100ms: tooltip is not faded active')
523
    }, 100)
fat's avatar
fat committed
524
525

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
526
      assert.ok($('.tooltip').is('.fade.show'), '200ms: tooltip is faded active')
527
      done()
528
    }, 200)
fat's avatar
fat committed
529
530
531
532

    $tooltip.trigger('mouseenter')
  })

fat's avatar
fat committed
533
534
  QUnit.test('should not show tooltip if leave event occurs before delay expires', function (assert) {
    assert.expect(2)
535
    var done = assert.async()
fat's avatar
fat committed
536

fat's avatar
fat committed
537
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
fat's avatar
fat committed
538
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
539
540
541
      .bootstrapTooltip({
        delay: 150
      })
fat's avatar
fat committed
542
543

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
544
      assert.ok(!$('.tooltip').is('.fade.show'), '100ms: tooltip not faded active')
fat's avatar
fat committed
545
      $tooltip.trigger('mouseout')
546
    }, 100)
fat's avatar
fat committed
547
548

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
549
      assert.ok(!$('.tooltip').is('.fade.show'), '200ms: tooltip not faded active')
550
      done()
551
    }, 200)
fat's avatar
fat committed
552
553
554
555

    $tooltip.trigger('mouseenter')
  })

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

fat's avatar
fat committed
560
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
fat's avatar
fat committed
561
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
562
563
564
565
566
567
      .bootstrapTooltip({
        delay: {
          show: 0,
          hide: 150
        }
      })
fat's avatar
fat committed
568
569

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
570
      assert.ok($('.tooltip').is('.fade.show'), '1ms: tooltip faded active')
fat's avatar
fat committed
571
572
573
      $tooltip.trigger('mouseout')

      setTimeout(function () {
Starsam80's avatar
Starsam80 committed
574
        assert.ok($('.tooltip').is('.fade.show'), '100ms: tooltip still faded active')
fat's avatar
fat committed
575
        $tooltip.trigger('mouseenter')
576
      }, 100)
fat's avatar
fat committed
577
578

      setTimeout(function () {
Starsam80's avatar
Starsam80 committed
579
        assert.ok($('.tooltip').is('.fade.show'), '200ms: tooltip still faded active')
580
        done()
581
      }, 200)
fat's avatar
fat committed
582
583
584
585
586
    }, 0)

    $tooltip.trigger('mouseenter')
  })

fat's avatar
fat committed
587
588
  QUnit.test('should not show tooltip if leave event occurs before delay expires', function (assert) {
    assert.expect(2)
589
    var done = assert.async()
fat's avatar
fat committed
590

fat's avatar
fat committed
591
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
fat's avatar
fat committed
592
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
593
594
595
      .bootstrapTooltip({
        delay: 150
      })
fat's avatar
fat committed
596
597

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
598
      assert.ok(!$('.tooltip').is('.fade.show'), '100ms: tooltip not faded active')
fat's avatar
fat committed
599
      $tooltip.trigger('mouseout')
600
    }, 100)
fat's avatar
fat committed
601
602

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
603
      assert.ok(!$('.tooltip').is('.fade.show'), '200ms: tooltip not faded active')
604
      done()
605
    }, 200)
fat's avatar
fat committed
606
607
608
609

    $tooltip.trigger('mouseenter')
  })

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

fat's avatar
fat committed
614
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
fat's avatar
fat committed
615
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
616
617
618
619
620
621
      .bootstrapTooltip({
        delay: {
          show: 150,
          hide: 0
        }
      })
fat's avatar
fat committed
622
623

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
624
      assert.ok(!$('.tooltip').is('.fade.show'), '100ms: tooltip not faded active')
fat's avatar
fat committed
625
      $tooltip.trigger('mouseout')
626
    }, 100)
fat's avatar
fat committed
627
628

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
629
      assert.ok(!$('.tooltip').is('.fade.show'), '250ms: tooltip not faded active')
630
      done()
631
    }, 250)
fat's avatar
fat committed
632
633
634
635

    $tooltip.trigger('mouseenter')
  })

fat's avatar
fat committed
636
637
  QUnit.test('should wait 200ms before hiding the tooltip', function (assert) {
    assert.expect(3)
638
    var done = assert.async()
fat's avatar
fat committed
639

fat's avatar
fat committed
640
    var $tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"/>')
fat's avatar
fat committed
641
      .appendTo('#qunit-fixture')
XhmikosR's avatar
XhmikosR committed
642
643
644
645
646
647
      .bootstrapTooltip({
        delay: {
          show: 0,
          hide: 150
        }
      })
fat's avatar
fat committed
648
649

    setTimeout(function () {
Starsam80's avatar
Starsam80 committed
650
      assert.ok($($tooltip.data('bs.tooltip').tip).is('.fade.show'), '1ms: tooltip faded active')
fat's avatar
fat committed
651
652
653
654

      $tooltip.trigger('mouseout')

      setTimeout(function () {
Starsam80's avatar
Starsam80 committed
655
        assert.ok($($tooltip.data('bs.tooltip').tip).is('.fade.show'), '100ms: tooltip still faded active')
656
      }, 100)
fat's avatar
fat committed
657
658

      setTimeout(function () {
Starsam80's avatar
Starsam80 committed
659
        assert.ok(!$($tooltip.data('bs.tooltip').tip).is('.show'), '200ms: tooltip removed')
fat's avatar
fat committed
660
        done()
661
      }, 200)
fat's avatar
fat committed
662
663
664
665
666
    }, 0)

    $tooltip.trigger('mouseenter')
  })

fat's avatar
fat committed
667
668
  QUnit.test('should not reload the tooltip on subsequent mouseenter events', function (assert) {
    assert.expect(1)
669
    var titleHtml = function () {
670
      var uid = Util.getUID('tooltip')
671
672
673
      return '<p id="tt-content">' + uid + '</p><p>' + uid + '</p><p>' + uid + '</p>'
    }

fat's avatar
fat committed
674
    var $tooltip = $('<span id="tt-outer" rel="tooltip" data-trigger="hover" data-placement="top">some text</span>')
675
676
677
678
679
680
      .appendTo('#qunit-fixture')

    $tooltip.bootstrapTooltip({
      html: true,
      animation: false,
      trigger: 'hover',
XhmikosR's avatar
XhmikosR committed
681
682
683
684
      delay: {
        show: 0,
        hide: 500
      },
685
686
687
688
689
690
691
692
693
      container: $tooltip,
      title: titleHtml
    })

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

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

    $('#tt-content').trigger('mouseenter')
fat's avatar
fat committed
694
    assert.strictEqual(currentUid, $('#tt-content').text())
695
696
  })

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

700
    var titleHtml = function () {
701
      var uid = Util.getUID('tooltip')
702
703
704
      return '<p id="tt-content">' + uid + '</p><p>' + uid + '</p><p>' + uid + '</p>'
    }

fat's avatar
fat committed
705
    var $tooltip = $('<span id="tt-outer" rel="tooltip" data-trigger="hover" data-placement="top">some text</span>')
706
707
708
709
710
711
      .appendTo('#qunit-fixture')

    $tooltip.bootstrapTooltip({
      html: true,
      animation: false,
      trigger: 'hover',
XhmikosR's avatar
XhmikosR committed
712
713
714
715
      delay: {
        show: 0,
        hide: 500
      },
716
717
718
719
720
721
722
723
724
725
      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
726
    assert.strictEqual(currentUid, $('#tt-content').text())
fat's avatar
fat committed
727

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

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

fat's avatar
fat committed
733
    assert.strictEqual(currentUid, $('#tt-content').text())
734
735
  })

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

fat's avatar
fat committed
739
740
741
742
743
744
    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
745
    assert.strictEqual(typeof $tooltip.data('bs.tooltip'), 'undefined', 'should not initialize the tooltip')
fat's avatar
fat committed
746
747
748
749
750
751
  })

  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
752
753
754
755
      .bootstrapTooltip({
        trigger: 'click hover focus',
        animation: false
      })
fat's avatar
fat committed
756
    var tooltip = $el.data('bs.tooltip')
757
    var $tooltip = $(tooltip.getTipElement())
fat's avatar
fat committed
758

XhmikosR's avatar
XhmikosR committed
759
760
761
    function showingTooltip() {
      return $tooltip.hasClass('show') || tooltip._hoverState === 'show'
    }
fat's avatar
fat committed
762
763

    var tests = [
XhmikosR's avatar
XhmikosR committed
764
      ['mouseenter', 'mouseleave'],
765

XhmikosR's avatar
XhmikosR committed
766
      ['focusin', 'focusout'],
fat's avatar
fat committed
767

XhmikosR's avatar
XhmikosR committed
768
      ['click', 'click'],
fat's avatar
fat committed
769

XhmikosR's avatar
XhmikosR committed
770
771
      ['mouseenter', 'focusin', 'focusout', 'mouseleave'],
      ['mouseenter', 'focusin', 'mouseleave', 'focusout'],
fat's avatar
fat committed
772

XhmikosR's avatar
XhmikosR committed
773
774
      ['focusin', 'mouseenter', 'mouseleave', 'focusout'],
      ['focusin', 'mouseenter', 'focusout', 'mouseleave'],
fat's avatar
fat committed
775

XhmikosR's avatar
XhmikosR committed
776
777
778
      ['click', 'focusin', 'mouseenter', 'focusout', 'mouseleave', 'click'],
      ['mouseenter', 'click', 'focusin', 'focusout', 'mouseleave', 'click'],
      ['mouseenter', 'focusin', 'click', 'click', 'mouseleave', 'focusout']
fat's avatar
fat committed
779
780
781
782
783
784
    ]

    assert.ok(!showingTooltip())

    $.each(tests, function (idx, triggers) {
      for (var i = 0, len = triggers.length; i < len; i++) {
785
786
        $el.trigger(triggers[i])
        assert.equal(i < len - 1, showingTooltip())
fat's avatar
fat committed
787
788
      }
    })
789
790
  })

791
792
793
794
  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
795
796
797
798
      .bootstrapTooltip({
        trigger: 'click hover focus',
        animation: false
      })
799
800
801
802

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

XhmikosR's avatar
XhmikosR committed
803
804
805
    function showingTooltip() {
      return $tooltip.hasClass('show') || tooltip._hoverState === 'show'
    }
806
807
808
809
810
811
812
813
814
815
816

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

817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
  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
832
833
834
      .bootstrapTooltip({
        trigger: 'manuel'
      })
835
836
837
838
839
840
841
842
843
844
845
846
847
848
      .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')
  })
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865

  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')
  })
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881

  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')
      .bootstrapTooltip('show')
      .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')
  })
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902

  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)
  })
903
})