ssrTeleport.spec.ts 2.8 KB

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