alert.spec.js 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. import Alert from '../../src/alert.js'
  2. import { getTransitionDurationFromElement } from '../../src/util/index.js'
  3. import { clearFixture, getFixture, jQueryMock } from '../helpers/fixture.js'
  4. describe('Alert', () => {
  5. let fixtureEl
  6. beforeAll(() => {
  7. fixtureEl = getFixture()
  8. })
  9. afterEach(() => {
  10. clearFixture()
  11. })
  12. it('should take care of element either passed as a CSS selector or DOM element', () => {
  13. fixtureEl.innerHTML = '<div class="alert"></div>'
  14. const alertEl = fixtureEl.querySelector('.alert')
  15. const alertBySelector = new Alert('.alert')
  16. const alertByElement = new Alert(alertEl)
  17. expect(alertBySelector._element).toEqual(alertEl)
  18. expect(alertByElement._element).toEqual(alertEl)
  19. })
  20. it('should return version', () => {
  21. expect(Alert.VERSION).toEqual(jasmine.any(String))
  22. })
  23. describe('DATA_KEY', () => {
  24. it('should return plugin data key', () => {
  25. expect(Alert.DATA_KEY).toEqual('bs.alert')
  26. })
  27. })
  28. describe('data-api', () => {
  29. it('should close an alert without instantiating it manually', () => {
  30. fixtureEl.innerHTML = [
  31. '<div class="alert">',
  32. ' <button type="button" data-bs-dismiss="alert">x</button>',
  33. '</div>'
  34. ].join('')
  35. const button = document.querySelector('button')
  36. button.click()
  37. expect(document.querySelectorAll('.alert')).toHaveSize(0)
  38. })
  39. it('should close an alert without instantiating it manually with the parent selector', () => {
  40. fixtureEl.innerHTML = [
  41. '<div class="alert">',
  42. ' <button type="button" data-bs-target=".alert" data-bs-dismiss="alert">x</button>',
  43. '</div>'
  44. ].join('')
  45. const button = document.querySelector('button')
  46. button.click()
  47. expect(document.querySelectorAll('.alert')).toHaveSize(0)
  48. })
  49. })
  50. describe('close', () => {
  51. it('should close an alert', () => {
  52. return new Promise(resolve => {
  53. const spy = jasmine.createSpy('spy', getTransitionDurationFromElement)
  54. fixtureEl.innerHTML = '<div class="alert"></div>'
  55. const alertEl = document.querySelector('.alert')
  56. const alert = new Alert(alertEl)
  57. alertEl.addEventListener('closed.bs.alert', () => {
  58. expect(document.querySelectorAll('.alert')).toHaveSize(0)
  59. expect(spy).not.toHaveBeenCalled()
  60. resolve()
  61. })
  62. alert.close()
  63. })
  64. })
  65. it('should close alert with fade class', () => {
  66. return new Promise(resolve => {
  67. fixtureEl.innerHTML = '<div class="alert fade"></div>'
  68. const alertEl = document.querySelector('.alert')
  69. const alert = new Alert(alertEl)
  70. alertEl.addEventListener('transitionend', () => {
  71. expect().nothing()
  72. })
  73. alertEl.addEventListener('closed.bs.alert', () => {
  74. expect(document.querySelectorAll('.alert')).toHaveSize(0)
  75. resolve()
  76. })
  77. alert.close()
  78. })
  79. })
  80. it('should not remove alert if close event is prevented', () => {
  81. return new Promise((resolve, reject) => {
  82. fixtureEl.innerHTML = '<div class="alert"></div>'
  83. const getAlert = () => document.querySelector('.alert')
  84. const alertEl = getAlert()
  85. const alert = new Alert(alertEl)
  86. alertEl.addEventListener('close.bs.alert', event => {
  87. event.preventDefault()
  88. setTimeout(() => {
  89. expect(getAlert()).not.toBeNull()
  90. resolve()
  91. }, 10)
  92. })
  93. alertEl.addEventListener('closed.bs.alert', () => {
  94. reject(new Error('should not fire closed event'))
  95. })
  96. alert.close()
  97. })
  98. })
  99. })
  100. describe('dispose', () => {
  101. it('should dispose an alert', () => {
  102. fixtureEl.innerHTML = '<div class="alert"></div>'
  103. const alertEl = document.querySelector('.alert')
  104. const alert = new Alert(alertEl)
  105. expect(Alert.getInstance(alertEl)).not.toBeNull()
  106. alert.dispose()
  107. expect(Alert.getInstance(alertEl)).toBeNull()
  108. })
  109. })
  110. describe('jQueryInterface', () => {
  111. it('should handle config passed and toggle existing alert', () => {
  112. fixtureEl.innerHTML = '<div class="alert"></div>'
  113. const alertEl = fixtureEl.querySelector('.alert')
  114. const alert = new Alert(alertEl)
  115. const spy = spyOn(alert, 'close')
  116. jQueryMock.fn.alert = Alert.jQueryInterface
  117. jQueryMock.elements = [alertEl]
  118. jQueryMock.fn.alert.call(jQueryMock, 'close')
  119. expect(spy).toHaveBeenCalled()
  120. })
  121. it('should create new alert instance and call close', () => {
  122. fixtureEl.innerHTML = '<div class="alert"></div>'
  123. const alertEl = fixtureEl.querySelector('.alert')
  124. jQueryMock.fn.alert = Alert.jQueryInterface
  125. jQueryMock.elements = [alertEl]
  126. expect(Alert.getInstance(alertEl)).toBeNull()
  127. jQueryMock.fn.alert.call(jQueryMock, 'close')
  128. expect(fixtureEl.querySelector('.alert')).toBeNull()
  129. })
  130. it('should just create an alert instance without calling close', () => {
  131. fixtureEl.innerHTML = '<div class="alert"></div>'
  132. const alertEl = fixtureEl.querySelector('.alert')
  133. jQueryMock.fn.alert = Alert.jQueryInterface
  134. jQueryMock.elements = [alertEl]
  135. jQueryMock.fn.alert.call(jQueryMock)
  136. expect(Alert.getInstance(alertEl)).not.toBeNull()
  137. expect(fixtureEl.querySelector('.alert')).not.toBeNull()
  138. })
  139. it('should throw an error on undefined method', () => {
  140. fixtureEl.innerHTML = '<div></div>'
  141. const div = fixtureEl.querySelector('div')
  142. const action = 'undefinedMethod'
  143. jQueryMock.fn.alert = Alert.jQueryInterface
  144. jQueryMock.elements = [div]
  145. expect(() => {
  146. jQueryMock.fn.alert.call(jQueryMock, action)
  147. }).toThrowError(TypeError, `No method named "${action}"`)
  148. })
  149. it('should throw an error on protected method', () => {
  150. fixtureEl.innerHTML = '<div></div>'
  151. const div = fixtureEl.querySelector('div')
  152. const action = '_getConfig'
  153. jQueryMock.fn.alert = Alert.jQueryInterface
  154. jQueryMock.elements = [div]
  155. expect(() => {
  156. jQueryMock.fn.alert.call(jQueryMock, action)
  157. }).toThrowError(TypeError, `No method named "${action}"`)
  158. })
  159. })
  160. describe('getInstance', () => {
  161. it('should return alert instance', () => {
  162. fixtureEl.innerHTML = '<div></div>'
  163. const div = fixtureEl.querySelector('div')
  164. const alert = new Alert(div)
  165. expect(Alert.getInstance(div)).toEqual(alert)
  166. expect(Alert.getInstance(div)).toBeInstanceOf(Alert)
  167. })
  168. it('should return null when there is no alert instance', () => {
  169. fixtureEl.innerHTML = '<div></div>'
  170. const div = fixtureEl.querySelector('div')
  171. expect(Alert.getInstance(div)).toBeNull()
  172. })
  173. })
  174. describe('getOrCreateInstance', () => {
  175. it('should return alert instance', () => {
  176. fixtureEl.innerHTML = '<div></div>'
  177. const div = fixtureEl.querySelector('div')
  178. const alert = new Alert(div)
  179. expect(Alert.getOrCreateInstance(div)).toEqual(alert)
  180. expect(Alert.getInstance(div)).toEqual(Alert.getOrCreateInstance(div, {}))
  181. expect(Alert.getOrCreateInstance(div)).toBeInstanceOf(Alert)
  182. })
  183. it('should return new instance when there is no alert instance', () => {
  184. fixtureEl.innerHTML = '<div></div>'
  185. const div = fixtureEl.querySelector('div')
  186. expect(Alert.getInstance(div)).toBeNull()
  187. expect(Alert.getOrCreateInstance(div)).toBeInstanceOf(Alert)
  188. })
  189. })
  190. })