alert.spec.js 6.4 KB

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