component-functions.spec.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import BaseComponent from '../../../src/base-component.js'
  2. import { enableDismissTrigger } from '../../../src/util/component-functions.js'
  3. import { clearFixture, createEvent, getFixture } from '../../helpers/fixture.js'
  4. class DummyClass2 extends BaseComponent {
  5. static get NAME() {
  6. return 'test'
  7. }
  8. hide() {
  9. return true
  10. }
  11. testMethod() {
  12. return true
  13. }
  14. }
  15. describe('Plugin functions', () => {
  16. let fixtureEl
  17. beforeAll(() => {
  18. fixtureEl = getFixture()
  19. })
  20. afterEach(() => {
  21. clearFixture()
  22. })
  23. describe('data-bs-dismiss functionality', () => {
  24. it('should get Plugin and execute the given method, when a click occurred on data-bs-dismiss="PluginName"', () => {
  25. fixtureEl.innerHTML = [
  26. '<div id="foo" class="test">',
  27. ' <button type="button" data-bs-dismiss="test" data-bs-target="#foo"></button>',
  28. '</div>'
  29. ].join('')
  30. const spyGet = spyOn(DummyClass2, 'getOrCreateInstance').and.callThrough()
  31. const spyTest = spyOn(DummyClass2.prototype, 'testMethod')
  32. const componentWrapper = fixtureEl.querySelector('#foo')
  33. const btnClose = fixtureEl.querySelector('[data-bs-dismiss="test"]')
  34. const event = createEvent('click')
  35. enableDismissTrigger(DummyClass2, 'testMethod')
  36. btnClose.dispatchEvent(event)
  37. expect(spyGet).toHaveBeenCalledWith(componentWrapper)
  38. expect(spyTest).toHaveBeenCalled()
  39. })
  40. it('if data-bs-dismiss="PluginName" hasn\'t got "data-bs-target", "getOrCreateInstance" has to be initialized by closest "plugin.Name" class', () => {
  41. fixtureEl.innerHTML = [
  42. '<div id="foo" class="test">',
  43. ' <button type="button" data-bs-dismiss="test"></button>',
  44. '</div>'
  45. ].join('')
  46. const spyGet = spyOn(DummyClass2, 'getOrCreateInstance').and.callThrough()
  47. const spyHide = spyOn(DummyClass2.prototype, 'hide')
  48. const componentWrapper = fixtureEl.querySelector('#foo')
  49. const btnClose = fixtureEl.querySelector('[data-bs-dismiss="test"]')
  50. const event = createEvent('click')
  51. enableDismissTrigger(DummyClass2)
  52. btnClose.dispatchEvent(event)
  53. expect(spyGet).toHaveBeenCalledWith(componentWrapper)
  54. expect(spyHide).toHaveBeenCalled()
  55. })
  56. it('if data-bs-dismiss="PluginName" is disabled, must not trigger function', () => {
  57. fixtureEl.innerHTML = [
  58. '<div id="foo" class="test">',
  59. ' <button type="button" disabled data-bs-dismiss="test"></button>',
  60. '</div>'
  61. ].join('')
  62. const spy = spyOn(DummyClass2, 'getOrCreateInstance').and.callThrough()
  63. const btnClose = fixtureEl.querySelector('[data-bs-dismiss="test"]')
  64. const event = createEvent('click')
  65. enableDismissTrigger(DummyClass2)
  66. btnClose.dispatchEvent(event)
  67. expect(spy).not.toHaveBeenCalled()
  68. })
  69. it('should prevent default when the trigger is <a> or <area>', () => {
  70. fixtureEl.innerHTML = [
  71. '<div id="foo" class="test">',
  72. ' <a type="button" data-bs-dismiss="test"></a>',
  73. '</div>'
  74. ].join('')
  75. const btnClose = fixtureEl.querySelector('[data-bs-dismiss="test"]')
  76. const event = createEvent('click')
  77. enableDismissTrigger(DummyClass2)
  78. const spy = spyOn(Event.prototype, 'preventDefault').and.callThrough()
  79. btnClose.dispatchEvent(event)
  80. expect(spy).toHaveBeenCalled()
  81. })
  82. })
  83. })