@@ -11,39 +11,21 @@ afterAll(() => {
11
11
jest . clearAllMocks ( ) ;
12
12
} ) ;
13
13
14
- // Most UI tests should be structure from the user's experience, but just
15
- // because these are more abstract, general-purpose hooks, it seemed harder to
16
- // do that. Had to bring in some mocks
17
- function renderDebouncedValue < T = unknown > ( value : T , time : number ) {
18
- return renderHook (
19
- ( { value, time } : { value : T ; time : number } ) => {
20
- return useDebouncedValue ( value , time ) ;
21
- } ,
22
- {
23
- initialProps : { value, time } ,
24
- } ,
25
- ) ;
26
- }
27
-
28
- function renderDebouncedFunction < Args extends unknown [ ] > (
29
- callbackArg : ( ...args : Args ) => void | Promise < void > ,
30
- time : number ,
31
- ) {
32
- return renderHook (
33
- ( { callback, time } : { callback : typeof callbackArg ; time : number } ) => {
34
- return useDebouncedFunction < Args > ( callback , time ) ;
35
- } ,
36
- {
37
- initialProps : { callback : callbackArg , time } ,
38
- } ,
39
- ) ;
40
- }
41
-
42
14
describe ( `${ useDebouncedValue . name } ` , ( ) => {
15
+ function renderDebouncedValue < T = unknown > ( value : T , time : number ) {
16
+ return renderHook (
17
+ ( { value, time } : { value : T ; time : number } ) => {
18
+ return useDebouncedValue ( value , time ) ;
19
+ } ,
20
+ {
21
+ initialProps : { value, time } ,
22
+ } ,
23
+ ) ;
24
+ }
25
+
43
26
it ( "Should immediately return out the exact same value (by reference) on mount" , ( ) => {
44
27
const value = { } ;
45
28
const { result } = renderDebouncedValue ( value , 2000 ) ;
46
-
47
29
expect ( result . current ) . toBe ( value ) ;
48
30
} ) ;
49
31
@@ -79,6 +61,20 @@ describe(`${useDebouncedValue.name}`, () => {
79
61
} ) ;
80
62
81
63
describe ( `${ useDebouncedFunction . name } ` , ( ) => {
64
+ function renderDebouncedFunction < Args extends unknown [ ] > (
65
+ callbackArg : ( ...args : Args ) => void | Promise < void > ,
66
+ time : number ,
67
+ ) {
68
+ return renderHook (
69
+ ( { callback, time } : { callback : typeof callbackArg ; time : number } ) => {
70
+ return useDebouncedFunction < Args > ( callback , time ) ;
71
+ } ,
72
+ {
73
+ initialProps : { callback : callbackArg , time } ,
74
+ } ,
75
+ ) ;
76
+ }
77
+
82
78
describe ( "hook" , ( ) => {
83
79
it ( "Should provide stable function references across re-renders" , ( ) => {
84
80
const time = 5000 ;
@@ -97,62 +93,44 @@ describe(`${useDebouncedFunction.name}`, () => {
97
93
98
94
it ( "Resets any pending debounces if the timer argument changes" , async ( ) => {
99
95
const time = 5000 ;
100
- let count = 0 ;
101
- const incrementCount = ( ) => {
102
- count ++ ;
103
- } ;
104
-
105
- const { result, rerender } = renderDebouncedFunction (
106
- incrementCount ,
107
- time ,
108
- ) ;
96
+ const mockCallback = jest . fn ( ) ;
97
+ const { result, rerender } = renderDebouncedFunction ( mockCallback , time ) ;
109
98
110
99
result . current . debounced ( ) ;
111
- rerender ( { callback : incrementCount , time : time + 1 } ) ;
100
+ rerender ( { callback : mockCallback , time : time + 1 } ) ;
112
101
113
102
await jest . runAllTimersAsync ( ) ;
114
- expect ( count ) . toEqual ( 0 ) ;
103
+ expect ( mockCallback ) . not . toBeCalled ( ) ;
115
104
} ) ;
116
105
} ) ;
117
106
118
107
describe ( "debounced function" , ( ) => {
119
108
it ( "Resolve the debounce after specified milliseconds pass with no other calls" , async ( ) => {
120
- let value = false ;
121
- const { result } = renderDebouncedFunction ( ( ) => {
122
- value = ! value ;
123
- } , 100 ) ;
124
-
109
+ const mockCallback = jest . fn ( ) ;
110
+ const { result } = renderDebouncedFunction ( mockCallback , 100 ) ;
125
111
result . current . debounced ( ) ;
126
112
127
113
await jest . runOnlyPendingTimersAsync ( ) ;
128
- expect ( value ) . toBe ( true ) ;
114
+ expect ( mockCallback ) . toBeCalledTimes ( 1 ) ;
129
115
} ) ;
130
116
131
117
it ( "Always uses the most recent callback argument passed in (even if it switches while a debounce is queued)" , async ( ) => {
132
- let count = 0 ;
118
+ const mockCallback1 = jest . fn ( ) ;
119
+ const mockCallback2 = jest . fn ( ) ;
133
120
const time = 500 ;
134
121
135
- const { result, rerender } = renderDebouncedFunction ( ( ) => {
136
- count = 1 ;
137
- } , time ) ;
138
-
122
+ const { result, rerender } = renderDebouncedFunction ( mockCallback1 , time ) ;
139
123
result . current . debounced ( ) ;
140
- rerender ( {
141
- callback : ( ) => {
142
- count = 9999 ;
143
- } ,
144
- time,
145
- } ) ;
124
+ rerender ( { callback : mockCallback2 , time } ) ;
146
125
147
126
await jest . runAllTimersAsync ( ) ;
148
- expect ( count ) . toEqual ( 9999 ) ;
127
+ expect ( mockCallback1 ) . not . toBeCalled ( ) ;
128
+ expect ( mockCallback2 ) . toBeCalledTimes ( 1 ) ;
149
129
} ) ;
150
130
151
131
it ( "Should reset the debounce timer with repeated calls to the method" , async ( ) => {
152
- let count = 0 ;
153
- const { result } = renderDebouncedFunction ( ( ) => {
154
- count ++ ;
155
- } , 2000 ) ;
132
+ const mockCallback = jest . fn ( ) ;
133
+ const { result } = renderDebouncedFunction ( mockCallback , 2000 ) ;
156
134
157
135
for ( let i = 0 ; i < 10 ; i ++ ) {
158
136
setTimeout ( ( ) => {
@@ -161,23 +139,20 @@ describe(`${useDebouncedFunction.name}`, () => {
161
139
}
162
140
163
141
await jest . runAllTimersAsync ( ) ;
164
- expect ( count ) . toBe ( 1 ) ;
142
+ expect ( mockCallback ) . toBeCalledTimes ( 1 ) ;
165
143
} ) ;
166
144
} ) ;
167
145
168
146
describe ( "cancelDebounce function" , ( ) => {
169
147
it ( "Should be able to cancel a pending debounce" , async ( ) => {
170
- let count = 0 ;
171
- const { result } = renderDebouncedFunction ( ( ) => {
172
- count ++ ;
173
- } , 2000 ) ;
148
+ const mockCallback = jest . fn ( ) ;
149
+ const { result } = renderDebouncedFunction ( mockCallback , 2000 ) ;
174
150
175
- const { debounced, cancelDebounce } = result . current ;
176
- debounced ( ) ;
177
- cancelDebounce ( ) ;
151
+ result . current . debounced ( ) ;
152
+ result . current . cancelDebounce ( ) ;
178
153
179
154
await jest . runAllTimersAsync ( ) ;
180
- expect ( count ) . toEqual ( 0 ) ;
155
+ expect ( mockCallback ) . not . toBeCalled ( ) ;
181
156
} ) ;
182
157
} ) ;
183
158
} ) ;
0 commit comments