ssrTeleport.spec.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /**
  2. * @jest-environment node
  3. */
  4. import { createApp, h, Teleport } from 'vue'
  5. import { renderToString } from '../src/renderToString'
  6. import { SSRContext } from '../src/render'
  7. import { ssrRenderTeleport } from '../src/helpers/ssrRenderTeleport'
  8. describe('ssrRenderTeleport', () => {
  9. test('teleport rendering (compiled)', async () => {
  10. const ctx: SSRContext = {}
  11. const html = await renderToString(
  12. createApp({
  13. data() {
  14. return { msg: 'hello' }
  15. },
  16. ssrRender(_ctx, _push, _parent) {
  17. ssrRenderTeleport(
  18. _push,
  19. _push => {
  20. _push(`<div>content</div>`)
  21. },
  22. '#target',
  23. false,
  24. _parent
  25. )
  26. }
  27. }),
  28. ctx
  29. )
  30. expect(html).toBe('<!--teleport start--><!--teleport end-->')
  31. expect(ctx.teleports!['#target']).toBe(`<div>content</div><!---->`)
  32. })
  33. test('teleport rendering (compiled + disabled)', async () => {
  34. const ctx: SSRContext = {}
  35. const html = await renderToString(
  36. createApp({
  37. data() {
  38. return { msg: 'hello' }
  39. },
  40. ssrRender(_ctx, _push, _parent) {
  41. ssrRenderTeleport(
  42. _push,
  43. _push => {
  44. _push(`<div>content</div>`)
  45. },
  46. '#target',
  47. true,
  48. _parent
  49. )
  50. }
  51. }),
  52. ctx
  53. )
  54. expect(html).toBe(
  55. '<!--teleport start--><div>content</div><!--teleport end-->'
  56. )
  57. expect(ctx.teleports!['#target']).toBe(`<!---->`)
  58. })
  59. test('teleport rendering (vnode)', async () => {
  60. const ctx: SSRContext = {}
  61. const html = await renderToString(
  62. h(
  63. Teleport,
  64. {
  65. to: `#target`
  66. },
  67. h('span', 'hello')
  68. ),
  69. ctx
  70. )
  71. expect(html).toBe('<!--teleport start--><!--teleport end-->')
  72. expect(ctx.teleports!['#target']).toBe('<span>hello</span><!---->')
  73. })
  74. test('teleport rendering (vnode + disabled)', async () => {
  75. const ctx: SSRContext = {}
  76. const html = await renderToString(
  77. h(
  78. Teleport,
  79. {
  80. to: `#target`,
  81. disabled: true
  82. },
  83. h('span', 'hello')
  84. ),
  85. ctx
  86. )
  87. expect(html).toBe(
  88. '<!--teleport start--><span>hello</span><!--teleport end-->'
  89. )
  90. expect(ctx.teleports!['#target']).toBe(`<!---->`)
  91. })
  92. test('multiple teleports with same target', async () => {
  93. const ctx: SSRContext = {}
  94. const html = await renderToString(
  95. h('div', [
  96. h(
  97. Teleport,
  98. {
  99. to: `#target`
  100. },
  101. h('span', 'hello')
  102. ),
  103. h(Teleport, { to: `#target` }, 'world')
  104. ]),
  105. ctx
  106. )
  107. expect(html).toBe(
  108. '<div><!--teleport start--><!--teleport end--><!--teleport start--><!--teleport end--></div>'
  109. )
  110. expect(ctx.teleports!['#target']).toBe(
  111. '<span>hello</span><!---->world<!---->'
  112. )
  113. })
  114. })