Skip to content

Commit 27ce0b6

Browse files
authoredDec 10, 2024··
chore: examples to react19 (#8408)
* chore: examples to react19 * test: seems like pre-warming adds another render, which is fine * test: more pre-warming renders (this is fine) * test: use react-render-stream * chore: move tests to renderStream * chore: fix act * test: fix remaining tests * test: move away from fireEvent.click because it uses `act` under the hood, which isn't supported / wanted with renderStreams * test: useInfiniteQuery to renderStream * chore: stabilize test
1 parent aef7ba2 commit 27ce0b6

File tree

29 files changed

+1155
-699
lines changed

29 files changed

+1155
-699
lines changed
 

‎examples/react/algolia/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
"@algolia/client-search": "5.2.1",
1313
"@tanstack/react-query": "^5.62.3",
1414
"@tanstack/react-query-devtools": "^5.62.3",
15-
"react": "19.0.0-rc-66855b96-20241106",
16-
"react-dom": "19.0.0-rc-66855b96-20241106"
15+
"react": "^19.0.0",
16+
"react-dom": "^19.0.0"
1717
},
1818
"devDependencies": {
1919
"@tanstack/eslint-plugin-query": "^5.62.1",

‎examples/react/basic-graphql-request/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
"@tanstack/react-query-devtools": "^5.62.3",
1313
"graphql": "^16.9.0",
1414
"graphql-request": "^7.1.2",
15-
"react": "19.0.0-rc-66855b96-20241106",
16-
"react-dom": "19.0.0-rc-66855b96-20241106"
15+
"react": "^19.0.0",
16+
"react-dom": "^19.0.0"
1717
},
1818
"devDependencies": {
1919
"@vitejs/plugin-react": "^4.3.3",

‎examples/react/basic/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
"@tanstack/react-query": "^5.62.3",
1414
"@tanstack/react-query-devtools": "^5.62.3",
1515
"@tanstack/react-query-persist-client": "^5.62.3",
16-
"react": "19.0.0-rc-66855b96-20241106",
17-
"react-dom": "19.0.0-rc-66855b96-20241106"
16+
"react": "^19.0.0",
17+
"react-dom": "^19.0.0"
1818
},
1919
"devDependencies": {
2020
"@tanstack/eslint-plugin-query": "^5.62.1",

‎examples/react/default-query-function/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
"dependencies": {
1111
"@tanstack/react-query": "^5.62.3",
1212
"@tanstack/react-query-devtools": "^5.62.3",
13-
"react": "19.0.0-rc-66855b96-20241106",
14-
"react-dom": "19.0.0-rc-66855b96-20241106"
13+
"react": "^19.0.0",
14+
"react-dom": "^19.0.0"
1515
},
1616
"devDependencies": {
1717
"@vitejs/plugin-react": "^4.3.3",

‎examples/react/devtools-panel/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
"dependencies": {
1111
"@tanstack/react-query": "^5.62.3",
1212
"@tanstack/react-query-devtools": "^5.62.3",
13-
"react": "19.0.0-rc-66855b96-20241106",
14-
"react-dom": "19.0.0-rc-66855b96-20241106"
13+
"react": "^19.0.0",
14+
"react-dom": "^19.0.0"
1515
},
1616
"devDependencies": {
1717
"@vitejs/plugin-react": "^4.3.3",

‎examples/react/nextjs-app-prefetching/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
"@tanstack/react-query": "^5.62.3",
1313
"@tanstack/react-query-devtools": "^5.62.3",
1414
"next": "^15.0.3",
15-
"react": "19.0.0-rc-66855b96-20241106",
16-
"react-dom": "19.0.0-rc-66855b96-20241106"
15+
"react": "^19.0.0",
16+
"react-dom": "^19.0.0"
1717
},
1818
"devDependencies": {
1919
"@types/react": "npm:types-react@rc",

‎examples/react/offline/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
"@tanstack/react-query-devtools": "^5.62.3",
1515
"@tanstack/react-query-persist-client": "^5.62.3",
1616
"msw": "^2.6.6",
17-
"react": "19.0.0-rc-66855b96-20241106",
18-
"react-dom": "19.0.0-rc-66855b96-20241106",
17+
"react": "^19.0.0",
18+
"react-dom": "^19.0.0",
1919
"react-hot-toast": "^2.4.1"
2020
},
2121
"devDependencies": {

‎examples/react/playground/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
"dependencies": {
1111
"@tanstack/react-query": "^5.62.3",
1212
"@tanstack/react-query-devtools": "^5.62.3",
13-
"react": "19.0.0-rc-66855b96-20241106",
14-
"react-dom": "19.0.0-rc-66855b96-20241106"
13+
"react": "^19.0.0",
14+
"react-dom": "^19.0.0"
1515
},
1616
"devDependencies": {
1717
"@vitejs/plugin-react": "^4.3.3",

‎examples/react/react-native/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
"expo": "^52.0.11",
2020
"expo-constants": "^17.0.3",
2121
"expo-status-bar": "^2.0.0",
22-
"react": "19.0.0-rc-66855b96-20241106",
22+
"react": "^19.0.0",
2323
"react-native": "^0.76.3",
2424
"react-native-gesture-handler": "^2.20.2",
2525
"react-native-paper": "^5.12.5",

‎examples/react/react-router/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
"@tanstack/react-query-devtools": "^5.62.3",
1414
"localforage": "^1.10.0",
1515
"match-sorter": "^6.3.4",
16-
"react": "19.0.0-rc-66855b96-20241106",
17-
"react-dom": "19.0.0-rc-66855b96-20241106",
16+
"react": "^19.0.0",
17+
"react-dom": "^19.0.0",
1818
"react-router": "^6.25.1",
1919
"react-router-dom": "^6.25.1",
2020
"rooks": "^7.14.1",

‎examples/react/rick-morty/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
"@mui/styles": "^6.1.8",
1515
"@tanstack/react-query": "^5.62.3",
1616
"@tanstack/react-query-devtools": "^5.62.3",
17-
"react": "19.0.0-rc-66855b96-20241106",
18-
"react-dom": "19.0.0-rc-66855b96-20241106",
17+
"react": "^19.0.0",
18+
"react-dom": "^19.0.0",
1919
"react-router": "^6.25.1",
2020
"react-router-dom": "^6.25.1"
2121
},

‎examples/react/shadow-dom/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
"dependencies": {
1212
"@tanstack/react-query": "^5.62.3",
1313
"@tanstack/react-query-devtools": "^5.62.3",
14-
"react": "19.0.0-rc-66855b96-20241106",
15-
"react-dom": "19.0.0-rc-66855b96-20241106"
14+
"react": "^19.0.0",
15+
"react-dom": "^19.0.0"
1616
},
1717
"devDependencies": {
1818
"@types/react": "npm:types-react@rc",

‎examples/react/simple/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
"dependencies": {
1111
"@tanstack/react-query": "^5.62.3",
1212
"@tanstack/react-query-devtools": "^5.62.3",
13-
"react": "19.0.0-rc-66855b96-20241106",
14-
"react-dom": "19.0.0-rc-66855b96-20241106"
13+
"react": "^19.0.0",
14+
"react-dom": "^19.0.0"
1515
},
1616
"devDependencies": {
1717
"@vitejs/plugin-react": "^4.3.3",

‎examples/react/star-wars/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
"@mui/styles": "^6.1.8",
1515
"@tanstack/react-query": "^5.62.3",
1616
"@tanstack/react-query-devtools": "^5.62.3",
17-
"react": "19.0.0-rc-66855b96-20241106",
18-
"react-dom": "19.0.0-rc-66855b96-20241106",
17+
"react": "^19.0.0",
18+
"react-dom": "^19.0.0",
1919
"react-router": "^6.25.1",
2020
"react-router-dom": "^6.25.1"
2121
},

‎examples/react/suspense/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
"@tanstack/react-query": "^5.62.3",
1212
"@tanstack/react-query-devtools": "^5.62.3",
1313
"font-awesome": "^4.7.0",
14-
"react": "19.0.0-rc-66855b96-20241106",
15-
"react-dom": "19.0.0-rc-66855b96-20241106",
14+
"react": "^19.0.0",
15+
"react-dom": "^19.0.0",
1616
"react-error-boundary": "^4.1.2"
1717
},
1818
"devDependencies": {

‎integrations/react-next-15/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
"@tanstack/react-query": "workspace:*",
1111
"@tanstack/react-query-devtools": "workspace:*",
1212
"next": "^15.0.3",
13-
"react": "19.0.0-rc-66855b96-20241106",
14-
"react-dom": "19.0.0-rc-66855b96-20241106",
13+
"react": "^19.0.0",
14+
"react-dom": "^19.0.0",
1515
"tupleson": "0.23.1"
1616
},
1717
"devDependencies": {

‎integrations/react-vite/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
"@tanstack/react-query": "workspace:*",
1010
"@tanstack/react-query-devtools": "workspace:*",
1111
"@vitejs/plugin-react": "^4.3.3",
12-
"react": "19.0.0-rc-66855b96-20241106",
13-
"react-dom": "19.0.0-rc-66855b96-20241106",
12+
"react": "^19.0.0",
13+
"react-dom": "^19.0.0",
1414
"vite": "^5.3.5"
1515
}
1616
}

‎integrations/react-webpack-4/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
"dependencies": {
88
"@tanstack/react-query": "workspace:*",
99
"@tanstack/react-query-devtools": "workspace:*",
10-
"react": "19.0.0-rc-66855b96-20241106",
11-
"react-dom": "19.0.0-rc-66855b96-20241106"
10+
"react": "^19.0.0",
11+
"react-dom": "^19.0.0"
1212
},
1313
"devDependencies": {
1414
"@babel/core": "^7.26.0",

‎integrations/react-webpack-5/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
"dependencies": {
88
"@tanstack/react-query": "workspace:*",
99
"@tanstack/react-query-devtools": "workspace:*",
10-
"react": "19.0.0-rc-66855b96-20241106",
11-
"react-dom": "19.0.0-rc-66855b96-20241106"
10+
"react": "^19.0.0",
11+
"react-dom": "^19.0.0"
1212
},
1313
"devDependencies": {
1414
"@babel/core": "^7.26.0",

‎package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@
5858
"prettier": "^3.3.3",
5959
"prettier-plugin-svelte": "^3.3.2",
6060
"publint": "^0.2.12",
61-
"react": "19.0.0-rc-66855b96-20241106",
62-
"react-dom": "19.0.0-rc-66855b96-20241106",
61+
"react": "^19.0.0",
62+
"react-dom": "^19.0.0",
6363
"rimraf": "^6.0.1",
6464
"sherif": "^1.0.0",
6565
"tsup": "8.0.2",

‎packages/react-query-devtools/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@
8383
"@testing-library/react": "^16.0.1",
8484
"@types/react": "npm:types-react@rc",
8585
"@vitejs/plugin-react": "^4.3.3",
86-
"react": "19.0.0-rc-66855b96-20241106"
86+
"react": "^19.0.0"
8787
},
8888
"peerDependencies": {
8989
"@tanstack/react-query": "workspace:^",

‎packages/react-query-next-experimental/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
"@types/react": "npm:types-react@rc",
5858
"@vitejs/plugin-react": "^4.3.3",
5959
"next": "^14.2.18",
60-
"react": "19.0.0-rc-66855b96-20241106"
60+
"react": "^19.0.0"
6161
},
6262
"peerDependencies": {
6363
"@tanstack/react-query": "workspace:^",

‎packages/react-query-persist-client/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
"@testing-library/react": "^16.0.1",
6363
"@types/react": "npm:types-react@rc",
6464
"@vitejs/plugin-react": "^4.3.3",
65-
"react": "19.0.0-rc-66855b96-20241106"
65+
"react": "^19.0.0"
6666
},
6767
"peerDependencies": {
6868
"@tanstack/react-query": "workspace:^",

‎packages/react-query/package.json

+3-2
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,13 @@
6666
"devDependencies": {
6767
"@tanstack/query-persist-client-core": "workspace:*",
6868
"@testing-library/react": "^16.0.1",
69+
"@testing-library/react-render-stream": "^2.0.0",
6970
"@types/react": "npm:types-react@rc",
7071
"@types/react-dom": "npm:types-react-dom@rc",
7172
"@vitejs/plugin-react": "^4.3.3",
7273
"eslint-plugin-react-compiler": "19.0.0-beta-0dec889-20241115",
73-
"react": "19.0.0-rc-66855b96-20241106",
74-
"react-dom": "19.0.0-rc-66855b96-20241106",
74+
"react": "^19.0.0",
75+
"react-dom": "^19.0.0",
7576
"react-error-boundary": "^4.1.2"
7677
},
7778
"peerDependencies": {

‎packages/react-query/src/__tests__/useInfiniteQuery.test.tsx

+89-60
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,16 @@
11
import { describe, expect, it, vi } from 'vitest'
22
import { fireEvent, render, waitFor } from '@testing-library/react'
33
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 '..'
514
import {
615
createQueryClient,
716
queryKey,
@@ -1227,7 +1236,9 @@ describe('useInfiniteQuery', () => {
12271236

12281237
it('should only refetch the first page when initialData is provided', async () => {
12291238
const key = queryKey()
1230-
const states: Array<UseInfiniteQueryResult<InfiniteData<number>>> = []
1239+
1240+
const renderStream =
1241+
createRenderStream<UseInfiniteQueryResult<InfiniteData<number>>>()
12311242

12321243
function Page() {
12331244
const state = useInfiniteQuery({
@@ -1242,52 +1253,63 @@ describe('useInfiniteQuery', () => {
12421253
notifyOnChangeProps: 'all',
12431254
})
12441255

1245-
states.push(state)
1256+
renderStream.replaceSnapshot(state)
12461257

1247-
const { fetchNextPage } = state
1258+
return (
1259+
<button onClick={() => state.fetchNextPage()}>fetchNextPage</button>
1260+
)
1261+
}
12481262

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+
)
12541268

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+
})
12561278
}
12571279

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+
}
12591290

1260-
await sleep(100)
1291+
rendered.getByText('fetchNextPage').click()
12611292

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+
}
12911313
})
12921314

12931315
it('should set hasNextPage to false if getNextPageParam returns undefined', async () => {
@@ -1791,14 +1813,14 @@ describe('useInfiniteQuery', () => {
17911813
it('should work with React.use()', async () => {
17921814
const key = queryKey()
17931815

1794-
let pageRenderCount = 0
1795-
let suspenseRenderCount = 0
1816+
const renderStream = createRenderStream({ snapshotDOM: true })
17961817

17971818
function Loading() {
1798-
suspenseRenderCount++
1819+
useTrackRenders()
17991820
return <>loading...</>
18001821
}
18011822
function MyComponent() {
1823+
useTrackRenders()
18021824
const fetchCountRef = React.useRef(0)
18031825
const query = useInfiniteQuery({
18041826
queryFn: ({ pageParam }) =>
@@ -1825,33 +1847,40 @@ describe('useInfiniteQuery', () => {
18251847
)
18261848
}
18271849
function Page() {
1828-
pageRenderCount++
1850+
useTrackRenders()
18291851
return (
18301852
<React.Suspense fallback={<Loading />}>
18311853
<MyComponent />
18321854
</React.Suspense>
18331855
)
18341856
}
18351857

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+
)
18381863

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+
}
18411869

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+
}
18441876

18451877
// click button
1846-
fireEvent.click(rendered.getByRole('button', { name: 'fetchNextPage' }))
1878+
rendered.getByRole('button', { name: 'fetchNextPage' }).click()
18471879

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+
}
18561885
})
18571886
})

‎packages/react-query/src/__tests__/useQuery.promise.test.tsx

+544-238
Large diffs are not rendered by default.

‎packages/react-query/src/__tests__/useSuspenseQuery.test.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ describe('useSuspenseQuery', () => {
6464

6565
await waitFor(() => rendered.getByText('data: 2'))
6666

67-
expect(renders).toBe(4)
67+
expect(renders).toBe(6)
6868
expect(states.length).toBe(2)
6969
expect(states[0]).toMatchObject({ data: 1, status: 'success' })
7070
expect(states[1]).toMatchObject({ data: 2, status: 'success' })
@@ -754,7 +754,7 @@ describe('useSuspenseQuery', () => {
754754
}),
755755
)
756756

757-
expect(renders).toBe(2)
757+
expect(renders).toBe(3)
758758
await waitFor(() => expect(rendered.queryByText('rendered')).not.toBeNull())
759759
})
760760

‎packages/react-query/test-setup.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
import '@testing-library/jest-dom/vitest'
2-
import { act, cleanup } from '@testing-library/react'
2+
import { act, cleanup as cleanupRTL } from '@testing-library/react'
3+
import { cleanup as cleanupRRS } from '@testing-library/react-render-stream'
34
import { afterEach } from 'vitest'
45
import { notifyManager } from '@tanstack/query-core'
56

67
// https://testing-library.com/docs/react-testing-library/api#cleanup
7-
afterEach(() => cleanup())
8+
afterEach(() => {
9+
cleanupRTL()
10+
cleanupRRS()
11+
})
812

913
// Wrap notifications with act to make sure React knows about React Query updates
1014
notifyManager.setNotifyFunction((fn) => {

‎pnpm-lock.yaml

+469-353
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)
Please sign in to comment.