ssrSuspense.spec.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import { createApp, h, Suspense } 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. render() {
  28. return h(Suspense, null, {
  29. default: h(RejectingAsync),
  30. fallback: h('div', 'fallback')
  31. })
  32. }
  33. }
  34. expect(await renderToString(createApp(Comp))).toBe(`<!---->`)
  35. expect('Uncaught error in async setup').toHaveBeenWarned()
  36. expect('missing template').toHaveBeenWarned()
  37. })
  38. test('2 components', async () => {
  39. const Comp = {
  40. render() {
  41. return h(Suspense, null, {
  42. default: h('div', [h(ResolvingAsync), h(ResolvingAsync)]),
  43. fallback: h('div', 'fallback')
  44. })
  45. }
  46. }
  47. expect(await renderToString(createApp(Comp))).toBe(
  48. `<div><div>async</div><div>async</div></div>`
  49. )
  50. })
  51. test('resolving component + rejecting component', async () => {
  52. const Comp = {
  53. render() {
  54. return h(Suspense, null, {
  55. default: h('div', [h(ResolvingAsync), h(RejectingAsync)]),
  56. fallback: h('div', 'fallback')
  57. })
  58. }
  59. }
  60. expect(await renderToString(createApp(Comp))).toBe(
  61. `<div><div>async</div><!----></div>`
  62. )
  63. expect('Uncaught error in async setup').toHaveBeenWarned()
  64. expect('missing template or render function').toHaveBeenWarned()
  65. })
  66. test('failing suspense in passing suspense', async () => {
  67. const Comp = {
  68. render() {
  69. return h(Suspense, null, {
  70. default: h('div', [
  71. h(ResolvingAsync),
  72. h(Suspense, null, {
  73. default: h('div', [h(RejectingAsync)]),
  74. fallback: h('div', 'fallback 2')
  75. })
  76. ]),
  77. fallback: h('div', 'fallback 1')
  78. })
  79. }
  80. }
  81. expect(await renderToString(createApp(Comp))).toBe(
  82. `<div><div>async</div><div><!----></div></div>`
  83. )
  84. expect('Uncaught error in async setup').toHaveBeenWarned()
  85. expect('missing template').toHaveBeenWarned()
  86. })
  87. test('passing suspense in failing suspense', async () => {
  88. const Comp = {
  89. render() {
  90. return h(Suspense, null, {
  91. default: h('div', [
  92. h(RejectingAsync),
  93. h(Suspense, null, {
  94. default: h('div', [h(ResolvingAsync)]),
  95. fallback: h('div', 'fallback 2')
  96. })
  97. ]),
  98. fallback: h('div', 'fallback 1')
  99. })
  100. }
  101. }
  102. expect(await renderToString(createApp(Comp))).toBe(
  103. `<div><!----><div><div>async</div></div></div>`
  104. )
  105. expect('Uncaught error in async setup').toHaveBeenWarned()
  106. expect('missing template').toHaveBeenWarned()
  107. })
  108. })