ssrSuspense.spec.ts 3.3 KB

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