@@ -23,6 +23,18 @@ afterAll(() => {
23
23
disableActReturn . cleanup ( )
24
24
} )
25
25
26
+ function createDeferred < T = void > ( ) {
27
+ let resolve : ( value : T ) => void
28
+ let reject : ( error : unknown ) => void
29
+ const promise = new Promise < T > ( ( _resolve , _reject ) => {
30
+ resolve = _resolve
31
+ reject = _reject
32
+ } )
33
+ return { promise, resolve : resolve ! , reject : reject ! }
34
+ }
35
+
36
+ type Deferred < T = void > = ReturnType < typeof createDeferred < T > >
37
+
26
38
describe ( 'useQuery().promise' , ( ) => {
27
39
const queryCache = new QueryCache ( )
28
40
const queryClient = createQueryClient ( {
@@ -148,7 +160,9 @@ describe('useQuery().promise', () => {
148
160
} )
149
161
150
162
it ( 'parallel queries' , async ( ) => {
163
+ const deferred = createDeferred ( )
151
164
const key = queryKey ( )
165
+
152
166
const renderStream = createRenderStream ( { snapshotDOM : true } )
153
167
let callCount = 0
154
168
@@ -158,7 +172,7 @@ describe('useQuery().promise', () => {
158
172
queryKey : key ,
159
173
queryFn : async ( ) => {
160
174
callCount ++
161
- await sleep ( 1 )
175
+ await deferred . promise
162
176
return 'test'
163
177
} ,
164
178
staleTime : 1000 ,
@@ -170,7 +184,7 @@ describe('useQuery().promise', () => {
170
184
171
185
function Loading ( ) {
172
186
useTrackRenders ( )
173
- return < > loading..</ >
187
+ return < span > loading..</ span >
174
188
}
175
189
function Page ( ) {
176
190
useTrackRenders ( )
@@ -181,7 +195,7 @@ describe('useQuery().promise', () => {
181
195
< MyComponent />
182
196
< MyComponent />
183
197
</ React . Suspense >
184
- < React . Suspense fallback = { null } >
198
+ < React . Suspense fallback = { < span > loading 2... </ span > } >
185
199
< MyComponent />
186
200
< MyComponent />
187
201
</ React . Suspense >
@@ -198,19 +212,15 @@ describe('useQuery().promise', () => {
198
212
{
199
213
const { renderedComponents, withinDOM } = await renderStream . takeRender ( )
200
214
withinDOM ( ) . getByText ( 'loading..' )
215
+ withinDOM ( ) . getByText ( 'loading 2...' )
201
216
expect ( renderedComponents ) . toEqual ( [ Page , Loading ] )
202
217
}
203
218
219
+ deferred . resolve ( )
220
+
204
221
{
205
- const { renderedComponents , withinDOM } = await renderStream . takeRender ( )
222
+ const { withinDOM } = await renderStream . takeRender ( )
206
223
withinDOM ( ) . getByText ( 'testtesttesttesttest' )
207
- expect ( renderedComponents ) . toEqual ( [
208
- MyComponent ,
209
- MyComponent ,
210
- MyComponent ,
211
- MyComponent ,
212
- MyComponent ,
213
- ] )
214
224
}
215
225
216
226
expect ( callCount ) . toBe ( 1 )
@@ -493,6 +503,7 @@ describe('useQuery().promise', () => {
493
503
} )
494
504
495
505
it ( 'should throw error if the promise fails' , async ( ) => {
506
+ let deferred = createDeferred ( )
496
507
const renderStream = createRenderStream ( { snapshotDOM : true } )
497
508
const consoleMock = vi
498
509
. spyOn ( console , 'error' )
@@ -514,12 +525,10 @@ describe('useQuery().promise', () => {
514
525
const query = useQuery ( {
515
526
queryKey : key ,
516
527
queryFn : async ( ) => {
517
- await sleep ( 1 )
518
- if ( ++ queryCount > 1 ) {
519
- // second time this query mounts, it should not throw
520
- return 'data'
521
- }
522
- throw new Error ( 'Error test' )
528
+ queryCount ++
529
+ await deferred . promise
530
+
531
+ return 'data'
523
532
} ,
524
533
retry : false ,
525
534
} )
@@ -562,6 +571,9 @@ describe('useQuery().promise', () => {
562
571
withinDOM ( ) . getByText ( 'loading..' )
563
572
}
564
573
574
+ deferred . reject ( new Error ( 'Error test' ) )
575
+ deferred = createDeferred ( )
576
+
565
577
{
566
578
const { withinDOM } = await renderStream . takeRender ( )
567
579
withinDOM ( ) . getByText ( 'error boundary' )
@@ -576,6 +588,7 @@ describe('useQuery().promise', () => {
576
588
withinDOM ( ) . getByText ( 'loading..' )
577
589
}
578
590
591
+ deferred . resolve ( )
579
592
{
580
593
const { withinDOM } = await renderStream . takeRender ( )
581
594
withinDOM ( ) . getByText ( 'data' )
@@ -585,6 +598,7 @@ describe('useQuery().promise', () => {
585
598
} )
586
599
587
600
it ( 'should throw error if the promise fails (colocate suspense and promise)' , async ( ) => {
601
+ const deferred = createDeferred ( )
588
602
const renderStream = createRenderStream ( { snapshotDOM : true } )
589
603
const consoleMock = vi
590
604
. spyOn ( console , 'error' )
@@ -596,8 +610,8 @@ describe('useQuery().promise', () => {
596
610
const query = useQuery ( {
597
611
queryKey : key ,
598
612
queryFn : async ( ) => {
599
- await sleep ( 1 )
600
- throw new Error ( 'Error test' )
613
+ await deferred . promise
614
+ return 'data'
601
615
} ,
602
616
retry : false ,
603
617
} )
@@ -627,6 +641,8 @@ describe('useQuery().promise', () => {
627
641
withinDOM ( ) . getByText ( 'loading..' )
628
642
}
629
643
644
+ deferred . reject ( new Error ( 'Error test' ) )
645
+
630
646
{
631
647
const { withinDOM } = await renderStream . takeRender ( )
632
648
withinDOM ( ) . getByText ( 'error boundary' )
0 commit comments