import { waitFakeTimer } from '../../../tests/utils'; import scrollTo from '../scrollTo'; describe('Test ScrollTo function', () => { const dateNowMock = jest.spyOn(Date, 'now'); beforeAll(() => { jest.useFakeTimers(); }); beforeEach(() => { dateNowMock.mockReturnValueOnce(0).mockReturnValueOnce(1000); }); afterEach(() => { jest.clearAllTimers(); dateNowMock.mockClear(); }); afterAll(() => { jest.useRealTimers(); }); it('test scrollTo', async () => { const scrollToSpy = jest.spyOn(window, 'scrollTo').mockImplementation((_, y) => { window.scrollY = y; window.pageYOffset = y; }); scrollTo(1000); await waitFakeTimer(); expect(window.pageYOffset).toBe(1000); scrollToSpy.mockRestore(); }); it('test callback - option', async () => { const cbMock = jest.fn(); scrollTo(1000, { callback: cbMock, }); await waitFakeTimer(); expect(cbMock).toHaveBeenCalledTimes(1); }); it('test getContainer - option', async () => { const div = document.createElement('div'); scrollTo(1000, { getContainer: () => div, }); await waitFakeTimer(); expect(div.scrollTop).toBe(1000); }); it('test getContainer document - option', async () => { scrollTo(1000, { getContainer: () => document, }); await waitFakeTimer(); expect(document.documentElement.scrollTop).toBe(1000); }); it('test duration - option', async () => { scrollTo(1000, { duration: 1100, getContainer: () => document, }); await waitFakeTimer(); expect(document.documentElement.scrollTop).toBe(1000); }); it('test cancel scroll animation', async () => { const scrollToSpy = jest.spyOn(window, 'scrollTo').mockImplementation((_, y) => { window.scrollY = y; window.pageYOffset = y; }); const cancel = scrollTo(1000); jest.advanceTimersByTime(50); cancel(); await waitFakeTimer(); expect(scrollToSpy).toHaveBeenCalled(); scrollToSpy.mockRestore(); }); it('test cancel scroll animation with callback', async () => { const cbMock = jest.fn(); const cancel = scrollTo(1000, { callback: cbMock, }); jest.advanceTimersByTime(100); cancel(); await waitFakeTimer(); expect(cbMock).not.toHaveBeenCalled(); }); it('test multiple scrollTo calls with cancellation', async () => { const scrollToSpy = jest.spyOn(window, 'scrollTo').mockImplementation((_, y) => { window.scrollY = y; window.pageYOffset = y; }); const cancel1 = scrollTo(1000); jest.advanceTimersByTime(50); cancel1(); const cancel2 = scrollTo(2000); await waitFakeTimer(); expect(window.pageYOffset).toBe(2000); cancel2(); scrollToSpy.mockRestore(); }); it('test cancel function returns undefined', () => { const cancel = scrollTo(1000); expect(() => cancel()).not.toThrow(); expect(cancel()).toBeUndefined(); }); });