1
1
import { describe , expect , it , vi } from 'vitest'
2
2
import { fireEvent , render , waitFor } from '@testing-library/react'
3
3
import * as React from 'react'
4
- import { QueryCache , keepPreviousData , useInfiniteQuery } from '..'
4
+ import {
5
+ createRenderStream ,
6
+ useTrackRenders ,
7
+ } from '@testing-library/react-render-stream'
8
+ import {
9
+ QueryCache ,
10
+ QueryClientProvider ,
11
+ keepPreviousData ,
12
+ useInfiniteQuery ,
13
+ } from '..'
5
14
import {
6
15
createQueryClient ,
7
16
queryKey ,
@@ -1227,7 +1236,9 @@ describe('useInfiniteQuery', () => {
1227
1236
1228
1237
it ( 'should only refetch the first page when initialData is provided' , async ( ) => {
1229
1238
const key = queryKey ( )
1230
- const states : Array < UseInfiniteQueryResult < InfiniteData < number > > > = [ ]
1239
+
1240
+ const renderStream =
1241
+ createRenderStream < UseInfiniteQueryResult < InfiniteData < number > > > ( )
1231
1242
1232
1243
function Page ( ) {
1233
1244
const state = useInfiniteQuery ( {
@@ -1242,52 +1253,63 @@ describe('useInfiniteQuery', () => {
1242
1253
notifyOnChangeProps : 'all' ,
1243
1254
} )
1244
1255
1245
- states . push ( state )
1256
+ renderStream . replaceSnapshot ( state )
1246
1257
1247
- const { fetchNextPage } = state
1258
+ return (
1259
+ < button onClick = { ( ) => state . fetchNextPage ( ) } > fetchNextPage</ button >
1260
+ )
1261
+ }
1248
1262
1249
- React . useEffect ( ( ) => {
1250
- setActTimeout ( ( ) => {
1251
- fetchNextPage ( )
1252
- } , 20 )
1253
- } , [ fetchNextPage ] )
1263
+ const rendered = await renderStream . render (
1264
+ < QueryClientProvider client = { queryClient } >
1265
+ < Page />
1266
+ </ QueryClientProvider > ,
1267
+ )
1254
1268
1255
- return null
1269
+ {
1270
+ const { snapshot } = await renderStream . takeRender ( )
1271
+ expect ( snapshot ) . toMatchObject ( {
1272
+ data : { pages : [ 1 ] } ,
1273
+ hasNextPage : true ,
1274
+ isFetching : true ,
1275
+ isFetchingNextPage : false ,
1276
+ isSuccess : true ,
1277
+ } )
1256
1278
}
1257
1279
1258
- renderWithClient ( queryClient , < Page /> )
1280
+ {
1281
+ const { snapshot } = await renderStream . takeRender ( )
1282
+ expect ( snapshot ) . toMatchObject ( {
1283
+ data : { pages : [ 1 ] } ,
1284
+ hasNextPage : true ,
1285
+ isFetching : false ,
1286
+ isFetchingNextPage : false ,
1287
+ isSuccess : true ,
1288
+ } )
1289
+ }
1259
1290
1260
- await sleep ( 100 )
1291
+ rendered . getByText ( 'fetchNextPage' ) . click ( )
1261
1292
1262
- expect ( states . length ) . toBe ( 4 )
1263
- expect ( states [ 0 ] ) . toMatchObject ( {
1264
- data : { pages : [ 1 ] } ,
1265
- hasNextPage : true ,
1266
- isFetching : true ,
1267
- isFetchingNextPage : false ,
1268
- isSuccess : true ,
1269
- } )
1270
- expect ( states [ 1 ] ) . toMatchObject ( {
1271
- data : { pages : [ 1 ] } ,
1272
- hasNextPage : true ,
1273
- isFetching : false ,
1274
- isFetchingNextPage : false ,
1275
- isSuccess : true ,
1276
- } )
1277
- expect ( states [ 2 ] ) . toMatchObject ( {
1278
- data : { pages : [ 1 ] } ,
1279
- hasNextPage : true ,
1280
- isFetching : true ,
1281
- isFetchingNextPage : true ,
1282
- isSuccess : true ,
1283
- } )
1284
- expect ( states [ 3 ] ) . toMatchObject ( {
1285
- data : { pages : [ 1 , 2 ] } ,
1286
- hasNextPage : true ,
1287
- isFetching : false ,
1288
- isFetchingNextPage : false ,
1289
- isSuccess : true ,
1290
- } )
1293
+ {
1294
+ const { snapshot } = await renderStream . takeRender ( )
1295
+ expect ( snapshot ) . toMatchObject ( {
1296
+ data : { pages : [ 1 ] } ,
1297
+ hasNextPage : true ,
1298
+ isFetching : true ,
1299
+ isFetchingNextPage : true ,
1300
+ isSuccess : true ,
1301
+ } )
1302
+ }
1303
+ {
1304
+ const { snapshot } = await renderStream . takeRender ( )
1305
+ expect ( snapshot ) . toMatchObject ( {
1306
+ data : { pages : [ 1 , 2 ] } ,
1307
+ hasNextPage : true ,
1308
+ isFetching : false ,
1309
+ isFetchingNextPage : false ,
1310
+ isSuccess : true ,
1311
+ } )
1312
+ }
1291
1313
} )
1292
1314
1293
1315
it ( 'should set hasNextPage to false if getNextPageParam returns undefined' , async ( ) => {
@@ -1791,14 +1813,14 @@ describe('useInfiniteQuery', () => {
1791
1813
it ( 'should work with React.use()' , async ( ) => {
1792
1814
const key = queryKey ( )
1793
1815
1794
- let pageRenderCount = 0
1795
- let suspenseRenderCount = 0
1816
+ const renderStream = createRenderStream ( { snapshotDOM : true } )
1796
1817
1797
1818
function Loading ( ) {
1798
- suspenseRenderCount ++
1819
+ useTrackRenders ( )
1799
1820
return < > loading...</ >
1800
1821
}
1801
1822
function MyComponent ( ) {
1823
+ useTrackRenders ( )
1802
1824
const fetchCountRef = React . useRef ( 0 )
1803
1825
const query = useInfiniteQuery ( {
1804
1826
queryFn : ( { pageParam } ) =>
@@ -1825,33 +1847,40 @@ describe('useInfiniteQuery', () => {
1825
1847
)
1826
1848
}
1827
1849
function Page ( ) {
1828
- pageRenderCount ++
1850
+ useTrackRenders ( )
1829
1851
return (
1830
1852
< React . Suspense fallback = { < Loading /> } >
1831
1853
< MyComponent />
1832
1854
</ React . Suspense >
1833
1855
)
1834
1856
}
1835
1857
1836
- const rendered = renderWithClient ( queryClient , < Page /> )
1837
- await waitFor ( ( ) => rendered . getByText ( 'loading...' ) )
1858
+ const rendered = await renderStream . render (
1859
+ < QueryClientProvider client = { queryClient } >
1860
+ < Page />
1861
+ </ QueryClientProvider > ,
1862
+ )
1838
1863
1839
- await waitFor ( ( ) => rendered . getByText ( 'Page: 1' ) )
1840
- await waitFor ( ( ) => rendered . getByText ( 'Item: 1' ) )
1864
+ {
1865
+ const { renderedComponents, withinDOM } = await renderStream . takeRender ( )
1866
+ withinDOM ( ) . getByText ( 'loading...' )
1867
+ expect ( renderedComponents ) . toEqual ( [ Page , Loading ] )
1868
+ }
1841
1869
1842
- expect ( rendered . queryByText ( 'Page: 2' ) ) . toBeNull ( )
1843
- expect ( pageRenderCount ) . toBe ( 1 )
1870
+ {
1871
+ const { renderedComponents, withinDOM } = await renderStream . takeRender ( )
1872
+ withinDOM ( ) . getByText ( 'Page: 1' )
1873
+ withinDOM ( ) . getByText ( 'Item: 1' )
1874
+ expect ( renderedComponents ) . toEqual ( [ MyComponent ] )
1875
+ }
1844
1876
1845
1877
// click button
1846
- fireEvent . click ( rendered . getByRole ( 'button' , { name : 'fetchNextPage' } ) )
1878
+ rendered . getByRole ( 'button' , { name : 'fetchNextPage' } ) . click ( )
1847
1879
1848
- await waitFor ( ( ) => {
1849
- expect ( rendered . queryByText ( 'Page: 2' ) ) . not . toBeNull ( )
1850
- } )
1851
-
1852
- // Suspense doesn't trigger when fetching next page
1853
- expect ( suspenseRenderCount ) . toBe ( 1 )
1854
-
1855
- expect ( pageRenderCount ) . toBe ( 1 )
1880
+ {
1881
+ const { renderedComponents, withinDOM } = await renderStream . takeRender ( )
1882
+ withinDOM ( ) . getByText ( 'Page: 1' )
1883
+ expect ( renderedComponents ) . toEqual ( [ MyComponent ] )
1884
+ }
1856
1885
} )
1857
1886
} )
0 commit comments