base-component.spec.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. import BaseComponent from '../../src/base-component.js'
  2. import EventHandler from '../../src/dom/event-handler.js'
  3. import { noop } from '../../src/util/index.js'
  4. import { clearFixture, getFixture } from '../helpers/fixture.js'
  5. class DummyClass extends BaseComponent {
  6. constructor(element) {
  7. super(element)
  8. EventHandler.on(this._element, `click${DummyClass.EVENT_KEY}`, noop)
  9. }
  10. static get NAME() {
  11. return 'dummy'
  12. }
  13. }
  14. describe('Base Component', () => {
  15. let fixtureEl
  16. const name = 'dummy'
  17. let element
  18. let instance
  19. const createInstance = () => {
  20. fixtureEl.innerHTML = '<div id="foo"></div>'
  21. element = fixtureEl.querySelector('#foo')
  22. instance = new DummyClass(element)
  23. }
  24. beforeAll(() => {
  25. fixtureEl = getFixture()
  26. })
  27. afterEach(() => {
  28. clearFixture()
  29. })
  30. describe('Static Methods', () => {
  31. describe('VERSION', () => {
  32. it('should return version', () => {
  33. expect(DummyClass.VERSION).toEqual(jasmine.any(String))
  34. })
  35. })
  36. describe('DATA_KEY', () => {
  37. it('should return plugin data key', () => {
  38. expect(DummyClass.DATA_KEY).toEqual(`bs.${name}`)
  39. })
  40. })
  41. describe('NAME', () => {
  42. it('should throw an Error if it is not initialized', () => {
  43. expect(() => {
  44. // eslint-disable-next-line no-unused-expressions
  45. BaseComponent.NAME
  46. }).toThrowError(Error)
  47. })
  48. it('should return plugin NAME', () => {
  49. expect(DummyClass.NAME).toEqual(name)
  50. })
  51. })
  52. describe('EVENT_KEY', () => {
  53. it('should return plugin event key', () => {
  54. expect(DummyClass.EVENT_KEY).toEqual(`.bs.${name}`)
  55. })
  56. })
  57. })
  58. describe('Public Methods', () => {
  59. describe('constructor', () => {
  60. it('should accept element, either passed as a CSS selector or DOM element', () => {
  61. fixtureEl.innerHTML = [
  62. '<div id="foo"></div>',
  63. '<div id="bar"></div>'
  64. ].join('')
  65. const el = fixtureEl.querySelector('#foo')
  66. const elInstance = new DummyClass(el)
  67. const selectorInstance = new DummyClass('#bar')
  68. expect(elInstance._element).toEqual(el)
  69. expect(selectorInstance._element).toEqual(fixtureEl.querySelector('#bar'))
  70. })
  71. it('should not initialize and add element record to Data (caching), if argument `element` is not an HTML element', () => {
  72. fixtureEl.innerHTML = ''
  73. const el = fixtureEl.querySelector('#foo')
  74. const elInstance = new DummyClass(el)
  75. const selectorInstance = new DummyClass('#bar')
  76. expect(elInstance._element).not.toBeDefined()
  77. expect(selectorInstance._element).not.toBeDefined()
  78. })
  79. })
  80. describe('dispose', () => {
  81. it('should dispose an component', () => {
  82. createInstance()
  83. expect(DummyClass.getInstance(element)).not.toBeNull()
  84. instance.dispose()
  85. expect(DummyClass.getInstance(element)).toBeNull()
  86. expect(instance._element).toBeNull()
  87. })
  88. it('should de-register element event listeners', () => {
  89. createInstance()
  90. const spy = spyOn(EventHandler, 'off')
  91. instance.dispose()
  92. expect(spy).toHaveBeenCalledWith(element, DummyClass.EVENT_KEY)
  93. })
  94. })
  95. describe('getInstance', () => {
  96. it('should return an instance', () => {
  97. createInstance()
  98. expect(DummyClass.getInstance(element)).toEqual(instance)
  99. expect(DummyClass.getInstance(element)).toBeInstanceOf(DummyClass)
  100. })
  101. it('should accept element, either passed as a CSS selector, jQuery element, or DOM element', () => {
  102. createInstance()
  103. expect(DummyClass.getInstance('#foo')).toEqual(instance)
  104. expect(DummyClass.getInstance(element)).toEqual(instance)
  105. const fakejQueryObject = {
  106. 0: element,
  107. jquery: 'foo'
  108. }
  109. expect(DummyClass.getInstance(fakejQueryObject)).toEqual(instance)
  110. })
  111. it('should return null when there is no instance', () => {
  112. fixtureEl.innerHTML = '<div></div>'
  113. const div = fixtureEl.querySelector('div')
  114. expect(DummyClass.getInstance(div)).toBeNull()
  115. })
  116. })
  117. describe('getOrCreateInstance', () => {
  118. it('should return an instance', () => {
  119. createInstance()
  120. expect(DummyClass.getOrCreateInstance(element)).toEqual(instance)
  121. expect(DummyClass.getInstance(element)).toEqual(DummyClass.getOrCreateInstance(element, {}))
  122. expect(DummyClass.getOrCreateInstance(element)).toBeInstanceOf(DummyClass)
  123. })
  124. it('should return new instance when there is no alert instance', () => {
  125. fixtureEl.innerHTML = '<div id="foo"></div>'
  126. element = fixtureEl.querySelector('#foo')
  127. expect(DummyClass.getInstance(element)).toBeNull()
  128. expect(DummyClass.getOrCreateInstance(element)).toBeInstanceOf(DummyClass)
  129. })
  130. })
  131. })
  132. })