@@ -7,6 +7,89 @@ import {
7
7
import { parseAsArrayOf , parseAsJson , parseAsString } from './parsers'
8
8
import { useQueryStates } from './useQueryStates'
9
9
10
+ describe ( 'useQueryStates' , ( ) => {
11
+ it ( 'allows setting a single value' , async ( ) => {
12
+ const onUrlUpdate = vi . fn < OnUrlUpdateFunction > ( )
13
+ const useTestHook = ( ) =>
14
+ useQueryStates ( {
15
+ a : parseAsString ,
16
+ b : parseAsString
17
+ } )
18
+ const { result } = renderHook ( useTestHook , {
19
+ wrapper : withNuqsTestingAdapter ( {
20
+ onUrlUpdate
21
+ } )
22
+ } )
23
+ expect ( result . current [ 0 ] . a ) . toBeNull ( )
24
+ expect ( result . current [ 0 ] . b ) . toBeNull ( )
25
+ await act ( ( ) => result . current [ 1 ] ( { a : 'pass' } ) )
26
+ expect ( result . current [ 0 ] . a ) . toEqual ( 'pass' )
27
+ expect ( result . current [ 0 ] . b ) . toBeNull ( )
28
+ expect ( onUrlUpdate ) . toHaveBeenCalledOnce ( )
29
+ expect ( onUrlUpdate . mock . calls [ 0 ] ! [ 0 ] . queryString ) . toEqual ( '?a=pass' )
30
+ } )
31
+
32
+ it ( 'allows clearing a single key by setting it to null' , async ( ) => {
33
+ const onUrlUpdate = vi . fn < OnUrlUpdateFunction > ( )
34
+ const useTestHook = ( ) =>
35
+ useQueryStates ( {
36
+ a : parseAsString ,
37
+ b : parseAsString
38
+ } )
39
+ const { result } = renderHook ( useTestHook , {
40
+ wrapper : withNuqsTestingAdapter ( {
41
+ searchParams : '?a=init&b=init' ,
42
+ onUrlUpdate
43
+ } )
44
+ } )
45
+ expect ( result . current [ 0 ] . a ) . toEqual ( 'init' )
46
+ expect ( result . current [ 0 ] . b ) . toEqual ( 'init' )
47
+ await act ( ( ) => result . current [ 1 ] ( { a : null } ) )
48
+ expect ( result . current [ 0 ] . a ) . toBeNull ( )
49
+ expect ( result . current [ 0 ] . b ) . toEqual ( 'init' )
50
+ expect ( onUrlUpdate ) . toHaveBeenCalledOnce ( )
51
+ expect ( onUrlUpdate . mock . calls [ 0 ] ! [ 0 ] . queryString ) . toEqual ( '?b=init' )
52
+ } )
53
+ it ( 'allows clearing managed keys by passing null' , async ( ) => {
54
+ const onUrlUpdate = vi . fn < OnUrlUpdateFunction > ( )
55
+ const useTestHook = ( ) =>
56
+ useQueryStates ( {
57
+ a : parseAsString ,
58
+ b : parseAsString
59
+ } )
60
+ const { result } = renderHook ( useTestHook , {
61
+ wrapper : withNuqsTestingAdapter ( {
62
+ searchParams : '?a=init&b=init' ,
63
+ onUrlUpdate
64
+ } )
65
+ } )
66
+ await act ( ( ) => result . current [ 1 ] ( null ) )
67
+ expect ( result . current [ 0 ] . a ) . toBeNull ( )
68
+ expect ( result . current [ 0 ] . b ) . toBeNull ( )
69
+ expect ( onUrlUpdate ) . toHaveBeenCalledOnce ( )
70
+ expect ( onUrlUpdate . mock . calls [ 0 ] ! [ 0 ] . queryString ) . toEqual ( '' )
71
+ } )
72
+ it ( 'allows clearing managed keys by passing a function that returns null' , async ( ) => {
73
+ const onUrlUpdate = vi . fn < OnUrlUpdateFunction > ( )
74
+ const useTestHook = ( ) =>
75
+ useQueryStates ( {
76
+ a : parseAsString ,
77
+ b : parseAsString
78
+ } )
79
+ const { result } = renderHook ( useTestHook , {
80
+ wrapper : withNuqsTestingAdapter ( {
81
+ searchParams : '?a=init&b=init' ,
82
+ onUrlUpdate
83
+ } )
84
+ } )
85
+ await act ( ( ) => result . current [ 1 ] ( ( ) => null ) )
86
+ expect ( result . current [ 0 ] . a ) . toBeNull ( )
87
+ expect ( result . current [ 0 ] . b ) . toBeNull ( )
88
+ expect ( onUrlUpdate ) . toHaveBeenCalledOnce ( )
89
+ expect ( onUrlUpdate . mock . calls [ 0 ] ! [ 0 ] . queryString ) . toEqual ( '' )
90
+ } )
91
+ } )
92
+
10
93
describe ( 'useQueryStates: referential equality' , ( ) => {
11
94
const defaults = {
12
95
str : 'foo' ,
0 commit comments