Skip to content

Commit 15dbd0a

Browse files
committed
main 🧊 rework use debounced callback test
1 parent d039878 commit 15dbd0a

File tree

1 file changed

+53
-73
lines changed

1 file changed

+53
-73
lines changed

packages/core/src/hooks/useDebounceCallback/useDebounceCallback.test.ts

Lines changed: 53 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -3,121 +3,101 @@ import { vi } from 'vitest';
33

44
import { useDebounceCallback } from './useDebounceCallback';
55

6-
beforeEach(() => {
7-
vi.useFakeTimers();
8-
});
6+
beforeEach(vi.useFakeTimers);
97

108
afterEach(() => {
119
vi.useRealTimers();
1210
vi.restoreAllMocks();
1311
});
1412

1513
it('Should use debounce callback', () => {
16-
const { result } = renderHook(() => useDebounceCallback(vi.fn(), 300));
14+
const { result } = renderHook(() => useDebounceCallback(vi.fn(), 100));
1715
expect(result.current).toBeTypeOf('function');
1816
});
1917

2018
it('Should execute the callback only after delay', () => {
2119
const callback = vi.fn();
22-
const delay = 300;
2320

24-
const { result } = renderHook(() => useDebounceCallback(callback, delay));
25-
const debouncedFn = result.current;
21+
const { result } = renderHook(() => useDebounceCallback(callback, 100));
22+
const debouncedCallback = result.current;
2623

27-
act(() => {
28-
debouncedFn();
29-
vi.advanceTimersByTime(delay - 1);
30-
});
31-
expect(callback).not.toBeCalled();
24+
debouncedCallback();
3225

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();
3732
});
3833

3934
it('Should сancel the previous callback if a new one occurs before the delay', () => {
4035
const callback = vi.fn();
41-
const delay = 300;
4236

43-
const { result } = renderHook(() => useDebounceCallback(callback, delay));
44-
const debouncedFn = result.current;
37+
const { result } = renderHook(() => useDebounceCallback(callback, 100));
38+
const debouncedCallback = result.current;
4539

46-
act(() => {
47-
debouncedFn();
48-
vi.advanceTimersByTime(delay - 50);
49-
debouncedFn();
50-
vi.advanceTimersByTime(delay - 50);
51-
});
52-
expect(callback).not.toBeCalled();
40+
debouncedCallback();
5341

54-
act(() => {
55-
vi.advanceTimersByTime(50);
56-
});
57-
expect(callback).toBeCalledTimes(1);
58-
});
42+
act(() => vi.advanceTimersByTime(50));
5943

60-
it('Should pass single argument into callback', () => {
61-
const callback = vi.fn();
62-
const delay = 100;
44+
expect(callback).not.toHaveBeenCalled();
6345

64-
const { result } = renderHook(() => useDebounceCallback(callback, delay));
65-
const debouncedFn = result.current;
46+
debouncedCallback();
6647

67-
act(() => {
68-
debouncedFn('argument');
69-
vi.advanceTimersByTime(delay);
70-
});
48+
act(() => vi.advanceTimersByTime(100));
7149

72-
expect(callback).toBeCalledWith('argument');
50+
expect(callback).toHaveBeenCalledOnce();
7351
});
7452

75-
it('Should pass multiple arguments into callback', () => {
53+
it('Should pass parameters into callback', () => {
7654
const callback = vi.fn();
77-
const delay = 100;
7855

79-
const { result } = renderHook(() => useDebounceCallback(callback, delay));
80-
const debouncedFn = result.current;
56+
const { result } = renderHook(() => useDebounceCallback(callback, 100));
57+
const debouncedCallback = result.current;
8158

82-
act(() => {
83-
debouncedFn(1, 2, 3);
84-
vi.advanceTimersByTime(delay);
85-
});
59+
debouncedCallback(1, 2, 3);
8660

87-
expect(callback).toBeCalledWith(1, 2, 3);
61+
act(() => vi.advanceTimersByTime(100));
62+
63+
expect(callback).toHaveBeenCalledWith(1, 2, 3);
8864
});
8965

9066
it('Should pass argument and cancel callbacks that called before delay', () => {
9167
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-
});
10568

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');
10882
});
10983

110-
it('Should keep the same function between renders if delay is unchanged', () => {
84+
it('Should return new function when delay changes', () => {
11185
const callback = vi.fn();
112-
const delay = 200;
11386

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
11689
});
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);
11898

119-
rerender({ cb: callback, d: delay });
120-
const second = result.current;
99+
debouncedCallback();
121100

122-
expect(first).toBe(second);
101+
act(() => vi.advanceTimersByTime(200));
102+
expect(callback).toHaveBeenCalledOnce();
123103
});

0 commit comments

Comments
 (0)