| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- import { createApp, h, Suspense } from 'vue'
- import { renderToString } from '../src/renderToString'
- import { ssrRenderSuspense } from '../src/helpers/ssrRenderSuspense'
- import { ssrRenderComponent } from '../src'
- describe('SSR Suspense', () => {
- let logError: jest.SpyInstance
- beforeEach(() => {
- logError = jest.spyOn(console, 'error').mockImplementation(() => {})
- })
- afterEach(() => {
- logError.mockRestore()
- })
- const ResolvingAsync = {
- async setup() {
- return () => h('div', 'async')
- }
- }
- const RejectingAsync = {
- setup() {
- return new Promise((_, reject) => reject('foo'))
- }
- }
- describe('compiled', () => {
- test('basic', async () => {
- const app = createApp({
- ssrRender(_ctx, _push) {
- _push(
- ssrRenderSuspense({
- default: _push => {
- _push('<div>async</div>')
- }
- })
- )
- }
- })
- expect(await renderToString(app)).toBe(`<div>async</div>`)
- expect(logError).not.toHaveBeenCalled()
- })
- test('with async component', async () => {
- const app = createApp({
- ssrRender(_ctx, _push) {
- _push(
- ssrRenderSuspense({
- default: _push => {
- _push(ssrRenderComponent(ResolvingAsync))
- }
- })
- )
- }
- })
- expect(await renderToString(app)).toBe(`<div>async</div>`)
- expect(logError).not.toHaveBeenCalled()
- })
- test('fallback', async () => {
- const app = createApp({
- ssrRender(_ctx, _push) {
- _push(
- ssrRenderSuspense({
- default: _push => {
- _push(ssrRenderComponent(RejectingAsync))
- },
- fallback: _push => {
- _push('<div>fallback</div>')
- }
- })
- )
- }
- })
- expect(await renderToString(app)).toBe(`<div>fallback</div>`)
- expect(logError).toHaveBeenCalled()
- })
- })
- describe('vnode', () => {
- test('content', async () => {
- const Comp = {
- render() {
- return h(Suspense, null, {
- default: h(ResolvingAsync),
- fallback: h('div', 'fallback')
- })
- }
- }
- expect(await renderToString(createApp(Comp))).toBe(`<div>async</div>`)
- expect(logError).not.toHaveBeenCalled()
- })
- test('fallback', async () => {
- const Comp = {
- render() {
- return h(Suspense, null, {
- default: h(RejectingAsync),
- fallback: h('div', 'fallback')
- })
- }
- }
- expect(await renderToString(createApp(Comp))).toBe(`<div>fallback</div>`)
- expect(logError).toHaveBeenCalled()
- })
- test('2 components', async () => {
- const Comp = {
- render() {
- return h(Suspense, null, {
- default: h('div', [h(ResolvingAsync), h(ResolvingAsync)]),
- fallback: h('div', 'fallback')
- })
- }
- }
- expect(await renderToString(createApp(Comp))).toBe(
- `<div><div>async</div><div>async</div></div>`
- )
- expect(logError).not.toHaveBeenCalled()
- })
- test('resolving component + rejecting component', async () => {
- const Comp = {
- render() {
- return h(Suspense, null, {
- default: h('div', [h(ResolvingAsync), h(RejectingAsync)]),
- fallback: h('div', 'fallback')
- })
- }
- }
- expect(await renderToString(createApp(Comp))).toBe(`<div>fallback</div>`)
- expect(logError).toHaveBeenCalled()
- })
- test('failing suspense in passing suspense', async () => {
- const Comp = {
- render() {
- return h(Suspense, null, {
- default: h('div', [
- h(ResolvingAsync),
- h(Suspense, null, {
- default: h('div', [h(RejectingAsync)]),
- fallback: h('div', 'fallback 2')
- })
- ]),
- fallback: h('div', 'fallback 1')
- })
- }
- }
- expect(await renderToString(createApp(Comp))).toBe(
- `<div><div>async</div><div>fallback 2</div></div>`
- )
- expect(logError).toHaveBeenCalled()
- })
- test('passing suspense in failing suspense', async () => {
- const Comp = {
- render() {
- return h(Suspense, null, {
- default: h('div', [
- h(RejectingAsync),
- h(Suspense, null, {
- default: h('div', [h(ResolvingAsync)]),
- fallback: h('div', 'fallback 2')
- })
- ]),
- fallback: h('div', 'fallback 1')
- })
- }
- }
- expect(await renderToString(createApp(Comp))).toBe(
- `<div>fallback 1</div>`
- )
- expect(logError).toHaveBeenCalled()
- })
- })
- })
|