ssrSuspense.spec.ts 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import { vi } from 'vitest'
  2. import { createApp, h, Suspense } from 'vue'
  3. import { renderToString } from '../src/renderToString'
  4. describe('SSR Suspense', () => {
  5. const ResolvingAsync = {
  6. async setup() {
  7. return () => h('div', 'async')
  8. }
  9. }
  10. const RejectingAsync = {
  11. setup() {
  12. return new Promise((_, reject) => reject('foo'))
  13. }
  14. }
  15. test('content', async () => {
  16. const Comp = {
  17. render() {
  18. return h(Suspense, null, {
  19. default: h(ResolvingAsync),
  20. fallback: h('div', 'fallback')
  21. })
  22. }
  23. }
  24. expect(await renderToString(createApp(Comp))).toBe(`<div>async</div>`)
  25. })
  26. test('reject', async () => {
  27. const Comp = {
  28. errorCaptured: vi.fn(() => false),
  29. render() {
  30. return h(Suspense, null, {
  31. default: h(RejectingAsync),
  32. fallback: h('div', 'fallback')
  33. })
  34. }
  35. }
  36. expect(await renderToString(createApp(Comp))).toBe(`<!---->`)
  37. expect(Comp.errorCaptured).toHaveBeenCalledTimes(1)
  38. expect('missing template').toHaveBeenWarned()
  39. })
  40. test('2 components', async () => {
  41. const Comp = {
  42. render() {
  43. return h(Suspense, null, {
  44. default: h('div', [h(ResolvingAsync), h(ResolvingAsync)]),
  45. fallback: h('div', 'fallback')
  46. })
  47. }
  48. }
  49. expect(await renderToString(createApp(Comp))).toBe(
  50. `<div><div>async</div><div>async</div></div>`
  51. )
  52. })
  53. test('resolving component + rejecting component', async () => {
  54. const Comp = {
  55. errorCaptured: vi.fn(() => false),
  56. render() {
  57. return h(Suspense, null, {
  58. default: h('div', [h(ResolvingAsync), h(RejectingAsync)]),
  59. fallback: h('div', 'fallback')
  60. })
  61. }
  62. }
  63. expect(await renderToString(createApp(Comp))).toBe(
  64. `<div><div>async</div><!----></div>`
  65. )
  66. expect(Comp.errorCaptured).toHaveBeenCalledTimes(1)
  67. expect('missing template or render function').toHaveBeenWarned()
  68. })
  69. test('failing suspense in passing suspense', async () => {
  70. const Comp = {
  71. errorCaptured: vi.fn(() => false),
  72. render() {
  73. return h(Suspense, null, {
  74. default: h('div', [
  75. h(ResolvingAsync),
  76. h(Suspense, null, {
  77. default: h('div', [h(RejectingAsync)]),
  78. fallback: h('div', 'fallback 2')
  79. })
  80. ]),
  81. fallback: h('div', 'fallback 1')
  82. })
  83. }
  84. }
  85. expect(await renderToString(createApp(Comp))).toBe(
  86. `<div><div>async</div><div><!----></div></div>`
  87. )
  88. expect(Comp.errorCaptured).toHaveBeenCalledTimes(1)
  89. expect('missing template').toHaveBeenWarned()
  90. })
  91. test('passing suspense in failing suspense', async () => {
  92. const Comp = {
  93. errorCaptured: vi.fn(() => false),
  94. render() {
  95. return h(Suspense, null, {
  96. default: h('div', [
  97. h(RejectingAsync),
  98. h(Suspense, null, {
  99. default: h('div', [h(ResolvingAsync)]),
  100. fallback: h('div', 'fallback 2')
  101. })
  102. ]),
  103. fallback: h('div', 'fallback 1')
  104. })
  105. }
  106. }
  107. expect(await renderToString(createApp(Comp))).toBe(
  108. `<div><!----><div><div>async</div></div></div>`
  109. )
  110. expect(Comp.errorCaptured).toHaveBeenCalledTimes(1)
  111. expect('missing template').toHaveBeenWarned()
  112. })
  113. })