button.spec.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. import Button from '../../src/button'
  2. /** Test helpers */
  3. import {
  4. getFixture,
  5. clearFixture,
  6. jQueryMock
  7. } from '../helpers/fixture'
  8. describe('Button', () => {
  9. let fixtureEl
  10. beforeAll(() => {
  11. fixtureEl = getFixture()
  12. })
  13. afterEach(() => {
  14. clearFixture()
  15. })
  16. it('should take care of element either passed as a CSS selector or DOM element', () => {
  17. fixtureEl.innerHTML = '<button data-bs-toggle="button">Placeholder</button>'
  18. const buttonEl = fixtureEl.querySelector('[data-bs-toggle="button"]')
  19. const buttonBySelector = new Button('[data-bs-toggle="button"]')
  20. const buttonByElement = new Button(buttonEl)
  21. expect(buttonBySelector._element).toEqual(buttonEl)
  22. expect(buttonByElement._element).toEqual(buttonEl)
  23. })
  24. describe('VERSION', () => {
  25. it('should return plugin version', () => {
  26. expect(Button.VERSION).toEqual(jasmine.any(String))
  27. })
  28. })
  29. describe('DATA_KEY', () => {
  30. it('should return plugin data key', () => {
  31. expect(Button.DATA_KEY).toEqual('bs.button')
  32. })
  33. })
  34. describe('data-api', () => {
  35. it('should toggle active class on click', () => {
  36. fixtureEl.innerHTML = [
  37. '<button class="btn" data-bs-toggle="button">btn</button>',
  38. '<button class="btn testParent" data-bs-toggle="button"><div class="test"></div></button>'
  39. ].join('')
  40. const btn = fixtureEl.querySelector('.btn')
  41. const divTest = fixtureEl.querySelector('.test')
  42. const btnTestParent = fixtureEl.querySelector('.testParent')
  43. expect(btn.classList.contains('active')).toEqual(false)
  44. btn.click()
  45. expect(btn.classList.contains('active')).toEqual(true)
  46. btn.click()
  47. expect(btn.classList.contains('active')).toEqual(false)
  48. divTest.click()
  49. expect(btnTestParent.classList.contains('active')).toEqual(true)
  50. })
  51. })
  52. describe('toggle', () => {
  53. it('should toggle aria-pressed', () => {
  54. fixtureEl.innerHTML = '<button class="btn" data-bs-toggle="button" aria-pressed="false"></button>'
  55. const btnEl = fixtureEl.querySelector('.btn')
  56. const button = new Button(btnEl)
  57. expect(btnEl.getAttribute('aria-pressed')).toEqual('false')
  58. expect(btnEl.classList.contains('active')).toEqual(false)
  59. button.toggle()
  60. expect(btnEl.getAttribute('aria-pressed')).toEqual('true')
  61. expect(btnEl.classList.contains('active')).toEqual(true)
  62. })
  63. })
  64. describe('dispose', () => {
  65. it('should dispose a button', () => {
  66. fixtureEl.innerHTML = '<button class="btn" data-bs-toggle="button"></button>'
  67. const btnEl = fixtureEl.querySelector('.btn')
  68. const button = new Button(btnEl)
  69. expect(Button.getInstance(btnEl)).not.toBeNull()
  70. button.dispose()
  71. expect(Button.getInstance(btnEl)).toBeNull()
  72. })
  73. })
  74. describe('jQueryInterface', () => {
  75. it('should handle config passed and toggle existing button', () => {
  76. fixtureEl.innerHTML = '<button class="btn" data-bs-toggle="button"></button>'
  77. const btnEl = fixtureEl.querySelector('.btn')
  78. const button = new Button(btnEl)
  79. spyOn(button, 'toggle')
  80. jQueryMock.fn.button = Button.jQueryInterface
  81. jQueryMock.elements = [btnEl]
  82. jQueryMock.fn.button.call(jQueryMock, 'toggle')
  83. expect(button.toggle).toHaveBeenCalled()
  84. })
  85. it('should create new button instance and call toggle', () => {
  86. fixtureEl.innerHTML = '<button class="btn" data-bs-toggle="button"></button>'
  87. const btnEl = fixtureEl.querySelector('.btn')
  88. jQueryMock.fn.button = Button.jQueryInterface
  89. jQueryMock.elements = [btnEl]
  90. jQueryMock.fn.button.call(jQueryMock, 'toggle')
  91. expect(Button.getInstance(btnEl)).not.toBeNull()
  92. expect(btnEl.classList.contains('active')).toEqual(true)
  93. })
  94. it('should just create a button instance without calling toggle', () => {
  95. fixtureEl.innerHTML = '<button class="btn" data-bs-toggle="button"></button>'
  96. const btnEl = fixtureEl.querySelector('.btn')
  97. jQueryMock.fn.button = Button.jQueryInterface
  98. jQueryMock.elements = [btnEl]
  99. jQueryMock.fn.button.call(jQueryMock)
  100. expect(Button.getInstance(btnEl)).not.toBeNull()
  101. expect(btnEl.classList.contains('active')).toEqual(false)
  102. })
  103. })
  104. describe('getInstance', () => {
  105. it('should return button instance', () => {
  106. fixtureEl.innerHTML = '<div></div>'
  107. const div = fixtureEl.querySelector('div')
  108. const button = new Button(div)
  109. expect(Button.getInstance(div)).toEqual(button)
  110. expect(Button.getInstance(div)).toBeInstanceOf(Button)
  111. })
  112. it('should return null when there is no button instance', () => {
  113. fixtureEl.innerHTML = '<div></div>'
  114. const div = fixtureEl.querySelector('div')
  115. expect(Button.getInstance(div)).toEqual(null)
  116. })
  117. })
  118. describe('getOrCreateInstance', () => {
  119. it('should return button instance', () => {
  120. fixtureEl.innerHTML = '<div></div>'
  121. const div = fixtureEl.querySelector('div')
  122. const button = new Button(div)
  123. expect(Button.getOrCreateInstance(div)).toEqual(button)
  124. expect(Button.getInstance(div)).toEqual(Button.getOrCreateInstance(div, {}))
  125. expect(Button.getOrCreateInstance(div)).toBeInstanceOf(Button)
  126. })
  127. it('should return new instance when there is no button instance', () => {
  128. fixtureEl.innerHTML = '<div></div>'
  129. const div = fixtureEl.querySelector('div')
  130. expect(Button.getInstance(div)).toEqual(null)
  131. expect(Button.getOrCreateInstance(div)).toBeInstanceOf(Button)
  132. })
  133. })
  134. })