@@ -3,121 +3,101 @@ import { vi } from 'vitest';
3
3
4
4
import { useDebounceCallback } from './useDebounceCallback' ;
5
5
6
- beforeEach ( ( ) => {
7
- vi . useFakeTimers ( ) ;
8
- } ) ;
6
+ beforeEach ( vi . useFakeTimers ) ;
9
7
10
8
afterEach ( ( ) => {
11
9
vi . useRealTimers ( ) ;
12
10
vi . restoreAllMocks ( ) ;
13
11
} ) ;
14
12
15
13
it ( 'Should use debounce callback' , ( ) => {
16
- const { result } = renderHook ( ( ) => useDebounceCallback ( vi . fn ( ) , 300 ) ) ;
14
+ const { result } = renderHook ( ( ) => useDebounceCallback ( vi . fn ( ) , 100 ) ) ;
17
15
expect ( result . current ) . toBeTypeOf ( 'function' ) ;
18
16
} ) ;
19
17
20
18
it ( 'Should execute the callback only after delay' , ( ) => {
21
19
const callback = vi . fn ( ) ;
22
- const delay = 300 ;
23
20
24
- const { result } = renderHook ( ( ) => useDebounceCallback ( callback , delay ) ) ;
25
- const debouncedFn = result . current ;
21
+ const { result } = renderHook ( ( ) => useDebounceCallback ( callback , 100 ) ) ;
22
+ const debouncedCallback = result . current ;
26
23
27
- act ( ( ) => {
28
- debouncedFn ( ) ;
29
- vi . advanceTimersByTime ( delay - 1 ) ;
30
- } ) ;
31
- expect ( callback ) . not . toBeCalled ( ) ;
24
+ debouncedCallback ( ) ;
32
25
33
- act ( ( ) => {
34
- vi . advanceTimersByTime ( 1 ) ;
35
- } ) ;
36
- expect ( callback ) . toBeCalledTimes ( 1 ) ;
26
+ act ( ( ) => vi . advanceTimersByTime ( 99 ) ) ;
27
+
28
+ expect ( callback ) . not . toHaveBeenCalled ( ) ;
29
+
30
+ act ( ( ) => vi . advanceTimersByTime ( 1 ) ) ;
31
+ expect ( callback ) . toHaveBeenCalledOnce ( ) ;
37
32
} ) ;
38
33
39
34
it ( 'Should сancel the previous callback if a new one occurs before the delay' , ( ) => {
40
35
const callback = vi . fn ( ) ;
41
- const delay = 300 ;
42
36
43
- const { result } = renderHook ( ( ) => useDebounceCallback ( callback , delay ) ) ;
44
- const debouncedFn = result . current ;
37
+ const { result } = renderHook ( ( ) => useDebounceCallback ( callback , 100 ) ) ;
38
+ const debouncedCallback = result . current ;
45
39
46
- act ( ( ) => {
47
- debouncedFn ( ) ;
48
- vi . advanceTimersByTime ( delay - 50 ) ;
49
- debouncedFn ( ) ;
50
- vi . advanceTimersByTime ( delay - 50 ) ;
51
- } ) ;
52
- expect ( callback ) . not . toBeCalled ( ) ;
40
+ debouncedCallback ( ) ;
53
41
54
- act ( ( ) => {
55
- vi . advanceTimersByTime ( 50 ) ;
56
- } ) ;
57
- expect ( callback ) . toBeCalledTimes ( 1 ) ;
58
- } ) ;
42
+ act ( ( ) => vi . advanceTimersByTime ( 50 ) ) ;
59
43
60
- it ( 'Should pass single argument into callback' , ( ) => {
61
- const callback = vi . fn ( ) ;
62
- const delay = 100 ;
44
+ expect ( callback ) . not . toHaveBeenCalled ( ) ;
63
45
64
- const { result } = renderHook ( ( ) => useDebounceCallback ( callback , delay ) ) ;
65
- const debouncedFn = result . current ;
46
+ debouncedCallback ( ) ;
66
47
67
- act ( ( ) => {
68
- debouncedFn ( 'argument' ) ;
69
- vi . advanceTimersByTime ( delay ) ;
70
- } ) ;
48
+ act ( ( ) => vi . advanceTimersByTime ( 100 ) ) ;
71
49
72
- expect ( callback ) . toBeCalledWith ( 'argument' ) ;
50
+ expect ( callback ) . toHaveBeenCalledOnce ( ) ;
73
51
} ) ;
74
52
75
- it ( 'Should pass multiple arguments into callback' , ( ) => {
53
+ it ( 'Should pass parameters into callback' , ( ) => {
76
54
const callback = vi . fn ( ) ;
77
- const delay = 100 ;
78
55
79
- const { result } = renderHook ( ( ) => useDebounceCallback ( callback , delay ) ) ;
80
- const debouncedFn = result . current ;
56
+ const { result } = renderHook ( ( ) => useDebounceCallback ( callback , 100 ) ) ;
57
+ const debouncedCallback = result . current ;
81
58
82
- act ( ( ) => {
83
- debouncedFn ( 1 , 2 , 3 ) ;
84
- vi . advanceTimersByTime ( delay ) ;
85
- } ) ;
59
+ debouncedCallback ( 1 , 2 , 3 ) ;
86
60
87
- expect ( callback ) . toBeCalledWith ( 1 , 2 , 3 ) ;
61
+ act ( ( ) => vi . advanceTimersByTime ( 100 ) ) ;
62
+
63
+ expect ( callback ) . toHaveBeenCalledWith ( 1 , 2 , 3 ) ;
88
64
} ) ;
89
65
90
66
it ( 'Should pass argument and cancel callbacks that called before delay' , ( ) => {
91
67
const callback = vi . fn ( ) ;
92
- const delay = 300 ;
93
-
94
- const { result } = renderHook ( ( ) => useDebounceCallback ( callback , delay ) ) ;
95
- const debouncedFn = result . current ;
96
-
97
- act ( ( ) => {
98
- debouncedFn ( 'first' ) ;
99
- vi . advanceTimersByTime ( delay - 100 ) ;
100
- debouncedFn ( 'second' ) ;
101
- vi . advanceTimersByTime ( delay - 100 ) ;
102
- debouncedFn ( 'third' ) ;
103
- vi . advanceTimersByTime ( delay ) ;
104
- } ) ;
105
68
106
- expect ( callback ) . toBeCalledTimes ( 1 ) ;
107
- expect ( callback ) . toBeCalledWith ( 'third' ) ;
69
+ const { result } = renderHook ( ( ) => useDebounceCallback ( callback , 100 ) ) ;
70
+ const debouncedCallback = result . current ;
71
+
72
+ debouncedCallback ( 'first' ) ;
73
+
74
+ act ( ( ) => vi . advanceTimersByTime ( 99 ) ) ;
75
+
76
+ debouncedCallback ( 'second' ) ;
77
+
78
+ act ( ( ) => vi . advanceTimersByTime ( 100 ) ) ;
79
+
80
+ expect ( callback ) . toHaveBeenCalledOnce ( ) ;
81
+ expect ( callback ) . toHaveBeenCalledWith ( 'second' ) ;
108
82
} ) ;
109
83
110
- it ( 'Should keep the same function between renders if delay is unchanged ' , ( ) => {
84
+ it ( 'Should return new function when delay changes ' , ( ) => {
111
85
const callback = vi . fn ( ) ;
112
- const delay = 200 ;
113
86
114
- const { result, rerender } = renderHook ( ( { cb , d } ) => useDebounceCallback ( cb , d ) , {
115
- initialProps : { cb : callback , d : delay }
87
+ const { result, rerender } = renderHook ( ( delay ) => useDebounceCallback ( callback , delay ) , {
88
+ initialProps : 100
116
89
} ) ;
117
- const first = result . current ;
90
+ const debouncedCallback = result . current ;
91
+
92
+ debouncedCallback ( ) ;
93
+
94
+ act ( ( ) => vi . advanceTimersByTime ( 50 ) ) ;
95
+ expect ( callback ) . not . toHaveBeenCalled ( ) ;
96
+
97
+ rerender ( 200 ) ;
118
98
119
- rerender ( { cb : callback , d : delay } ) ;
120
- const second = result . current ;
99
+ debouncedCallback ( ) ;
121
100
122
- expect ( first ) . toBe ( second ) ;
101
+ act ( ( ) => vi . advanceTimersByTime ( 200 ) ) ;
102
+ expect ( callback ) . toHaveBeenCalledOnce ( ) ;
123
103
} ) ;
0 commit comments