Skip to content

Commit 2c12b58

Browse files
committed
test: add more cases
1 parent c52332a commit 2c12b58

File tree

1 file changed

+83
-5
lines changed

1 file changed

+83
-5
lines changed

packages/runtime-core/__tests__/components/Suspense.spec.ts

Lines changed: 83 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,14 @@ import {
2626
watch,
2727
watchEffect,
2828
} from '@vue/runtime-test'
29-
import { computed, createApp, defineComponent, inject, provide } from 'vue'
29+
import {
30+
computed,
31+
createApp,
32+
defineAsyncComponent as defineAsyncComp,
33+
defineComponent,
34+
inject,
35+
provide,
36+
} from 'vue'
3037
import type { RawSlots } from 'packages/runtime-core/src/componentSlots'
3138
import { resetSuspenseId } from '../../src/components/Suspense'
3239
import { PatchFlags } from '@vue/shared'
@@ -2166,12 +2173,12 @@ describe('Suspense', () => {
21662173
})
21672174

21682175
// #12920
2169-
test('unmount Suspense after children self-update', async () => {
2170-
const Comp = defineAsyncComponent({
2176+
test('unmount Suspense after async child (with defineAsyncComponent) self-triggered update', async () => {
2177+
const Comp = defineComponent({
21712178
setup() {
21722179
const show = ref(true)
21732180
onMounted(() => {
2174-
// trigger self-update
2181+
// trigger update
21752182
show.value = !show.value
21762183
})
21772184
return () =>
@@ -2181,6 +2188,77 @@ describe('Suspense', () => {
21812188
},
21822189
})
21832190

2191+
const AsyncComp = defineAsyncComp(() => {
2192+
const p = new Promise(resolve => {
2193+
resolve(Comp)
2194+
})
2195+
deps.push(p.then(() => Promise.resolve()))
2196+
return p as any
2197+
})
2198+
2199+
const toggle = ref(true)
2200+
const root = nodeOps.createElement('div')
2201+
const App = {
2202+
render() {
2203+
return (
2204+
openBlock(),
2205+
createElementBlock(
2206+
Fragment,
2207+
null,
2208+
[
2209+
h('h1', null, toggle.value),
2210+
toggle.value
2211+
? (openBlock(),
2212+
createBlock(
2213+
Suspense,
2214+
{ key: 0 },
2215+
{
2216+
default: h(AsyncComp),
2217+
},
2218+
))
2219+
: createCommentVNode('v-if', true),
2220+
],
2221+
PatchFlags.STABLE_FRAGMENT,
2222+
)
2223+
)
2224+
},
2225+
}
2226+
render(h(App), root)
2227+
expect(serializeInner(root)).toBe(`<h1>true</h1><!---->`)
2228+
2229+
await Promise.all(deps)
2230+
await nextTick()
2231+
await nextTick()
2232+
expect(serializeInner(root)).toBe(`<h1>true</h1><div>show</div>`)
2233+
2234+
await nextTick()
2235+
expect(serializeInner(root)).toBe(`<h1>true</h1><div>hidden</div>`)
2236+
2237+
// unmount suspense
2238+
toggle.value = false
2239+
await Promise.all(deps)
2240+
await nextTick()
2241+
expect(serializeInner(root)).toBe(`<h1>true</h1><!--v-if-->`)
2242+
})
2243+
2244+
test('unmount Suspense after async child (with async setup) self-triggered update', async () => {
2245+
const AsyncComp = defineComponent({
2246+
async setup() {
2247+
const show = ref(true)
2248+
onMounted(() => {
2249+
// trigger update
2250+
show.value = !show.value
2251+
})
2252+
const p = new Promise(r => setTimeout(r, 1))
2253+
// extra tick needed for Node 12+
2254+
deps.push(p.then(() => Promise.resolve()))
2255+
return () =>
2256+
show.value
2257+
? (openBlock(), createElementBlock('div', { key: 0 }, 'show'))
2258+
: (openBlock(), createElementBlock('div', { key: 1 }, 'hidden'))
2259+
},
2260+
})
2261+
21842262
const toggle = ref(true)
21852263
const root = nodeOps.createElement('div')
21862264
const App = {
@@ -2198,7 +2276,7 @@ describe('Suspense', () => {
21982276
Suspense,
21992277
{ key: 0 },
22002278
{
2201-
default: h(Comp),
2279+
default: h(AsyncComp),
22022280
},
22032281
))
22042282
: createCommentVNode('v-if', true),

0 commit comments

Comments
 (0)