1
0

internal.spec.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. let { morph } = require('@alpinejs/morph')
  2. let createElement = require('./createElement.js')
  3. test('changed element is the same element', () => {
  4. let dom = createElement('<div><span>foo</span></div>')
  5. dom.querySelector('span').is_me = true
  6. morph(dom, '<div><span>bar</span></div>')
  7. expect(dom.querySelector('span').is_me).toBeTruthy()
  8. })
  9. test('non-keyed elements are replaced instead of moved', () => {
  10. let dom = createElement('<ul><li>bar</li></ul>')
  11. dom.querySelector('li').is_me = true
  12. morph(dom, '<ul><li>foo</li><li>bar</li></ul>')
  13. expect(dom.querySelector('li:nth-of-type(1)').is_me).toBeTruthy()
  14. })
  15. test('keyed elements are moved instead of replaced', () => {
  16. let dom = createElement('<ul><li key="2">bar</li></ul>')
  17. dom.querySelector('li').is_me = true
  18. morph(dom, '<ul><li key="1">foo</li><li key="2">bar</li></ul>')
  19. expect(dom.querySelector('li:nth-of-type(2)').is_me).toBeTruthy()
  20. })
  21. test('elements inserted into a list are properly tracked using lookahead inside updating hook instead of keys', () => {
  22. let dom = createElement('<ul><li>bar</li></ul>')
  23. dom.querySelector('li').is_me = true
  24. morph(dom, '<ul><li>foo</li><li>bar</li></ul>', {
  25. lookahead: true,
  26. })
  27. expect(dom.outerHTML).toEqual('<ul><li>foo</li><li>bar</li></ul>')
  28. expect(dom.querySelector('li:nth-of-type(2)').is_me).toBeTruthy()
  29. })
  30. test('lookahead still works if comparison elements have keys', () => {
  31. let dom = createElement(`<ul>
  32. <li key="bar">bar</li>
  33. <li>hey</li>
  34. </ul>`)
  35. dom.querySelector('li:nth-of-type(1)').is_me = true
  36. dom.querySelector('li:nth-of-type(2)').is_me = true
  37. morph(dom, `<ul>
  38. <li key="foo">foo</li>
  39. <li key="bar">bar</li>
  40. <li>hey</li>
  41. </ul>`, {
  42. lookahead: true,
  43. })
  44. expect(dom.querySelector('li:nth-of-type(1)').is_me).toBeFalsy()
  45. expect(dom.querySelector('li:nth-of-type(2)').is_me).toBeTruthy()
  46. expect(dom.querySelector('li:nth-of-type(3)').is_me).toBeTruthy()
  47. expect(dom.querySelectorAll('li').length).toEqual(3)
  48. })
  49. test('baz', () => {
  50. let dom = createElement(`<ul>
  51. <li key="bar">bar</li>
  52. <li>hey</li>
  53. </ul>`)
  54. dom.querySelector('li:nth-of-type(1)').is_me = true
  55. dom.querySelector('li:nth-of-type(2)').is_me = true
  56. morph(dom, `<ul>
  57. <li>foo</li>
  58. <li key="bar">bar</li>
  59. <li>hey</li>
  60. </ul>`, {
  61. lookahead: true,
  62. })
  63. expect(dom.querySelector('li:nth-of-type(1)').is_me).toBeFalsy()
  64. expect(dom.querySelector('li:nth-of-type(2)').is_me).toBeTruthy()
  65. expect(dom.querySelector('li:nth-of-type(3)').is_me).toBeTruthy()
  66. expect(dom.querySelectorAll('li').length).toEqual(3)
  67. })
  68. test('blah blah blah no lookahead', () => {
  69. let dom = createElement(`<ul>
  70. <li key="bar">bar</li>
  71. <li>hey</li>
  72. </ul>`)
  73. dom.querySelector('li:nth-of-type(1)').is_me = true
  74. morph(dom, `<ul>
  75. <li key="foo">foo</li>
  76. <li key="bar">bar</li>
  77. <li>hey</li>
  78. </ul>`)
  79. expect(dom.querySelector('li:nth-of-type(1)').is_me).toBeFalsy()
  80. expect(dom.querySelector('li:nth-of-type(2)').is_me).toBeTruthy()
  81. expect(dom.querySelector('li:nth-of-type(3)').is_me).toBeFalsy()
  82. expect(dom.querySelectorAll('li').length).toEqual(3)
  83. })
  84. //
  85. // @todo: add test to make sure added nodes are cloned from the "to" tree