1
1
import { afterEach , beforeEach , describe , expect , it , vi } from 'vitest'
2
- import { fireEvent } from '@testing-library/react'
2
+ import { act , fireEvent } from '@testing-library/react'
3
3
import * as React from 'react'
4
4
import { ErrorBoundary } from 'react-error-boundary'
5
5
import { queryKey , sleep } from '@tanstack/query-test-utils'
@@ -69,10 +69,12 @@ describe('useSuspenseQuery', () => {
69
69
</ React . Suspense > ,
70
70
)
71
71
72
- await vi . waitFor ( ( ) => rendered . getByText ( 'data: 1' ) )
73
- fireEvent . click ( rendered . getByLabelText ( 'toggle' ) )
72
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 11 ) )
73
+ rendered . getByText ( 'data: 1' )
74
74
75
- await vi . waitFor ( ( ) => rendered . getByText ( 'data: 2' ) )
75
+ fireEvent . click ( rendered . getByLabelText ( 'toggle' ) )
76
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 11 ) )
77
+ rendered . getByText ( 'data: 2' )
76
78
77
79
expect ( renders ) . toBe ( 6 )
78
80
expect ( states . length ) . toBe ( 2 )
@@ -112,7 +114,8 @@ describe('useSuspenseQuery', () => {
112
114
</ React . Suspense > ,
113
115
)
114
116
115
- await vi . waitFor ( ( ) => rendered . getByText ( 'data: 1' ) )
117
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 11 ) )
118
+ rendered . getByText ( 'data: 1' )
116
119
117
120
expect ( states . length ) . toBe ( 1 )
118
121
expect ( states [ 0 ] ) . toMatchObject ( {
@@ -121,7 +124,8 @@ describe('useSuspenseQuery', () => {
121
124
} )
122
125
123
126
fireEvent . click ( rendered . getByText ( 'next' ) )
124
- await vi . waitFor ( ( ) => rendered . getByText ( 'data: 2' ) )
127
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 11 ) )
128
+ rendered . getByText ( 'data: 2' )
125
129
126
130
expect ( states . length ) . toBe ( 2 )
127
131
expect ( states [ 1 ] ) . toMatchObject ( {
@@ -152,7 +156,8 @@ describe('useSuspenseQuery', () => {
152
156
</ React . Suspense > ,
153
157
)
154
158
155
- await vi . waitFor ( ( ) => rendered . getByText ( 'rendered' ) )
159
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 11 ) )
160
+ rendered . getByText ( 'rendered' )
156
161
157
162
expect ( queryFn ) . toHaveBeenCalledTimes ( 1 )
158
163
} )
@@ -192,12 +197,13 @@ describe('useSuspenseQuery', () => {
192
197
expect ( queryCache . find ( { queryKey : key } ) ) . toBeFalsy ( )
193
198
194
199
fireEvent . click ( rendered . getByLabelText ( 'toggle' ) )
195
- await vi . waitFor ( ( ) => rendered . getByText ( 'rendered' ) )
200
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 11 ) )
201
+ rendered . getByText ( 'rendered' )
196
202
197
203
expect ( queryCache . find ( { queryKey : key } ) ?. getObserversCount ( ) ) . toBe ( 1 )
198
204
199
205
fireEvent . click ( rendered . getByLabelText ( 'toggle' ) )
200
-
206
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 11 ) )
201
207
expect ( rendered . queryByText ( 'rendered' ) ) . toBeNull ( )
202
208
expect ( queryCache . find ( { queryKey : key } ) ?. getObserversCount ( ) ) . toBe ( 0 )
203
209
} )
@@ -257,15 +263,13 @@ describe('useSuspenseQuery', () => {
257
263
</ QueryErrorResetBoundary > ,
258
264
)
259
265
260
- await vi . waitFor ( ( ) => rendered . getByText ( 'Loading...' ) )
261
-
262
- await vi . waitFor ( ( ) => rendered . getByText ( 'error boundary' ) )
263
-
264
- await vi . waitFor ( ( ) => rendered . getByText ( 'retry' ) )
265
-
266
+ rendered . getByText ( 'Loading...' )
267
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 71 ) )
268
+ rendered . getByText ( 'error boundary' )
269
+ rendered . getByText ( 'retry' )
266
270
fireEvent . click ( rendered . getByText ( 'retry' ) )
267
-
268
- await vi . waitFor ( ( ) => rendered . getByText ( 'rendered' ) )
271
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 11 ) )
272
+ rendered . getByText ( 'rendered' )
269
273
270
274
expect ( consoleMock . mock . calls [ 0 ] ?. [ 1 ] ) . toStrictEqual (
271
275
new Error ( 'Suspense Error Bingo' ) ,
@@ -325,27 +329,18 @@ describe('useSuspenseQuery', () => {
325
329
</ QueryErrorResetBoundary > ,
326
330
)
327
331
328
- await vi . waitFor ( ( ) =>
329
- expect ( rendered . getByText ( 'Loading...' ) ) . toBeInTheDocument ( ) ,
330
- )
331
- await vi . waitFor ( ( ) =>
332
- expect ( rendered . getByText ( 'error boundary' ) ) . toBeInTheDocument ( ) ,
333
- )
334
- await vi . waitFor ( ( ) =>
335
- expect ( rendered . getByText ( 'retry' ) ) . toBeInTheDocument ( ) ,
336
- )
332
+ expect ( rendered . getByText ( 'Loading...' ) ) . toBeInTheDocument ( )
333
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 71 ) )
334
+ expect ( rendered . getByText ( 'error boundary' ) ) . toBeInTheDocument ( )
335
+ expect ( rendered . getByText ( 'retry' ) ) . toBeInTheDocument ( )
337
336
fireEvent . click ( rendered . getByText ( 'retry' ) )
338
- await vi . waitFor ( ( ) =>
339
- expect ( rendered . getByText ( 'error boundary' ) ) . toBeInTheDocument ( ) ,
340
- )
341
- await vi . waitFor ( ( ) =>
342
- expect ( rendered . getByText ( 'retry' ) ) . toBeInTheDocument ( ) ,
343
- )
337
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 71 ) )
338
+ expect ( rendered . getByText ( 'error boundary' ) ) . toBeInTheDocument ( )
339
+ expect ( rendered . getByText ( 'retry' ) ) . toBeInTheDocument ( )
344
340
succeed = true
345
341
fireEvent . click ( rendered . getByText ( 'retry' ) )
346
- await vi . waitFor ( ( ) =>
347
- expect ( rendered . getByText ( 'rendered' ) ) . toBeInTheDocument ( ) ,
348
- )
342
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 11 ) )
343
+ expect ( rendered . getByText ( 'rendered' ) ) . toBeInTheDocument ( )
349
344
consoleMock . mockRestore ( )
350
345
} )
351
346
@@ -380,8 +375,9 @@ describe('useSuspenseQuery', () => {
380
375
381
376
const rendered = renderWithClient ( queryClient , < Page /> )
382
377
383
- await vi . waitFor ( ( ) => rendered . getByText ( 'Loading...' ) )
384
- await vi . waitFor ( ( ) => rendered . getByText ( 'data: 1' ) )
378
+ rendered . getByText ( 'Loading...' )
379
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 6 ) )
380
+ rendered . getByText ( 'data: 1' )
385
381
386
382
expect (
387
383
typeof queryClient . getQueryCache ( ) . find ( { queryKey : key } ) ?. observers [ 0 ]
@@ -426,16 +422,12 @@ describe('useSuspenseQuery', () => {
426
422
427
423
const rendered = renderWithClient ( queryClient , < Page /> )
428
424
429
- await vi . waitFor ( ( ) =>
430
- expect ( rendered . getByText ( 'Loading...' ) ) . toBeInTheDocument ( ) ,
431
- )
432
- await vi . waitFor ( ( ) =>
433
- expect ( rendered . getByText ( `data: ${ key1 } ` ) ) . toBeInTheDocument ( ) ,
434
- )
425
+ expect ( rendered . getByText ( 'Loading...' ) ) . toBeInTheDocument ( )
426
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 101 ) )
427
+ expect ( rendered . getByText ( `data: ${ key1 } ` ) ) . toBeInTheDocument ( )
435
428
fireEvent . click ( rendered . getByText ( 'switch' ) )
436
- await vi . waitFor ( ( ) =>
437
- expect ( rendered . getByText ( 'Loading...' ) ) . toBeInTheDocument ( ) ,
438
- )
429
+ expect ( rendered . getByText ( 'Loading...' ) ) . toBeInTheDocument ( )
430
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 101 ) )
439
431
await vi . waitFor ( ( ) =>
440
432
expect ( rendered . getByText ( `data: ${ key2 } ` ) ) . toBeInTheDocument ( ) ,
441
433
)
@@ -492,27 +484,18 @@ describe('useSuspenseQuery', () => {
492
484
493
485
const rendered = renderWithClient ( queryClient , < App /> )
494
486
495
- await vi . waitFor ( ( ) =>
496
- expect ( rendered . getByText ( 'Loading...' ) ) . toBeInTheDocument ( ) ,
497
- )
498
- await vi . waitFor ( ( ) =>
499
- expect ( rendered . getByText ( 'error boundary' ) ) . toBeInTheDocument ( ) ,
500
- )
501
- await vi . waitFor ( ( ) =>
502
- expect ( rendered . getByText ( 'retry' ) ) . toBeInTheDocument ( ) ,
503
- )
487
+ expect ( rendered . getByText ( 'Loading...' ) ) . toBeInTheDocument ( )
488
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 71 ) )
489
+ expect ( rendered . getByText ( 'error boundary' ) ) . toBeInTheDocument ( )
490
+ expect ( rendered . getByText ( 'retry' ) ) . toBeInTheDocument ( )
504
491
fireEvent . click ( rendered . getByText ( 'retry' ) )
505
- await vi . waitFor ( ( ) =>
506
- expect ( rendered . getByText ( 'error boundary' ) ) . toBeInTheDocument ( ) ,
507
- )
508
- await vi . waitFor ( ( ) =>
509
- expect ( rendered . getByText ( 'retry' ) ) . toBeInTheDocument ( ) ,
510
- )
492
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 71 ) )
493
+ expect ( rendered . getByText ( 'error boundary' ) ) . toBeInTheDocument ( )
494
+ expect ( rendered . getByText ( 'retry' ) ) . toBeInTheDocument ( )
511
495
succeed = true
512
496
fireEvent . click ( rendered . getByText ( 'retry' ) )
513
- await vi . waitFor ( ( ) =>
514
- expect ( rendered . getByText ( 'rendered' ) ) . toBeInTheDocument ( ) ,
515
- )
497
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 11 ) )
498
+ expect ( rendered . getByText ( 'rendered' ) ) . toBeInTheDocument ( )
516
499
consoleMock . mockRestore ( )
517
500
} )
518
501
@@ -552,12 +535,9 @@ describe('useSuspenseQuery', () => {
552
535
553
536
const rendered = renderWithClient ( queryClient , < App /> )
554
537
555
- await vi . waitFor ( ( ) =>
556
- expect ( rendered . getByText ( 'Loading...' ) ) . toBeInTheDocument ( ) ,
557
- )
558
- await vi . waitFor ( ( ) =>
559
- expect ( rendered . getByText ( 'error boundary' ) ) . toBeInTheDocument ( ) ,
560
- )
538
+ expect ( rendered . getByText ( 'Loading...' ) ) . toBeInTheDocument ( )
539
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 71 ) )
540
+ expect ( rendered . getByText ( 'error boundary' ) ) . toBeInTheDocument ( )
561
541
consoleMock . mockRestore ( )
562
542
} )
563
543
@@ -599,12 +579,9 @@ describe('useSuspenseQuery', () => {
599
579
600
580
const rendered = renderWithClient ( queryClient , < App /> )
601
581
602
- await vi . waitFor ( ( ) =>
603
- expect ( rendered . getByText ( 'Loading...' ) ) . toBeInTheDocument ( ) ,
604
- )
605
- await vi . waitFor ( ( ) =>
606
- expect ( rendered . getByText ( 'error boundary' ) ) . toBeInTheDocument ( ) ,
607
- )
582
+ expect ( rendered . getByText ( 'Loading...' ) ) . toBeInTheDocument ( )
583
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 0 ) )
584
+ expect ( rendered . getByText ( 'error boundary' ) ) . toBeInTheDocument ( )
608
585
consoleMock . mockRestore ( )
609
586
} )
610
587
@@ -663,16 +640,18 @@ describe('useSuspenseQuery', () => {
663
640
const rendered = renderWithClient ( queryClient , < App /> )
664
641
665
642
// render suspense fallback (Loading...)
666
- await vi . waitFor ( ( ) => rendered . getByText ( 'Loading...' ) )
643
+ rendered . getByText ( 'Loading...' )
667
644
// resolve promise -> render Page (rendered)
668
- await vi . waitFor ( ( ) => rendered . getByText ( 'rendered' ) )
645
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 11 ) )
646
+ rendered . getByText ( 'rendered' )
669
647
670
648
// change query key
671
649
succeed = false
672
650
// reset query -> and throw error
673
651
fireEvent . click ( rendered . getByLabelText ( 'fail' ) )
674
652
// render error boundary fallback (error boundary)
675
- await vi . waitFor ( ( ) => rendered . getByText ( 'error boundary' ) )
653
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 11 ) )
654
+ rendered . getByText ( 'error boundary' )
676
655
expect ( consoleMock . mock . calls [ 0 ] ?. [ 1 ] ) . toStrictEqual (
677
656
new Error ( 'Suspense Error Bingo' ) ,
678
657
)
@@ -734,16 +713,18 @@ describe('useSuspenseQuery', () => {
734
713
const rendered = renderWithClient ( queryClient , < App /> )
735
714
736
715
// render suspense fallback (Loading...)
737
- await vi . waitFor ( ( ) => rendered . getByText ( 'Loading...' ) )
716
+ rendered . getByText ( 'Loading...' )
738
717
// resolve promise -> render Page (rendered)
739
- await vi . waitFor ( ( ) => rendered . getByText ( 'rendered' ) )
718
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 11 ) )
719
+ rendered . getByText ( 'rendered' )
740
720
741
721
// change promise result to error
742
722
succeed = false
743
723
// change query key
744
724
fireEvent . click ( rendered . getByLabelText ( 'fail' ) )
745
725
// render error boundary fallback (error boundary)
746
- await vi . waitFor ( ( ) => rendered . getByText ( 'error boundary' ) )
726
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 11 ) )
727
+ rendered . getByText ( 'error boundary' )
747
728
expect ( consoleMock . mock . calls [ 0 ] ?. [ 1 ] ) . toStrictEqual (
748
729
new Error ( 'Suspense Error Bingo' ) ,
749
730
)
@@ -785,17 +766,13 @@ describe('useSuspenseQuery', () => {
785
766
</ React . Suspense > ,
786
767
)
787
768
788
- await vi . waitFor ( ( ) =>
789
- expect ( state ) . toMatchObject ( {
790
- data : 1 ,
791
- status : 'success' ,
792
- } ) ,
793
- )
794
-
769
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 11 ) )
770
+ expect ( state ) . toMatchObject ( {
771
+ data : 1 ,
772
+ status : 'success' ,
773
+ } )
795
774
expect ( renders ) . toBe ( 3 )
796
- await vi . waitFor ( ( ) =>
797
- expect ( rendered . queryByText ( 'rendered' ) ) . not . toBeNull ( ) ,
798
- )
775
+ expect ( rendered . queryByText ( 'rendered' ) ) . not . toBeNull ( )
799
776
} )
800
777
801
778
it ( 'should not throw background errors to the error boundary' , async ( ) => {
@@ -846,22 +823,18 @@ describe('useSuspenseQuery', () => {
846
823
const rendered = renderWithClient ( queryClient , < App /> )
847
824
848
825
// render suspense fallback (Loading...)
849
- await vi . waitFor ( ( ) =>
850
- expect ( rendered . getByText ( 'Loading...' ) ) . toBeInTheDocument ( ) ,
851
- )
826
+ expect ( rendered . getByText ( 'Loading...' ) ) . toBeInTheDocument ( )
852
827
// resolve promise -> render Page (rendered)
853
- await vi . waitFor ( ( ) =>
854
- expect ( rendered . getByText ( 'rendered data success' ) ) . toBeInTheDocument ( ) ,
855
- )
828
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 11 ) )
829
+ expect ( rendered . getByText ( 'rendered data success' ) ) . toBeInTheDocument ( )
856
830
857
831
// change promise result to error
858
832
succeed = false
859
833
// refetch
860
834
fireEvent . click ( rendered . getByRole ( 'button' , { name : 'refetch' } ) )
861
835
// we are now in error state but still have data to show
862
- await vi . waitFor ( ( ) =>
863
- expect ( rendered . getByText ( 'rendered data error' ) ) . toBeInTheDocument ( ) ,
864
- )
836
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 11 ) )
837
+ expect ( rendered . getByText ( 'rendered data error' ) ) . toBeInTheDocument ( )
865
838
866
839
consoleMock . mockRestore ( )
867
840
} )
@@ -907,20 +880,15 @@ describe('useSuspenseQuery', () => {
907
880
< Page />
908
881
</ React . Suspense > ,
909
882
)
910
- await vi . waitFor ( ( ) =>
911
- expect ( rendered . getByText ( 'loading' ) ) . toBeInTheDocument ( ) ,
912
- )
913
- await vi . waitFor ( ( ) =>
914
- expect ( rendered . getByText ( 'data: 1' ) ) . toBeInTheDocument ( ) ,
915
- )
883
+
884
+ expect ( rendered . getByText ( 'loading' ) ) . toBeInTheDocument ( )
885
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 101 ) )
886
+ expect ( rendered . getByText ( 'data: 1' ) ) . toBeInTheDocument ( )
916
887
fireEvent . click ( rendered . getByLabelText ( 'toggle' ) )
917
888
918
- await vi . waitFor ( ( ) =>
919
- expect ( rendered . getByText ( 'loading' ) ) . toBeInTheDocument ( ) ,
920
- )
921
- await vi . waitFor ( ( ) =>
922
- expect ( rendered . getByText ( 'data: 2' ) ) . toBeInTheDocument ( ) ,
923
- )
889
+ expect ( rendered . getByText ( 'loading' ) ) . toBeInTheDocument ( )
890
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 101 ) )
891
+ expect ( rendered . getByText ( 'data: 2' ) ) . toBeInTheDocument ( )
924
892
} )
925
893
926
894
it ( 'should log an error when skipToken is passed as queryFn' , ( ) => {
@@ -979,9 +947,12 @@ describe('useSuspenseQuery', () => {
979
947
</ React . Suspense > ,
980
948
)
981
949
982
- await vi . waitFor ( ( ) => rendered . getByText ( 'count: 1' ) )
983
- await vi . waitFor ( ( ) => rendered . getByText ( 'count: 2' ) )
984
- await vi . waitFor ( ( ) => rendered . getByText ( 'count: 3' ) )
950
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 2 ) )
951
+ rendered . getByText ( 'count: 1' )
952
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 12 ) )
953
+ rendered . getByText ( 'count: 2' )
954
+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 12 ) )
955
+ rendered . getByText ( 'count: 3' )
985
956
986
957
expect ( count ) . toBeGreaterThanOrEqual ( 3 )
987
958
} )
0 commit comments