@@ -3,110 +3,44 @@ import { vi } from 'vitest';
33
44import { useDebounceValue } from './useDebounceValue' ;
55
6- beforeEach ( ( ) => vi . useFakeTimers ( ) ) ;
6+ beforeEach ( vi . useFakeTimers ) ;
77
88afterEach ( ( ) => {
99 vi . useRealTimers ( ) ;
1010 vi . restoreAllMocks ( ) ;
1111} ) ;
1212
13- it ( 'Should return initial value immediately' , ( ) => {
14- const { result } = renderHook ( ( ) => useDebounceValue ( 'initial value' , 100 ) ) ;
15-
16- expect ( result . current ) . toBe ( 'initial value' ) ;
13+ it ( 'Should use debounce value' , ( ) => {
14+ const { result } = renderHook ( ( ) => useDebounceValue ( 'value' , 100 ) ) ;
15+ expect ( result . current ) . toBe ( 'value' ) ;
1716} ) ;
1817
19- it ( 'Should update value only after delay' , ( ) => {
18+ it ( 'Should update value after delay' , ( ) => {
2019 const { result, rerender } = renderHook ( ( { value, delay } ) => useDebounceValue ( value , delay ) , {
21- initialProps : { value : 1 , delay : 100 }
20+ initialProps : { value : 'value' , delay : 100 }
2221 } ) ;
2322
24- rerender ( { value : 2 , delay : 100 } ) ;
23+ rerender ( { value : 'new value' , delay : 100 } ) ;
2524
2625 act ( ( ) => vi . advanceTimersByTime ( 99 ) ) ;
27- expect ( result . current ) . toBe ( 1 ) ;
26+ expect ( result . current ) . toBe ( 'value' ) ;
2827
2928 act ( ( ) => vi . advanceTimersByTime ( 1 ) ) ;
30- expect ( result . current ) . toBe ( 2 ) ;
31- } ) ;
32-
33- it ( 'Should debounce rapid consecutive updates and use only the last value' , ( ) => {
34- const { result, rerender } = renderHook ( ( { value, delay } ) => useDebounceValue ( value , delay ) , {
35- initialProps : { value : 1 , delay : 100 }
36- } ) ;
37- expect ( result . current ) . toBe ( 1 ) ;
38-
39- rerender ( { value : 2 , delay : 100 } ) ;
40-
41- act ( ( ) => vi . advanceTimersByTime ( 50 ) ) ;
42- expect ( result . current ) . toBe ( 1 ) ;
43-
44- rerender ( { value : 3 , delay : 100 } ) ;
45-
46- act ( ( ) => vi . advanceTimersByTime ( 100 ) ) ;
47- expect ( result . current ) . toBe ( 3 ) ;
48- } ) ;
49-
50- it ( 'Should not trigger state update if the value remains the same' , ( ) => {
51- const { result, rerender } = renderHook ( ( { value, delay } ) => useDebounceValue ( value , delay ) , {
52- initialProps : { value : 'same' , delay : 100 }
53- } ) ;
54- expect ( result . current ) . toBe ( 'same' ) ;
55-
56- rerender ( { value : 'same' , delay : 100 } ) ;
57-
58- act ( ( ) => vi . advanceTimersByTime ( 100 ) ) ;
59- expect ( result . current ) . toBe ( 'same' ) ;
60- } ) ;
61-
62- it ( 'Should apply multiple updates separately when spaced by delay' , ( ) => {
63- const { result, rerender } = renderHook ( ( { value, delay } ) => useDebounceValue ( value , delay ) , {
64- initialProps : { value : 1 , delay : 100 }
65- } ) ;
66- expect ( result . current ) . toBe ( 1 ) ;
67-
68- rerender ( { value : 2 , delay : 100 } ) ;
69-
70- act ( ( ) => vi . advanceTimersByTime ( 100 ) ) ;
71- expect ( result . current ) . toBe ( 2 ) ;
72-
73- rerender ( { value : 3 , delay : 100 } ) ;
74-
75- act ( ( ) => vi . advanceTimersByTime ( 100 ) ) ;
76- expect ( result . current ) . toBe ( 3 ) ;
29+ expect ( result . current ) . toBe ( 'new value' ) ;
7730} ) ;
7831
79- it ( 'Should use new delay when delay changes' , ( ) => {
32+ it ( 'Should apply new delay when delay changes' , ( ) => {
8033 const { result, rerender } = renderHook ( ( { value, d } ) => useDebounceValue ( value , d ) , {
81- initialProps : { value : 'initial ' , d : 100 }
34+ initialProps : { value : 'value ' , d : 100 }
8235 } ) ;
83- expect ( result . current ) . toBe ( 'initial' ) ;
8436
85- rerender ( { value : 'first ' , d : 100 } ) ;
37+ rerender ( { value : 'new value ' , d : 200 } ) ;
8638
87- act ( ( ) => vi . advanceTimersByTime ( 100 ) ) ;
88- expect ( result . current ) . toBe ( 'first' ) ;
89-
90- rerender ( { value : 'second' , d : 200 } ) ;
39+ expect ( result . current ) . toBe ( 'value' ) ;
9140
9241 act ( ( ) => vi . advanceTimersByTime ( 199 ) ) ;
93- expect ( result . current ) . toBe ( 'first ' ) ;
42+ expect ( result . current ) . toBe ( 'value ' ) ;
9443
9544 act ( ( ) => vi . advanceTimersByTime ( 1 ) ) ;
96- expect ( result . current ) . toBe ( 'second' ) ;
97- } ) ;
98-
99- it ( 'Should not update value after unmount' , ( ) => {
100- const { result, rerender, unmount } = renderHook (
101- ( { value, delay } ) => useDebounceValue ( value , delay ) ,
102- {
103- initialProps : { value : 'start' , delay : 100 }
104- }
105- ) ;
106-
107- rerender ( { value : 'end' , delay : 100 } ) ;
108- unmount ( ) ;
109-
110- act ( ( ) => vi . advanceTimersByTime ( 100 ) ) ;
111- expect ( result . current ) . toBe ( 'start' ) ;
45+ expect ( result . current ) . toBe ( 'new value' ) ;
11246} ) ;
0 commit comments