base-component.spec.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import BaseComponent from '../../src/base-component'
  2. import { clearFixture, getFixture } from '../helpers/fixture'
  3. import EventHandler from '../../src/dom/event-handler'
  4. import { noop } from '../../src/util'
  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(typeof DummyClass.VERSION).toEqual('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 return plugin NAME', () => {
  43. expect(DummyClass.NAME).toEqual(name)
  44. })
  45. })
  46. describe('EVENT_KEY', () => {
  47. it('should return plugin event key', () => {
  48. expect(DummyClass.EVENT_KEY).toEqual(`.bs.${name}`)
  49. })
  50. })
  51. })
  52. describe('Public Methods', () => {
  53. describe('constructor', () => {
  54. it('should accept element, either passed as a CSS selector or DOM element', () => {
  55. fixtureEl.innerHTML = [
  56. '<div id="foo"></div>',
  57. '<div id="bar"></div>'
  58. ].join('')
  59. const el = fixtureEl.querySelector('#foo')
  60. const elInstance = new DummyClass(el)
  61. const selectorInstance = new DummyClass('#bar')
  62. expect(elInstance._element).toEqual(el)
  63. expect(selectorInstance._element).toEqual(fixtureEl.querySelector('#bar'))
  64. })
  65. })
  66. describe('dispose', () => {
  67. it('should dispose an component', () => {
  68. createInstance()
  69. expect(DummyClass.getInstance(element)).not.toBeNull()
  70. instance.dispose()
  71. expect(DummyClass.getInstance(element)).toBeNull()
  72. expect(instance._element).toBeNull()
  73. })
  74. it('should de-register element event listeners', () => {
  75. createInstance()
  76. spyOn(EventHandler, 'off')
  77. instance.dispose()
  78. expect(EventHandler.off).toHaveBeenCalledWith(element, DummyClass.EVENT_KEY)
  79. })
  80. })
  81. describe('getInstance', () => {
  82. it('should return an instance', () => {
  83. createInstance()
  84. expect(DummyClass.getInstance(element)).toEqual(instance)
  85. expect(DummyClass.getInstance(element)).toBeInstanceOf(DummyClass)
  86. })
  87. it('should return null when there is no instance', () => {
  88. fixtureEl.innerHTML = '<div></div>'
  89. const div = fixtureEl.querySelector('div')
  90. expect(DummyClass.getInstance(div)).toEqual(null)
  91. })
  92. })
  93. describe('getOrCreateInstance', () => {
  94. it('should return an instance', () => {
  95. createInstance()
  96. expect(DummyClass.getOrCreateInstance(element)).toEqual(instance)
  97. expect(DummyClass.getInstance(element)).toEqual(DummyClass.getOrCreateInstance(element, {}))
  98. expect(DummyClass.getOrCreateInstance(element)).toBeInstanceOf(DummyClass)
  99. })
  100. it('should return new instance when there is no alert instance', () => {
  101. fixtureEl.innerHTML = '<div id="foo"></div>'
  102. element = fixtureEl.querySelector('#foo')
  103. expect(DummyClass.getInstance(element)).toEqual(null)
  104. expect(DummyClass.getOrCreateInstance(element)).toBeInstanceOf(DummyClass)
  105. })
  106. })
  107. })
  108. })