Skip to content

Commit c5f62b1

Browse files
committed
test: Add dynamic keys test
1 parent c0467ed commit c5f62b1

File tree

1 file changed

+67
-1
lines changed

1 file changed

+67
-1
lines changed

packages/nuqs/src/useQueryStates.test.ts

+67-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,12 @@ import {
44
withNuqsTestingAdapter,
55
type OnUrlUpdateFunction
66
} from './adapters/testing'
7-
import { parseAsArrayOf, parseAsJson, parseAsString } from './parsers'
7+
import {
8+
parseAsArrayOf,
9+
parseAsInteger,
10+
parseAsJson,
11+
parseAsString
12+
} from './parsers'
813
import { useQueryStates } from './useQueryStates'
914

1015
describe('useQueryStates: referential equality', () => {
@@ -233,3 +238,64 @@ describe('useQueryStates: clearOnDefault', () => {
233238
expect(onUrlUpdate.mock.calls[0]![0].queryString).toEqual('')
234239
})
235240
})
241+
242+
describe('useQueryStates: dynamic keys', () => {
243+
it('supports dynamic keys', () => {
244+
const useTestHook = (keys: string[] = ['a', 'b']) =>
245+
useQueryStates({
246+
[keys[0]!]: parseAsInteger,
247+
[keys[1]!]: parseAsInteger
248+
})
249+
const { result, rerender } = renderHook(useTestHook, {
250+
wrapper: withNuqsTestingAdapter({
251+
searchParams: '?a=1&b=2&c=3&d=4'
252+
})
253+
})
254+
expect(result.current[0].a).toEqual(1)
255+
expect(result.current[0].b).toEqual(2)
256+
expect(result.current[0].c).toBeUndefined()
257+
expect(result.current[0].d).toBeUndefined()
258+
rerender(['c', 'd'])
259+
expect(result.current[0].a).toBeUndefined()
260+
expect(result.current[0].b).toBeUndefined()
261+
expect(result.current[0].c).toEqual(3)
262+
expect(result.current[0].d).toEqual(4)
263+
})
264+
265+
it('supports dynamic keys with remapping', () => {
266+
const useTestHook = (keys: string[] = ['a', 'b']) =>
267+
useQueryStates(
268+
{
269+
[keys[0]!]: parseAsInteger,
270+
[keys[1]!]: parseAsInteger
271+
},
272+
{
273+
urlKeys: {
274+
a: 'x',
275+
b: 'y',
276+
c: 'z'
277+
}
278+
}
279+
)
280+
const { result, rerender } = renderHook(useTestHook, {
281+
wrapper: withNuqsTestingAdapter({
282+
searchParams: '?x=1&y=2&z=3'
283+
})
284+
})
285+
expect(result.current[0].a).toEqual(1)
286+
expect(result.current[0].b).toEqual(2)
287+
expect(result.current[0].c).toBeUndefined()
288+
expect(result.current[0].d).toBeUndefined()
289+
expect(result.current[0].x).toBeUndefined()
290+
expect(result.current[0].y).toBeUndefined()
291+
expect(result.current[0].z).toBeUndefined()
292+
rerender(['c', 'd'])
293+
expect(result.current[0].a).toBeUndefined()
294+
expect(result.current[0].b).toBeUndefined()
295+
expect(result.current[0].c).toEqual(3)
296+
expect(result.current[0].d).toBeNull()
297+
expect(result.current[0].x).toBeUndefined()
298+
expect(result.current[0].y).toBeUndefined()
299+
expect(result.current[0].z).toBeUndefined()
300+
})
301+
})

0 commit comments

Comments
 (0)