@@ -69,6 +69,32 @@ describe('Suspense', () => {
69
69
expect ( serializeInner ( root ) ) . toBe ( `<div>async</div>` )
70
70
} )
71
71
72
+ test ( 'fallback content' , async ( ) => {
73
+ const Async = defineAsyncComponent ( {
74
+ render ( ) {
75
+ return h ( 'div' , 'async' )
76
+ }
77
+ } )
78
+
79
+ const Comp = {
80
+ setup ( ) {
81
+ return ( ) =>
82
+ h ( Suspense , null , {
83
+ default : h ( Async ) ,
84
+ fallback : h ( 'div' , 'fallback' )
85
+ } )
86
+ }
87
+ }
88
+
89
+ const root = nodeOps . createElement ( 'div' )
90
+ render ( h ( Comp ) , root )
91
+ expect ( serializeInner ( root ) ) . toBe ( `<div>fallback</div>` )
92
+
93
+ await Promise . all ( deps )
94
+ await nextTick ( )
95
+ expect ( serializeInner ( root ) ) . toBe ( `<div>async</div>` )
96
+ } )
97
+
72
98
test ( 'emits events' , async ( ) => {
73
99
const Async = defineAsyncComponent ( {
74
100
render ( ) {
@@ -709,7 +735,7 @@ describe('Suspense', () => {
709
735
<div v-if="errorMessage">{{ errorMessage }}</div>
710
736
<Suspense v-else>
711
737
<div>
712
- <Async />
738
+ <Async />
713
739
</div>
714
740
<template #fallback>
715
741
<div>fallback</div>
@@ -983,6 +1009,66 @@ describe('Suspense', () => {
983
1009
expect ( serializeInner ( root ) ) . toBe ( `<div>foo<div>foo nested</div></div>` )
984
1010
} )
985
1011
1012
+ test ( 'display previous branch when timeout + no fallback slot is provided' , async ( ) => {
1013
+ const toggle = ref ( false )
1014
+ let resolve = ( ) => { }
1015
+ let promise : Promise < void >
1016
+ function createPromise ( ) {
1017
+ promise = new Promise < void > ( r => {
1018
+ resolve = r
1019
+ } )
1020
+
1021
+ return promise
1022
+ }
1023
+
1024
+ const Foo = {
1025
+ async setup ( ) {
1026
+ await createPromise ( )
1027
+ return ( ) => h ( 'div' , [ 'foo' ] )
1028
+ }
1029
+ }
1030
+
1031
+ const onPending = jest . fn ( )
1032
+ const onFallback = jest . fn ( )
1033
+ const onResolve = jest . fn ( )
1034
+
1035
+ const Comp = {
1036
+ setup ( ) {
1037
+ return ( ) =>
1038
+ h (
1039
+ Suspense ,
1040
+ { timeout : 0 , onPending, onFallback, onResolve } ,
1041
+ {
1042
+ default : toggle . value ? h ( Foo ) : 'other'
1043
+ }
1044
+ )
1045
+ }
1046
+ }
1047
+
1048
+ const root = nodeOps . createElement ( 'div' )
1049
+ render ( h ( Comp ) , root )
1050
+ expect ( serializeInner ( root ) ) . toBe ( `other` )
1051
+ expect ( onPending ) . toHaveBeenCalledTimes ( 0 )
1052
+ expect ( onFallback ) . toHaveBeenCalledTimes ( 0 )
1053
+ expect ( onResolve ) . toHaveBeenCalledTimes ( 1 )
1054
+
1055
+ toggle . value = true
1056
+ await nextTick ( )
1057
+ expect ( serializeInner ( root ) ) . toBe ( `other` )
1058
+ expect ( onPending ) . toHaveBeenCalledTimes ( 1 )
1059
+ expect ( onFallback ) . toHaveBeenCalledTimes ( 0 )
1060
+ expect ( onResolve ) . toHaveBeenCalledTimes ( 1 )
1061
+
1062
+ resolve ( )
1063
+ await promise !
1064
+ await nextTick ( )
1065
+ await nextTick ( )
1066
+ expect ( serializeInner ( root ) ) . toBe ( `<div>foo</div>` )
1067
+ expect ( onPending ) . toHaveBeenCalledTimes ( 1 )
1068
+ expect ( onFallback ) . toHaveBeenCalledTimes ( 0 )
1069
+ expect ( onResolve ) . toHaveBeenCalledTimes ( 2 )
1070
+ } )
1071
+
986
1072
test ( 'branch switch to 3rd branch before resolve' , async ( ) => {
987
1073
const calls : string [ ] = [ ]
988
1074
0 commit comments