Skip to content

Commit 7a3bf31

Browse files
authored
test(solid-query/useInfiniteQuery): add type tests for page params, 'initialData', 'select', and 'Accessor<QueryClient>' (TanStack#10496)
1 parent 2e144da commit 7a3bf31

1 file changed

Lines changed: 206 additions & 0 deletions

File tree

Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
1+
import { describe, expectTypeOf, it } from 'vitest'
2+
import { queryKey } from '@tanstack/query-test-utils'
3+
import { useInfiniteQuery } from '../useInfiniteQuery'
4+
import { QueryClient } from '../QueryClient'
5+
import type { InfiniteData } from '@tanstack/query-core'
6+
7+
describe('useInfiniteQuery', () => {
8+
describe('pageParam', () => {
9+
it('initialPageParam should define type of param passed to queryFunctionContext', () => {
10+
useInfiniteQuery(() => ({
11+
queryKey: queryKey(),
12+
queryFn: ({ pageParam }) => {
13+
expectTypeOf(pageParam).toEqualTypeOf<number>()
14+
},
15+
initialPageParam: 1,
16+
getNextPageParam: () => undefined,
17+
}))
18+
})
19+
20+
it('direction should be passed to queryFn of useInfiniteQuery', () => {
21+
useInfiniteQuery(() => ({
22+
queryKey: queryKey(),
23+
queryFn: ({ direction }) => {
24+
expectTypeOf(direction).toEqualTypeOf<'forward' | 'backward'>()
25+
},
26+
initialPageParam: 1,
27+
getNextPageParam: () => undefined,
28+
}))
29+
})
30+
31+
it('initialPageParam should define type of param passed to queryFunctionContext for fetchInfiniteQuery', () => {
32+
const queryClient = new QueryClient()
33+
queryClient.fetchInfiniteQuery({
34+
queryKey: queryKey(),
35+
queryFn: ({ pageParam }) => {
36+
expectTypeOf(pageParam).toEqualTypeOf<number>()
37+
},
38+
initialPageParam: 1,
39+
})
40+
})
41+
42+
it('initialPageParam should define type of param passed to queryFunctionContext for prefetchInfiniteQuery', () => {
43+
const queryClient = new QueryClient()
44+
queryClient.prefetchInfiniteQuery({
45+
queryKey: queryKey(),
46+
queryFn: ({ pageParam }) => {
47+
expectTypeOf(pageParam).toEqualTypeOf<number>()
48+
},
49+
initialPageParam: 1,
50+
})
51+
})
52+
})
53+
54+
describe('initialData', () => {
55+
it('TData should always be defined when initialData is provided', () => {
56+
const { data } = useInfiniteQuery(() => ({
57+
queryKey: queryKey(),
58+
queryFn: ({ pageParam }) => {
59+
return pageParam * 5
60+
},
61+
initialPageParam: 1,
62+
getNextPageParam: () => undefined,
63+
initialData: { pages: [5], pageParams: [1] },
64+
}))
65+
66+
expectTypeOf(data).toEqualTypeOf<InfiniteData<number, unknown>>()
67+
})
68+
69+
it('TData should have undefined in the union when initialData is NOT provided', () => {
70+
const { data } = useInfiniteQuery(() => ({
71+
queryKey: queryKey(),
72+
queryFn: ({ pageParam }) => {
73+
return pageParam * 5
74+
},
75+
initialPageParam: 1,
76+
getNextPageParam: () => undefined,
77+
}))
78+
79+
expectTypeOf(data).toEqualTypeOf<
80+
InfiniteData<number, unknown> | undefined
81+
>()
82+
})
83+
})
84+
85+
describe('select', () => {
86+
it('should still return paginated data if no select result', () => {
87+
const infiniteQuery = useInfiniteQuery(() => ({
88+
queryKey: queryKey(),
89+
queryFn: ({ pageParam }) => {
90+
return pageParam * 5
91+
},
92+
initialPageParam: 1,
93+
getNextPageParam: () => undefined,
94+
}))
95+
96+
// TODO: Order of generics prevents pageParams to be typed correctly. Using `unknown` for now
97+
expectTypeOf(infiniteQuery.data).toEqualTypeOf<
98+
InfiniteData<number, unknown> | undefined
99+
>()
100+
})
101+
102+
it('should be able to transform data to arbitrary result', () => {
103+
const infiniteQuery = useInfiniteQuery(() => ({
104+
queryKey: queryKey(),
105+
queryFn: ({ pageParam }) => {
106+
return pageParam * 5
107+
},
108+
initialPageParam: 1,
109+
getNextPageParam: () => undefined,
110+
select: (data) => {
111+
expectTypeOf(data).toEqualTypeOf<InfiniteData<number, number>>()
112+
return 'selected' as const
113+
},
114+
}))
115+
116+
expectTypeOf(infiniteQuery.data).toEqualTypeOf<'selected' | undefined>()
117+
})
118+
})
119+
120+
describe('getNextPageParam / getPreviousPageParam', () => {
121+
it('should get typed params', () => {
122+
const infiniteQuery = useInfiniteQuery(() => ({
123+
queryKey: queryKey(),
124+
queryFn: ({ pageParam }) => {
125+
return String(pageParam)
126+
},
127+
initialPageParam: 1,
128+
getNextPageParam: (
129+
lastPage,
130+
allPages,
131+
lastPageParam,
132+
allPageParams,
133+
) => {
134+
expectTypeOf(lastPage).toEqualTypeOf<string>()
135+
expectTypeOf(allPages).toEqualTypeOf<Array<string>>()
136+
expectTypeOf(lastPageParam).toEqualTypeOf<number>()
137+
expectTypeOf(allPageParams).toEqualTypeOf<Array<number>>()
138+
return undefined
139+
},
140+
getPreviousPageParam: (
141+
firstPage,
142+
allPages,
143+
firstPageParam,
144+
allPageParams,
145+
) => {
146+
expectTypeOf(firstPage).toEqualTypeOf<string>()
147+
expectTypeOf(allPages).toEqualTypeOf<Array<string>>()
148+
expectTypeOf(firstPageParam).toEqualTypeOf<number>()
149+
expectTypeOf(allPageParams).toEqualTypeOf<Array<number>>()
150+
return undefined
151+
},
152+
}))
153+
154+
// TODO: Order of generics prevents pageParams to be typed correctly. Using `unknown` for now
155+
expectTypeOf(infiniteQuery.data).toEqualTypeOf<
156+
InfiniteData<string, unknown> | undefined
157+
>()
158+
})
159+
})
160+
161+
describe('error booleans', () => {
162+
it('should not be permanently `false`', () => {
163+
const {
164+
isFetchNextPageError,
165+
isFetchPreviousPageError,
166+
isLoadingError,
167+
isRefetchError,
168+
} = useInfiniteQuery(() => ({
169+
queryKey: queryKey(),
170+
queryFn: ({ pageParam }) => {
171+
return pageParam * 5
172+
},
173+
initialPageParam: 1,
174+
getNextPageParam: () => undefined,
175+
}))
176+
177+
expectTypeOf(isFetchNextPageError).toEqualTypeOf<boolean>()
178+
expectTypeOf(isFetchPreviousPageError).toEqualTypeOf<boolean>()
179+
expectTypeOf(isLoadingError).toEqualTypeOf<boolean>()
180+
expectTypeOf(isRefetchError).toEqualTypeOf<boolean>()
181+
})
182+
})
183+
184+
describe('queryClient', () => {
185+
it('should accept queryClient as second argument', () => {
186+
const queryClient = new QueryClient()
187+
188+
const infiniteQuery = useInfiniteQuery(
189+
() => ({
190+
queryKey: queryKey(),
191+
queryFn: ({ pageParam }) => {
192+
return pageParam * 5
193+
},
194+
initialPageParam: 1,
195+
getNextPageParam: () => undefined,
196+
}),
197+
() => queryClient,
198+
)
199+
200+
// TODO: Order of generics prevents pageParams to be typed correctly. Using `unknown` for now
201+
expectTypeOf(infiniteQuery.data).toEqualTypeOf<
202+
InfiniteData<number, unknown> | undefined
203+
>()
204+
})
205+
})
206+
})

0 commit comments

Comments
 (0)