hooks.spec.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. let { morph } = require('@alpinejs/morph')
  2. let createElement = require('./createElement.js')
  3. test('can use custom key name', async () => {
  4. let dom = createElement('<ul><li wire:key="2">bar</li></ul>')
  5. dom.querySelector('li').is_me = true
  6. await morph(dom, '<ul><li wire:key="1">foo</li><li wire:key="2">bar</li></ul>', {
  7. key(el) { return el.getAttribute('wire:key') }
  8. })
  9. expect(dom.querySelector('li:nth-of-type(2)').is_me).toBeTruthy()
  10. })
  11. test('can prevent update', async () => {
  12. let dom = createElement('<div><span>foo</span></div>')
  13. await morph(dom, '<div><span>bar</span></div>', {
  14. updating(from, to, childrenOnly, prevent) {
  15. if (from.textContent === 'foo') {
  16. prevent()
  17. }
  18. }
  19. })
  20. expect(dom.querySelector('span').textContent).toEqual('foo')
  21. })
  22. test('can prevent update, but still update children', async () => {
  23. let dom = createElement('<div><span foo="bar">foo</span></div>')
  24. await morph(dom, '<div><span foo="baz">bar</span></div>', {
  25. updating(from, to, childrenOnly, prevent) {
  26. if (from.textContent === 'foo') {
  27. childrenOnly()
  28. }
  29. }
  30. })
  31. expect(dom.querySelector('span').textContent).toEqual('bar')
  32. expect(dom.querySelector('span').getAttribute('foo')).toEqual('bar')
  33. })
  34. test('changing tag doesnt trigger an update (add and remove instead)', async () => {
  35. let dom = createElement('<div><span>foo</span></div>')
  36. let updateHookCalledTimes = 0
  37. await morph(dom, '<div><h1>foo</h1></div>', {
  38. updating(from, to, prevent) {
  39. updateHookCalledTimes++
  40. }
  41. })
  42. expect(updateHookCalledTimes).toEqual(1)
  43. })
  44. test('can impact update', async () => {
  45. let dom = createElement('<div><span>foo</span></div>')
  46. await morph(dom, '<div><span>bar</span></div>', {
  47. updated(from, to) {
  48. if (from.textContent === 'bar') {
  49. from.textContent = 'baz'
  50. }
  51. }
  52. })
  53. expect(dom.querySelector('span').textContent).toEqual('baz')
  54. })
  55. test('updating and updated are sequential when element has child updates ', async () => {
  56. let dom = createElement('<div><span>foo</span></div>')
  57. let updatings = []
  58. let updateds = []
  59. await morph(dom, '<div><span>bar</span></div>', {
  60. updating(from, to) {
  61. updatings.push(from.nodeName.toLowerCase())
  62. },
  63. updated(from, to) {
  64. updateds.push(from.nodeName.toLowerCase())
  65. }
  66. })
  67. expect(updatings).toEqual(['div', 'span', '#text'])
  68. expect(updateds).toEqual(['div', 'span', '#text'])
  69. })
  70. test('can prevent removal', async () => {
  71. let dom = createElement('<div><span>foo</span></div>')
  72. await morph(dom, '<div></div>', {
  73. removing(from, prevent) {
  74. prevent()
  75. }
  76. })
  77. expect(dom.querySelector('span')).toBeTruthy()
  78. })
  79. test('can impact removal', async () => {
  80. let dom = createElement('<div><span>foo</span></div>')
  81. let textContent
  82. await morph(dom, '<div></div>', {
  83. removed(from) {
  84. textContent = from.textContent
  85. }
  86. })
  87. expect(textContent).toEqual('foo')
  88. })
  89. test('can prevent removal for tag replacement', async () => {
  90. let dom = createElement('<div><span>foo</span></div>')
  91. await morph(dom, '<div><h1>foo</h1></div>', {
  92. removing(from, prevent) {
  93. prevent()
  94. }
  95. })
  96. expect(dom.querySelector('span')).toBeTruthy()
  97. })
  98. test('can impact removal for tag replacement', async () => {
  99. let dom = createElement('<div><span>foo</span></div>')
  100. let textContent
  101. await morph(dom, '<div><h1>foo</h1></div>', {
  102. removed(from) {
  103. textContent = from.textContent
  104. }
  105. })
  106. expect(textContent).toEqual('foo')
  107. })
  108. test('can prevent addition', async () => {
  109. let dom = createElement('<div></div>')
  110. await morph(dom, '<div><span>foo</span></div>', {
  111. adding(to, prevent) {
  112. prevent()
  113. }
  114. })
  115. expect(dom.querySelector('span')).toBeFalsy()
  116. })
  117. test('can impact addition', async () => {
  118. let dom = createElement('<div></div>')
  119. await morph(dom, '<div><span>foo</span></div>', {
  120. added(to) {
  121. to.textContent = 'bar'
  122. }
  123. })
  124. expect(dom.querySelector('span').textContent).toEqual('bar')
  125. })
  126. test('can prevent addition for tag replacement', async () => {
  127. let dom = createElement('<div><h1>foo</h1></div>')
  128. await morph(dom, '<div><span>foo</span></div>', {
  129. adding(to, prevent) {
  130. prevent()
  131. }
  132. })
  133. expect(dom.querySelector('span')).toBeFalsy()
  134. })
  135. test('can impact addition for tag replacement', async () => {
  136. let dom = createElement('<div><h1>foo</h1></div>')
  137. await morph(dom, '<div><span>foo</span></div>', {
  138. added(to) {
  139. to.textContent = 'bar'
  140. }
  141. })
  142. expect(dom.querySelector('span').textContent).toEqual('bar')
  143. })