events.spec.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import { patchEvent } from '../../src/modules/events'
  2. import { nextTick } from '@vue/runtime-dom'
  3. describe(`events`, () => {
  4. it('should assign event handler', async () => {
  5. const el = document.createElement('div')
  6. const event = new Event('click')
  7. const fn = jest.fn()
  8. patchEvent(el, 'click', null, fn, null)
  9. el.dispatchEvent(event)
  10. await nextTick()
  11. el.dispatchEvent(event)
  12. await nextTick()
  13. el.dispatchEvent(event)
  14. await nextTick()
  15. expect(fn).toHaveBeenCalledTimes(3)
  16. })
  17. it('should update event handler', async () => {
  18. const el = document.createElement('div')
  19. const event = new Event('click')
  20. const prevFn = jest.fn()
  21. const nextFn = jest.fn()
  22. patchEvent(el, 'click', null, prevFn, null)
  23. el.dispatchEvent(event)
  24. patchEvent(el, 'click', prevFn, nextFn, null)
  25. await nextTick()
  26. el.dispatchEvent(event)
  27. await nextTick()
  28. el.dispatchEvent(event)
  29. await nextTick()
  30. expect(prevFn).toHaveBeenCalledTimes(1)
  31. expect(nextFn).toHaveBeenCalledTimes(2)
  32. })
  33. it('should support multiple event handlers', async () => {
  34. const el = document.createElement('div')
  35. const event = new Event('click')
  36. const fn1 = jest.fn()
  37. const fn2 = jest.fn()
  38. patchEvent(el, 'click', null, [fn1, fn2], null)
  39. el.dispatchEvent(event)
  40. await nextTick()
  41. expect(fn1).toHaveBeenCalledTimes(1)
  42. expect(fn2).toHaveBeenCalledTimes(1)
  43. })
  44. it('should unassign event handler', async () => {
  45. const el = document.createElement('div')
  46. const event = new Event('click')
  47. const fn = jest.fn()
  48. patchEvent(el, 'click', null, fn, null)
  49. patchEvent(el, 'click', fn, null, null)
  50. el.dispatchEvent(event)
  51. await nextTick()
  52. expect(fn).not.toHaveBeenCalled()
  53. })
  54. it('should support event options', async () => {
  55. const el = document.createElement('div')
  56. const event = new Event('click')
  57. const fn = jest.fn()
  58. const nextValue = {
  59. handler: fn,
  60. options: {
  61. once: true
  62. }
  63. }
  64. patchEvent(el, 'click', null, nextValue, null)
  65. el.dispatchEvent(event)
  66. await nextTick()
  67. el.dispatchEvent(event)
  68. await nextTick()
  69. expect(fn).toHaveBeenCalledTimes(1)
  70. })
  71. it('should support varying event options', async () => {
  72. const el = document.createElement('div')
  73. const event = new Event('click')
  74. const prevFn = jest.fn()
  75. const nextFn = jest.fn()
  76. const nextValue = {
  77. handler: nextFn,
  78. options: {
  79. once: true
  80. }
  81. }
  82. patchEvent(el, 'click', null, prevFn, null)
  83. patchEvent(el, 'click', prevFn, nextValue, null)
  84. el.dispatchEvent(event)
  85. await nextTick()
  86. el.dispatchEvent(event)
  87. await nextTick()
  88. expect(prevFn).not.toHaveBeenCalled()
  89. expect(nextFn).toHaveBeenCalledTimes(1)
  90. })
  91. it('should unassign event handler with options', async () => {
  92. const el = document.createElement('div')
  93. const event = new Event('click')
  94. const fn = jest.fn()
  95. const nextValue = {
  96. handler: fn,
  97. options: {
  98. once: true
  99. }
  100. }
  101. patchEvent(el, 'click', null, nextValue, null)
  102. patchEvent(el, 'click', nextValue, null, null)
  103. el.dispatchEvent(event)
  104. await nextTick()
  105. el.dispatchEvent(event)
  106. await nextTick()
  107. expect(fn).not.toHaveBeenCalled()
  108. })
  109. })