Cleanup - unused files / unused exports / duplicate exports
[ProtonMail-WebClient.git] / packages / utils / debounce.test.ts
blob0172020616008f662387447dc447bb1840323e2d
1 import debounce from './debounce';
3 describe('debounce()', () => {
4     beforeAll(() => {
5         jest.useFakeTimers();
6     });
8     afterEach(() => {
9         jest.clearAllTimers();
10     });
12     afterAll(() => {
13         jest.useRealTimers();
14     });
16     it('delays invoking function until after wait time', () => {
17         const functionToDebounce = jest.fn();
18         const wait = 1000;
19         const debouncedFunction = debounce(functionToDebounce, wait);
21         debouncedFunction();
22         expect(functionToDebounce).not.toHaveBeenCalled();
24         // Call function again just before the wait time expires
25         jest.advanceTimersByTime(wait - 1);
26         debouncedFunction();
27         expect(functionToDebounce).not.toHaveBeenCalled();
29         // fast-forward time until 1 millisecond before the function should be invoked
30         jest.advanceTimersByTime(wait - 1);
31         expect(functionToDebounce).not.toHaveBeenCalled();
33         // fast-forward until 1st call should be executed
34         jest.advanceTimersByTime(1);
35         expect(functionToDebounce).toHaveBeenCalledTimes(1);
36     });
38     it('does not invoke function if already invoked', () => {
39         const functionToDebounce = jest.fn();
40         const wait = 1000;
41         const debouncedFunction = debounce(functionToDebounce, wait);
43         debouncedFunction();
45         jest.advanceTimersByTime(wait);
46         expect(functionToDebounce).toHaveBeenCalledTimes(1);
47         functionToDebounce.mockClear();
49         jest.advanceTimersByTime(wait);
50         expect(functionToDebounce).not.toHaveBeenCalled();
51     });
53     describe('options', () => {
54         describe('immediate', () => {
55             it('defaults to false and does not invoke function immediately', () => {
56                 const functionToDebounce = jest.fn();
57                 const wait = 1000;
58                 const debouncedFunction = debounce(functionToDebounce, wait);
60                 debouncedFunction();
61                 expect(functionToDebounce).not.toHaveBeenCalled();
62             });
64             it('invokes function immediately if true', () => {
65                 const functionToDebounce = jest.fn();
66                 const wait = 1000;
67                 const debouncedFunction = debounce(functionToDebounce, wait, { leading: true });
69                 debouncedFunction();
70                 expect(functionToDebounce).toHaveBeenCalled();
71             });
72         });
73     });
75     describe('abort()', () => {
76         it('does not invoke function if abort is called before wait time expires', () => {
77             const functionToDebounce = jest.fn();
78             const wait = 1000;
79             const debouncedFunction = debounce(functionToDebounce, wait);
81             debouncedFunction();
83             // Call function again just before the wait time expires
84             jest.advanceTimersByTime(wait - 1);
85             debouncedFunction.cancel();
87             // fast-forward until 1st call should be executed
88             jest.advanceTimersByTime(1);
89             expect(functionToDebounce).not.toHaveBeenCalled();
90         });
91     });
92 });