popover.spec.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. import Popover from '../../src/popover'
  2. /** Test helpers */
  3. import { getFixture, clearFixture, jQueryMock } from '../helpers/fixture'
  4. describe('Popover', () => {
  5. let fixtureEl
  6. beforeAll(() => {
  7. fixtureEl = getFixture()
  8. })
  9. afterEach(() => {
  10. clearFixture()
  11. const popoverList = document.querySelectorAll('.popover')
  12. popoverList.forEach(popoverEl => {
  13. document.body.removeChild(popoverEl)
  14. })
  15. })
  16. describe('VERSION', () => {
  17. it('should return plugin version', () => {
  18. expect(Popover.VERSION).toEqual(jasmine.any(String))
  19. })
  20. })
  21. describe('Default', () => {
  22. it('should return plugin default config', () => {
  23. expect(Popover.Default).toEqual(jasmine.any(Object))
  24. })
  25. })
  26. describe('NAME', () => {
  27. it('should return plugin name', () => {
  28. expect(Popover.NAME).toEqual(jasmine.any(String))
  29. })
  30. })
  31. describe('DATA_KEY', () => {
  32. it('should return plugin data key', () => {
  33. expect(Popover.DATA_KEY).toEqual('bs.popover')
  34. })
  35. })
  36. describe('Event', () => {
  37. it('should return plugin events', () => {
  38. expect(Popover.Event).toEqual(jasmine.any(Object))
  39. })
  40. })
  41. describe('EVENT_KEY', () => {
  42. it('should return plugin event key', () => {
  43. expect(Popover.EVENT_KEY).toEqual('.bs.popover')
  44. })
  45. })
  46. describe('DefaultType', () => {
  47. it('should return plugin default type', () => {
  48. expect(Popover.DefaultType).toEqual(jasmine.any(Object))
  49. })
  50. })
  51. describe('show', () => {
  52. it('should show a popover', done => {
  53. fixtureEl.innerHTML = '<a href="#" title="Popover" data-bs-content="https://twitter.com/getbootstrap">BS twitter</a>'
  54. const popoverEl = fixtureEl.querySelector('a')
  55. const popover = new Popover(popoverEl)
  56. popoverEl.addEventListener('shown.bs.popover', () => {
  57. expect(document.querySelector('.popover')).not.toBeNull()
  58. done()
  59. })
  60. popover.show()
  61. })
  62. it('should set title and content from functions', done => {
  63. fixtureEl.innerHTML = '<a href="#">BS twitter</a>'
  64. const popoverEl = fixtureEl.querySelector('a')
  65. const popover = new Popover(popoverEl, {
  66. title: () => 'Bootstrap',
  67. content: () => 'loves writing tests (╯°□°)╯︵ ┻━┻'
  68. })
  69. popoverEl.addEventListener('shown.bs.popover', () => {
  70. const popoverDisplayed = document.querySelector('.popover')
  71. expect(popoverDisplayed).not.toBeNull()
  72. expect(popoverDisplayed.querySelector('.popover-header').textContent).toEqual('Bootstrap')
  73. expect(popoverDisplayed.querySelector('.popover-body').textContent).toEqual('loves writing tests (╯°□°)╯︵ ┻━┻')
  74. done()
  75. })
  76. popover.show()
  77. })
  78. it('should show a popover with just content', done => {
  79. fixtureEl.innerHTML = '<a href="#">BS twitter</a>'
  80. const popoverEl = fixtureEl.querySelector('a')
  81. const popover = new Popover(popoverEl, {
  82. content: 'Popover content'
  83. })
  84. popoverEl.addEventListener('shown.bs.popover', () => {
  85. const popoverDisplayed = document.querySelector('.popover')
  86. expect(popoverDisplayed).not.toBeNull()
  87. expect(popoverDisplayed.querySelector('.popover-body').textContent).toEqual('Popover content')
  88. done()
  89. })
  90. popover.show()
  91. })
  92. it('should show a popover with just content without having header', done => {
  93. fixtureEl.innerHTML = '<a href="#">Nice link</a>'
  94. const popoverEl = fixtureEl.querySelector('a')
  95. const popover = new Popover(popoverEl, {
  96. content: 'Some beautiful content :)'
  97. })
  98. popoverEl.addEventListener('shown.bs.popover', () => {
  99. const popoverDisplayed = document.querySelector('.popover')
  100. expect(popoverDisplayed).not.toBeNull()
  101. expect(popoverDisplayed.querySelector('.popover-header')).toBeNull()
  102. expect(popoverDisplayed.querySelector('.popover-body').textContent).toEqual('Some beautiful content :)')
  103. done()
  104. })
  105. popover.show()
  106. })
  107. it('should show a popover with just title without having body', done => {
  108. fixtureEl.innerHTML = '<a href="#">Nice link</a>'
  109. const popoverEl = fixtureEl.querySelector('a')
  110. const popover = new Popover(popoverEl, {
  111. title: 'Title, which does not require content'
  112. })
  113. popoverEl.addEventListener('shown.bs.popover', () => {
  114. const popoverDisplayed = document.querySelector('.popover')
  115. expect(popoverDisplayed).not.toBeNull()
  116. expect(popoverDisplayed.querySelector('.popover-body')).toBeNull()
  117. expect(popoverDisplayed.querySelector('.popover-header').textContent).toEqual('Title, which does not require content')
  118. done()
  119. })
  120. popover.show()
  121. })
  122. it('should show a popover with provided custom class', done => {
  123. fixtureEl.innerHTML = '<a href="#" title="Popover" data-bs-content="https://twitter.com/getbootstrap" data-bs-custom-class="custom-class">BS twitter</a>'
  124. const popoverEl = fixtureEl.querySelector('a')
  125. const popover = new Popover(popoverEl)
  126. popoverEl.addEventListener('shown.bs.popover', () => {
  127. const tip = document.querySelector('.popover')
  128. expect(tip).not.toBeNull()
  129. expect(tip.classList.contains('custom-class')).toBeTrue()
  130. done()
  131. })
  132. popover.show()
  133. })
  134. })
  135. describe('hide', () => {
  136. it('should hide a popover', done => {
  137. fixtureEl.innerHTML = '<a href="#" title="Popover" data-bs-content="https://twitter.com/getbootstrap">BS twitter</a>'
  138. const popoverEl = fixtureEl.querySelector('a')
  139. const popover = new Popover(popoverEl)
  140. popoverEl.addEventListener('shown.bs.popover', () => {
  141. popover.hide()
  142. })
  143. popoverEl.addEventListener('hidden.bs.popover', () => {
  144. expect(document.querySelector('.popover')).toBeNull()
  145. done()
  146. })
  147. popover.show()
  148. })
  149. })
  150. describe('jQueryInterface', () => {
  151. it('should create a popover', () => {
  152. fixtureEl.innerHTML = '<a href="#" title="Popover" data-bs-content="https://twitter.com/getbootstrap">BS twitter</a>'
  153. const popoverEl = fixtureEl.querySelector('a')
  154. jQueryMock.fn.popover = Popover.jQueryInterface
  155. jQueryMock.elements = [popoverEl]
  156. jQueryMock.fn.popover.call(jQueryMock)
  157. expect(Popover.getInstance(popoverEl)).not.toBeNull()
  158. })
  159. it('should create a popover with a config object', () => {
  160. fixtureEl.innerHTML = '<a href="#" title="Popover">BS twitter</a>'
  161. const popoverEl = fixtureEl.querySelector('a')
  162. jQueryMock.fn.popover = Popover.jQueryInterface
  163. jQueryMock.elements = [popoverEl]
  164. jQueryMock.fn.popover.call(jQueryMock, {
  165. content: 'Popover content'
  166. })
  167. expect(Popover.getInstance(popoverEl)).not.toBeNull()
  168. })
  169. it('should not re create a popover', () => {
  170. fixtureEl.innerHTML = '<a href="#" title="Popover" data-bs-content="https://twitter.com/getbootstrap">BS twitter</a>'
  171. const popoverEl = fixtureEl.querySelector('a')
  172. const popover = new Popover(popoverEl)
  173. jQueryMock.fn.popover = Popover.jQueryInterface
  174. jQueryMock.elements = [popoverEl]
  175. jQueryMock.fn.popover.call(jQueryMock)
  176. expect(Popover.getInstance(popoverEl)).toEqual(popover)
  177. })
  178. it('should throw error on undefined method', () => {
  179. fixtureEl.innerHTML = '<a href="#" title="Popover" data-bs-content="https://twitter.com/getbootstrap">BS twitter</a>'
  180. const popoverEl = fixtureEl.querySelector('a')
  181. const action = 'undefinedMethod'
  182. jQueryMock.fn.popover = Popover.jQueryInterface
  183. jQueryMock.elements = [popoverEl]
  184. expect(() => {
  185. jQueryMock.fn.popover.call(jQueryMock, action)
  186. }).toThrowError(TypeError, `No method named "${action}"`)
  187. })
  188. it('should should call show method', () => {
  189. fixtureEl.innerHTML = '<a href="#" title="Popover" data-bs-content="https://twitter.com/getbootstrap">BS twitter</a>'
  190. const popoverEl = fixtureEl.querySelector('a')
  191. const popover = new Popover(popoverEl)
  192. jQueryMock.fn.popover = Popover.jQueryInterface
  193. jQueryMock.elements = [popoverEl]
  194. spyOn(popover, 'show')
  195. jQueryMock.fn.popover.call(jQueryMock, 'show')
  196. expect(popover.show).toHaveBeenCalled()
  197. })
  198. })
  199. describe('getInstance', () => {
  200. it('should return popover instance', () => {
  201. fixtureEl.innerHTML = '<a href="#" title="Popover" data-bs-content="https://twitter.com/getbootstrap">BS twitter</a>'
  202. const popoverEl = fixtureEl.querySelector('a')
  203. const popover = new Popover(popoverEl)
  204. expect(Popover.getInstance(popoverEl)).toEqual(popover)
  205. expect(Popover.getInstance(popoverEl)).toBeInstanceOf(Popover)
  206. })
  207. it('should return null when there is no popover instance', () => {
  208. fixtureEl.innerHTML = '<a href="#" title="Popover" data-bs-content="https://twitter.com/getbootstrap">BS twitter</a>'
  209. const popoverEl = fixtureEl.querySelector('a')
  210. expect(Popover.getInstance(popoverEl)).toEqual(null)
  211. })
  212. })
  213. describe('getOrCreateInstance', () => {
  214. it('should return popover instance', () => {
  215. fixtureEl.innerHTML = '<div></div>'
  216. const div = fixtureEl.querySelector('div')
  217. const popover = new Popover(div)
  218. expect(Popover.getOrCreateInstance(div)).toEqual(popover)
  219. expect(Popover.getInstance(div)).toEqual(Popover.getOrCreateInstance(div, {}))
  220. expect(Popover.getOrCreateInstance(div)).toBeInstanceOf(Popover)
  221. })
  222. it('should return new instance when there is no popover instance', () => {
  223. fixtureEl.innerHTML = '<div></div>'
  224. const div = fixtureEl.querySelector('div')
  225. expect(Popover.getInstance(div)).toEqual(null)
  226. expect(Popover.getOrCreateInstance(div)).toBeInstanceOf(Popover)
  227. })
  228. it('should return new instance when there is no popover instance with given configuration', () => {
  229. fixtureEl.innerHTML = '<div></div>'
  230. const div = fixtureEl.querySelector('div')
  231. expect(Popover.getInstance(div)).toEqual(null)
  232. const popover = Popover.getOrCreateInstance(div, {
  233. placement: 'top'
  234. })
  235. expect(popover).toBeInstanceOf(Popover)
  236. expect(popover._config.placement).toEqual('top')
  237. })
  238. it('should return the instance when exists without given configuration', () => {
  239. fixtureEl.innerHTML = '<div></div>'
  240. const div = fixtureEl.querySelector('div')
  241. const popover = new Popover(div, {
  242. placement: 'top'
  243. })
  244. expect(Popover.getInstance(div)).toEqual(popover)
  245. const popover2 = Popover.getOrCreateInstance(div, {
  246. placement: 'bottom'
  247. })
  248. expect(popover).toBeInstanceOf(Popover)
  249. expect(popover2).toEqual(popover)
  250. expect(popover2._config.placement).toEqual('top')
  251. })
  252. })
  253. })