ssrTeleport.spec.ts 2.9 KB

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