@tanstack/react-query 4.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/build/cjs/query-core/build/esm/index.js +3110 -0
  2. package/build/cjs/query-core/build/esm/index.js.map +1 -0
  3. package/build/cjs/react-query/src/Hydrate.js +66 -0
  4. package/build/cjs/react-query/src/Hydrate.js.map +1 -0
  5. package/build/cjs/react-query/src/QueryClientProvider.js +96 -0
  6. package/build/cjs/react-query/src/QueryClientProvider.js.map +1 -0
  7. package/build/cjs/react-query/src/QueryErrorResetBoundary.js +67 -0
  8. package/build/cjs/react-query/src/QueryErrorResetBoundary.js.map +1 -0
  9. package/build/cjs/react-query/src/index.js +64 -0
  10. package/build/cjs/react-query/src/index.js.map +1 -0
  11. package/build/cjs/react-query/src/isRestoring.js +43 -0
  12. package/build/cjs/react-query/src/isRestoring.js.map +1 -0
  13. package/build/cjs/react-query/src/useBaseQuery.js +117 -0
  14. package/build/cjs/react-query/src/useBaseQuery.js.map +1 -0
  15. package/build/cjs/react-query/src/useInfiniteQuery.js +24 -0
  16. package/build/cjs/react-query/src/useInfiniteQuery.js.map +1 -0
  17. package/build/cjs/react-query/src/useIsFetching.js +50 -0
  18. package/build/cjs/react-query/src/useIsFetching.js.map +1 -0
  19. package/build/cjs/react-query/src/useIsMutating.js +50 -0
  20. package/build/cjs/react-query/src/useIsMutating.js.map +1 -0
  21. package/build/cjs/react-query/src/useMutation.js +68 -0
  22. package/build/cjs/react-query/src/useMutation.js.map +1 -0
  23. package/build/cjs/react-query/src/useQueries.js +71 -0
  24. package/build/cjs/react-query/src/useQueries.js.map +1 -0
  25. package/build/cjs/react-query/src/useQuery.js +24 -0
  26. package/build/cjs/react-query/src/useQuery.js.map +1 -0
  27. package/build/cjs/react-query/src/utils.js +25 -0
  28. package/build/cjs/react-query/src/utils.js.map +1 -0
  29. package/build/esm/index.js +3368 -0
  30. package/build/esm/index.js.map +1 -0
  31. package/build/stats-html.html +2689 -0
  32. package/build/stats.json +666 -0
  33. package/build/types/packages/query-core/src/focusManager.d.ts +16 -0
  34. package/build/types/packages/query-core/src/hydration.d.ts +34 -0
  35. package/build/types/packages/query-core/src/index.d.ts +20 -0
  36. package/build/types/packages/query-core/src/infiniteQueryBehavior.d.ts +15 -0
  37. package/build/types/packages/query-core/src/infiniteQueryObserver.d.ts +18 -0
  38. package/build/types/packages/query-core/src/logger.d.ts +8 -0
  39. package/build/types/packages/query-core/src/mutation.d.ts +70 -0
  40. package/build/types/packages/query-core/src/mutationCache.d.ts +52 -0
  41. package/build/types/packages/query-core/src/mutationObserver.d.ts +23 -0
  42. package/build/types/packages/query-core/src/notifyManager.d.ts +18 -0
  43. package/build/types/packages/query-core/src/onlineManager.d.ts +16 -0
  44. package/build/types/packages/query-core/src/queriesObserver.d.ts +23 -0
  45. package/build/types/packages/query-core/src/query.d.ts +119 -0
  46. package/build/types/packages/query-core/src/queryCache.d.ts +59 -0
  47. package/build/types/packages/query-core/src/queryClient.d.ts +65 -0
  48. package/build/types/packages/query-core/src/queryObserver.d.ts +61 -0
  49. package/build/types/packages/query-core/src/removable.d.ts +9 -0
  50. package/build/types/packages/query-core/src/retryer.d.ts +33 -0
  51. package/build/types/packages/query-core/src/subscribable.d.ts +10 -0
  52. package/build/types/packages/query-core/src/types.d.ts +417 -0
  53. package/build/types/packages/query-core/src/utils.d.ts +99 -0
  54. package/build/types/packages/react-query/src/Hydrate.d.ts +10 -0
  55. package/build/types/packages/react-query/src/QueryClientProvider.d.ts +24 -0
  56. package/build/types/packages/react-query/src/QueryErrorResetBoundary.d.ts +12 -0
  57. package/build/types/packages/react-query/src/__tests__/Hydrate.test.d.ts +1 -0
  58. package/build/types/packages/react-query/src/__tests__/QueryClientProvider.test.d.ts +1 -0
  59. package/build/types/packages/react-query/src/__tests__/QueryResetErrorBoundary.test.d.ts +6 -0
  60. package/build/types/packages/react-query/src/__tests__/ssr-hydration.test.d.ts +1 -0
  61. package/build/types/packages/react-query/src/__tests__/ssr.test.d.ts +4 -0
  62. package/build/types/packages/react-query/src/__tests__/suspense.test.d.ts +1 -0
  63. package/build/types/packages/react-query/src/__tests__/useInfiniteQuery.test.d.ts +1 -0
  64. package/build/types/packages/react-query/src/__tests__/useIsFetching.test.d.ts +1 -0
  65. package/build/types/packages/react-query/src/__tests__/useIsMutating.test.d.ts +1 -0
  66. package/build/types/packages/react-query/src/__tests__/useMutation.test.d.ts +1 -0
  67. package/build/types/packages/react-query/src/__tests__/useQueries.test.d.ts +1 -0
  68. package/build/types/packages/react-query/src/__tests__/useQuery.test.d.ts +1 -0
  69. package/build/types/packages/react-query/src/__tests__/useQuery.types.test.d.ts +2 -0
  70. package/build/types/packages/react-query/src/__tests__/utils.d.ts +8 -0
  71. package/build/types/packages/react-query/src/index.d.ts +17 -0
  72. package/build/types/packages/react-query/src/isRestoring.d.ts +3 -0
  73. package/build/types/packages/react-query/src/reactBatchedUpdates.d.ts +2 -0
  74. package/build/types/packages/react-query/src/reactBatchedUpdates.native.d.ts +2 -0
  75. package/build/types/packages/react-query/src/setBatchUpdatesFn.d.ts +1 -0
  76. package/build/types/packages/react-query/src/types.d.ts +35 -0
  77. package/build/types/packages/react-query/src/useBaseQuery.d.ts +3 -0
  78. package/build/types/packages/react-query/src/useInfiniteQuery.d.ts +5 -0
  79. package/build/types/packages/react-query/src/useIsFetching.d.ts +7 -0
  80. package/build/types/packages/react-query/src/useIsMutating.d.ts +7 -0
  81. package/build/types/packages/react-query/src/useMutation.d.ts +6 -0
  82. package/build/types/packages/react-query/src/useQueries.d.ts +49 -0
  83. package/build/types/packages/react-query/src/useQuery.d.ts +20 -0
  84. package/build/types/packages/react-query/src/utils.d.ts +1 -0
  85. package/build/types/tests/utils.d.ts +24 -0
  86. package/build/umd/index.development.js +3429 -0
  87. package/build/umd/index.development.js.map +1 -0
  88. package/build/umd/index.production.js +22 -0
  89. package/build/umd/index.production.js.map +1 -0
  90. package/codemods/v4/key-transformation.js +138 -0
  91. package/codemods/v4/replace-import-specifier.js +25 -0
  92. package/codemods/v4/utils/index.js +166 -0
  93. package/codemods/v4/utils/replacers/key-replacer.js +160 -0
  94. package/codemods/v4/utils/transformers/query-cache-transformer.js +115 -0
  95. package/codemods/v4/utils/transformers/query-client-transformer.js +49 -0
  96. package/codemods/v4/utils/transformers/use-query-like-transformer.js +32 -0
  97. package/codemods/v4/utils/unprocessable-key-error.js +8 -0
  98. package/package.json +63 -0
  99. package/src/Hydrate.tsx +36 -0
  100. package/src/QueryClientProvider.tsx +90 -0
  101. package/src/QueryErrorResetBoundary.tsx +52 -0
  102. package/src/__tests__/Hydrate.test.tsx +247 -0
  103. package/src/__tests__/QueryClientProvider.test.tsx +275 -0
  104. package/src/__tests__/QueryResetErrorBoundary.test.tsx +630 -0
  105. package/src/__tests__/ssr-hydration.test.tsx +274 -0
  106. package/src/__tests__/ssr.test.tsx +151 -0
  107. package/src/__tests__/suspense.test.tsx +1015 -0
  108. package/src/__tests__/useInfiniteQuery.test.tsx +1773 -0
  109. package/src/__tests__/useIsFetching.test.tsx +274 -0
  110. package/src/__tests__/useIsMutating.test.tsx +260 -0
  111. package/src/__tests__/useMutation.test.tsx +1099 -0
  112. package/src/__tests__/useQueries.test.tsx +1107 -0
  113. package/src/__tests__/useQuery.test.tsx +5746 -0
  114. package/src/__tests__/useQuery.types.test.tsx +157 -0
  115. package/src/__tests__/utils.tsx +45 -0
  116. package/src/index.ts +29 -0
  117. package/src/isRestoring.tsx +6 -0
  118. package/src/reactBatchedUpdates.native.ts +4 -0
  119. package/src/reactBatchedUpdates.ts +2 -0
  120. package/src/setBatchUpdatesFn.ts +4 -0
  121. package/src/types.ts +122 -0
  122. package/src/useBaseQuery.ts +140 -0
  123. package/src/useInfiniteQuery.ts +101 -0
  124. package/src/useIsFetching.ts +39 -0
  125. package/src/useIsMutating.ts +43 -0
  126. package/src/useMutation.ts +126 -0
  127. package/src/useQueries.ts +192 -0
  128. package/src/useQuery.ts +104 -0
  129. package/src/utils.ts +11 -0
@@ -0,0 +1,274 @@
1
+ import * as React from 'react'
2
+ import ReactDOM from 'react-dom'
3
+ import ReactDOMTestUtils from 'react-dom/test-utils'
4
+ import ReactDOMServer from 'react-dom/server'
5
+ // eslint-disable-next-line import/no-unresolved -- types only for module augmentation
6
+ import type {} from 'react-dom/next'
7
+
8
+ import {
9
+ useQuery,
10
+ QueryClientProvider,
11
+ QueryCache,
12
+ dehydrate,
13
+ hydrate,
14
+ } from '..'
15
+ import {
16
+ createQueryClient,
17
+ mockLogger,
18
+ setIsServer,
19
+ sleep,
20
+ } from '../../../../tests/utils'
21
+
22
+ const isReact18 = () => (process.env.REACTJS_VERSION || '18') === '18'
23
+
24
+ const ReactHydrate = (element: React.ReactElement, container: Element) => {
25
+ if (isReact18()) {
26
+ let root: any
27
+ ReactDOMTestUtils.act(() => {
28
+ // @ts-expect-error
29
+ root = ReactDOM.hydrateRoot(container, element)
30
+ })
31
+ return () => {
32
+ root.unmount()
33
+ }
34
+ }
35
+
36
+ ReactDOM.hydrate(element, container)
37
+ return () => {
38
+ ReactDOM.unmountComponentAtNode(container)
39
+ }
40
+ }
41
+
42
+ async function fetchData<TData>(value: TData, ms?: number): Promise<TData> {
43
+ await sleep(ms || 1)
44
+ return value
45
+ }
46
+
47
+ function PrintStateComponent({ componentName, result }: any): any {
48
+ return `${componentName} - status:${result.status} fetching:${result.isFetching} data:${result.data}`
49
+ }
50
+
51
+ describe('Server side rendering with de/rehydration', () => {
52
+ let previousIsReactActEnvironment: unknown
53
+ beforeAll(() => {
54
+ // @ts-expect-error we expect IS_REACT_ACT_ENVIRONMENT to exist
55
+ previousIsReactActEnvironment = globalThis.IS_REACT_ACT_ENVIRONMENT = true
56
+ })
57
+
58
+ afterAll(() => {
59
+ // @ts-expect-error we expect IS_REACT_ACT_ENVIRONMENT to exist
60
+ globalThis.IS_REACT_ACT_ENVIRONMENT = previousIsReactActEnvironment
61
+ })
62
+ it('should not mismatch on success', async () => {
63
+ if (!isReact18()) {
64
+ return
65
+ }
66
+ const fetchDataSuccess = jest.fn<
67
+ ReturnType<typeof fetchData>,
68
+ Parameters<typeof fetchData>
69
+ >(fetchData)
70
+
71
+ // -- Shared part --
72
+ function SuccessComponent() {
73
+ const result = useQuery(['success'], () => fetchDataSuccess('success!'))
74
+ return (
75
+ <PrintStateComponent componentName="SuccessComponent" result={result} />
76
+ )
77
+ }
78
+
79
+ // -- Server part --
80
+ setIsServer(true)
81
+
82
+ const prefetchCache = new QueryCache()
83
+ const prefetchClient = createQueryClient({
84
+ queryCache: prefetchCache,
85
+ })
86
+ await prefetchClient.prefetchQuery(['success'], () =>
87
+ fetchDataSuccess('success'),
88
+ )
89
+ const dehydratedStateServer = dehydrate(prefetchClient)
90
+ const renderCache = new QueryCache()
91
+ const renderClient = createQueryClient({
92
+ queryCache: renderCache,
93
+ })
94
+ hydrate(renderClient, dehydratedStateServer)
95
+ const markup = ReactDOMServer.renderToString(
96
+ <QueryClientProvider client={renderClient}>
97
+ <SuccessComponent />
98
+ </QueryClientProvider>,
99
+ )
100
+ const stringifiedState = JSON.stringify(dehydratedStateServer)
101
+ renderClient.clear()
102
+ setIsServer(false)
103
+
104
+ const expectedMarkup =
105
+ 'SuccessComponent - status:success fetching:true data:success'
106
+
107
+ expect(markup).toBe(expectedMarkup)
108
+ expect(fetchDataSuccess).toHaveBeenCalledTimes(1)
109
+
110
+ // -- Client part --
111
+ const el = document.createElement('div')
112
+ el.innerHTML = markup
113
+
114
+ const queryCache = new QueryCache()
115
+ const queryClient = createQueryClient({ queryCache })
116
+ hydrate(queryClient, JSON.parse(stringifiedState))
117
+
118
+ const unmount = ReactHydrate(
119
+ <QueryClientProvider client={queryClient}>
120
+ <SuccessComponent />
121
+ </QueryClientProvider>,
122
+ el,
123
+ )
124
+
125
+ // Check that we have no React hydration mismatches
126
+ expect(mockLogger.error).not.toHaveBeenCalled()
127
+ expect(fetchDataSuccess).toHaveBeenCalledTimes(2)
128
+ expect(el.innerHTML).toBe(expectedMarkup)
129
+
130
+ unmount()
131
+ queryClient.clear()
132
+ })
133
+
134
+ it('should not mismatch on error', async () => {
135
+ if (!isReact18()) {
136
+ return
137
+ }
138
+ const fetchDataError = jest.fn(() => {
139
+ throw new Error('fetchDataError')
140
+ })
141
+
142
+ // -- Shared part --
143
+ function ErrorComponent() {
144
+ const result = useQuery(['error'], () => fetchDataError(), {
145
+ retry: false,
146
+ })
147
+ return (
148
+ <PrintStateComponent componentName="ErrorComponent" result={result} />
149
+ )
150
+ }
151
+
152
+ // -- Server part --
153
+ setIsServer(true)
154
+ const prefetchCache = new QueryCache()
155
+ const prefetchClient = createQueryClient({
156
+ queryCache: prefetchCache,
157
+ })
158
+ await prefetchClient.prefetchQuery(['error'], () => fetchDataError())
159
+ const dehydratedStateServer = dehydrate(prefetchClient)
160
+ const renderCache = new QueryCache()
161
+ const renderClient = createQueryClient({
162
+ queryCache: renderCache,
163
+ })
164
+ hydrate(renderClient, dehydratedStateServer)
165
+ const markup = ReactDOMServer.renderToString(
166
+ <QueryClientProvider client={renderClient}>
167
+ <ErrorComponent />
168
+ </QueryClientProvider>,
169
+ )
170
+ const stringifiedState = JSON.stringify(dehydratedStateServer)
171
+ renderClient.clear()
172
+ setIsServer(false)
173
+
174
+ const expectedMarkup =
175
+ 'ErrorComponent - status:loading fetching:true data:undefined'
176
+
177
+ expect(markup).toBe(expectedMarkup)
178
+
179
+ // -- Client part --
180
+ const el = document.createElement('div')
181
+ el.innerHTML = markup
182
+
183
+ const queryCache = new QueryCache()
184
+ const queryClient = createQueryClient({ queryCache })
185
+ hydrate(queryClient, JSON.parse(stringifiedState))
186
+
187
+ const unmount = ReactHydrate(
188
+ <QueryClientProvider client={queryClient}>
189
+ <ErrorComponent />
190
+ </QueryClientProvider>,
191
+ el,
192
+ )
193
+
194
+ // We expect exactly one console.error here, which is from the
195
+ expect(mockLogger.error).toHaveBeenCalledTimes(1)
196
+ expect(fetchDataError).toHaveBeenCalledTimes(2)
197
+ expect(el.innerHTML).toBe(expectedMarkup)
198
+ await sleep(50)
199
+ expect(fetchDataError).toHaveBeenCalledTimes(2)
200
+ expect(el.innerHTML).toBe(
201
+ 'ErrorComponent - status:error fetching:false data:undefined',
202
+ )
203
+
204
+ unmount()
205
+ queryClient.clear()
206
+ })
207
+
208
+ it('should not mismatch on queries that were not prefetched', async () => {
209
+ if (!isReact18()) {
210
+ return
211
+ }
212
+ const fetchDataSuccess = jest.fn<
213
+ ReturnType<typeof fetchData>,
214
+ Parameters<typeof fetchData>
215
+ >(fetchData)
216
+
217
+ // -- Shared part --
218
+ function SuccessComponent() {
219
+ const result = useQuery(['success'], () => fetchDataSuccess('success!'))
220
+ return (
221
+ <PrintStateComponent componentName="SuccessComponent" result={result} />
222
+ )
223
+ }
224
+
225
+ // -- Server part --
226
+ setIsServer(true)
227
+
228
+ const prefetchClient = createQueryClient()
229
+ const dehydratedStateServer = dehydrate(prefetchClient)
230
+ const renderClient = createQueryClient()
231
+ hydrate(renderClient, dehydratedStateServer)
232
+ const markup = ReactDOMServer.renderToString(
233
+ <QueryClientProvider client={renderClient}>
234
+ <SuccessComponent />
235
+ </QueryClientProvider>,
236
+ )
237
+ const stringifiedState = JSON.stringify(dehydratedStateServer)
238
+ renderClient.clear()
239
+ setIsServer(false)
240
+
241
+ const expectedMarkup =
242
+ 'SuccessComponent - status:loading fetching:true data:undefined'
243
+
244
+ expect(markup).toBe(expectedMarkup)
245
+
246
+ // -- Client part --
247
+ const el = document.createElement('div')
248
+ el.innerHTML = markup
249
+
250
+ const queryCache = new QueryCache()
251
+ const queryClient = createQueryClient({ queryCache })
252
+ hydrate(queryClient, JSON.parse(stringifiedState))
253
+
254
+ const unmount = ReactHydrate(
255
+ <QueryClientProvider client={queryClient}>
256
+ <SuccessComponent />
257
+ </QueryClientProvider>,
258
+ el,
259
+ )
260
+
261
+ // Check that we have no React hydration mismatches
262
+ expect(mockLogger.error).not.toHaveBeenCalled()
263
+ expect(fetchDataSuccess).toHaveBeenCalledTimes(1)
264
+ expect(el.innerHTML).toBe(expectedMarkup)
265
+ await sleep(50)
266
+ expect(fetchDataSuccess).toHaveBeenCalledTimes(1)
267
+ expect(el.innerHTML).toBe(
268
+ 'SuccessComponent - status:success fetching:false data:success!',
269
+ )
270
+
271
+ unmount()
272
+ queryClient.clear()
273
+ })
274
+ })
@@ -0,0 +1,151 @@
1
+ /**
2
+ * @jest-environment node
3
+ */
4
+
5
+ import * as React from 'react'
6
+ // @ts-ignore
7
+ import { renderToString } from 'react-dom/server'
8
+
9
+ import { sleep, queryKey, createQueryClient } from '../../../../tests/utils'
10
+ import { useQuery, QueryClientProvider, QueryCache, useInfiniteQuery } from '..'
11
+
12
+ describe('Server Side Rendering', () => {
13
+ it('should not trigger fetch', () => {
14
+ const queryCache = new QueryCache()
15
+ const queryClient = createQueryClient({ queryCache })
16
+ const key = queryKey()
17
+ const queryFn = jest.fn<string, unknown[]>().mockReturnValue('data')
18
+
19
+ function Page() {
20
+ const query = useQuery(key, queryFn)
21
+
22
+ const content = `status ${query.status}`
23
+
24
+ return (
25
+ <div>
26
+ <div>{content}</div>
27
+ </div>
28
+ )
29
+ }
30
+
31
+ const markup = renderToString(
32
+ <QueryClientProvider client={queryClient}>
33
+ <Page />
34
+ </QueryClientProvider>,
35
+ )
36
+
37
+ expect(markup).toContain('status loading')
38
+ expect(queryFn).toHaveBeenCalledTimes(0)
39
+ queryCache.clear()
40
+ })
41
+
42
+ it('should add prefetched data to cache', async () => {
43
+ const queryCache = new QueryCache()
44
+ const queryClient = createQueryClient({ queryCache })
45
+ const key = queryKey()
46
+ const fetchFn = () => Promise.resolve('data')
47
+ const data = await queryClient.fetchQuery(key, fetchFn)
48
+ expect(data).toBe('data')
49
+ expect(queryCache.find(key)?.state.data).toBe('data')
50
+ queryCache.clear()
51
+ })
52
+
53
+ it('should return existing data from the cache', async () => {
54
+ const queryCache = new QueryCache()
55
+ const queryClient = createQueryClient({ queryCache })
56
+ const key = queryKey()
57
+ const queryFn = jest.fn(() => {
58
+ sleep(10)
59
+ return 'data'
60
+ })
61
+
62
+ function Page() {
63
+ const query = useQuery(key, queryFn)
64
+
65
+ const content = `status ${query.status}`
66
+
67
+ return (
68
+ <div>
69
+ <div>{content}</div>
70
+ </div>
71
+ )
72
+ }
73
+
74
+ await queryClient.prefetchQuery(key, queryFn)
75
+
76
+ const markup = renderToString(
77
+ <QueryClientProvider client={queryClient}>
78
+ <Page />
79
+ </QueryClientProvider>,
80
+ )
81
+
82
+ expect(markup).toContain('status success')
83
+ expect(queryFn).toHaveBeenCalledTimes(1)
84
+ queryCache.clear()
85
+ })
86
+
87
+ it('should add initialData to the cache', () => {
88
+ const key = queryKey()
89
+
90
+ const queryCache = new QueryCache()
91
+ const queryClient = createQueryClient({ queryCache })
92
+
93
+ function Page() {
94
+ const [page, setPage] = React.useState(1)
95
+ const { data } = useQuery([key, page], async () => page, {
96
+ initialData: 1,
97
+ })
98
+
99
+ return (
100
+ <div>
101
+ <h1 data-testid="title">{data}</h1>
102
+ <button onClick={() => setPage(page + 1)}>next</button>
103
+ </div>
104
+ )
105
+ }
106
+
107
+ renderToString(
108
+ <QueryClientProvider client={queryClient}>
109
+ <Page />
110
+ </QueryClientProvider>,
111
+ )
112
+
113
+ const keys = queryCache.getAll().map((query) => query.queryKey)
114
+
115
+ expect(keys).toEqual([[key, 1]])
116
+ queryCache.clear()
117
+ })
118
+
119
+ it('useInfiniteQuery should return the correct state', async () => {
120
+ const queryCache = new QueryCache()
121
+ const queryClient = createQueryClient({ queryCache })
122
+ const key = queryKey()
123
+ const queryFn = jest.fn(async () => {
124
+ await sleep(5)
125
+ return 'page 1'
126
+ })
127
+
128
+ function Page() {
129
+ const query = useInfiniteQuery(key, queryFn)
130
+ return (
131
+ <ul>
132
+ {query.data?.pages.map((page) => (
133
+ <li key={page}>{page}</li>
134
+ ))}
135
+ </ul>
136
+ )
137
+ }
138
+
139
+ await queryClient.prefetchInfiniteQuery(key, queryFn)
140
+
141
+ const markup = renderToString(
142
+ <QueryClientProvider client={queryClient}>
143
+ <Page />
144
+ </QueryClientProvider>,
145
+ )
146
+
147
+ expect(markup).toContain('page 1')
148
+ expect(queryFn).toHaveBeenCalledTimes(1)
149
+ queryCache.clear()
150
+ })
151
+ })