import { describe, it } from '@jest/globals'; import { render, screen as rtlScreen } from '@testing-library/react'; import { userEvent } from '@testing-library/user-event'; import Link from 'next/link'; import nextRouterMock from 'next-router-mock'; import { MemoryRouterProvider } from 'next-router-mock/MemoryRouterProvider'; import { type OnRouteChangeHandler, useOnRouteChange, type OnRouteChangeStep, } from './use-on-route-change'; type TestComponentProps = { callback: OnRouteChangeHandler; href: string; step?: OnRouteChangeStep; }; const TestComponent = ({ callback, href, step }: TestComponentProps) => { useOnRouteChange(callback, step); return ( New page ); }; describe('useOnRouteChange', () => { it('trigger a callback when the route change event starts', async () => { const cb = jest.fn(); const user = userEvent.setup(); const newPage = '/new-page'; nextRouterMock.push('/initial-page'); render(); expect(cb).not.toHaveBeenCalled(); await user.click(rtlScreen.getByRole('link')); expect(nextRouterMock).toMatchObject({ asPath: newPage, pathname: newPage, }); expect(cb).toHaveBeenCalled(); }); it('can trigger a callback when the route change event is complete', async () => { const cb = jest.fn(); const user = userEvent.setup(); const newPage = '/new-page'; nextRouterMock.push('/initial-page'); render(); expect(cb).not.toHaveBeenCalled(); await user.click(rtlScreen.getByRole('link')); expect(nextRouterMock).toMatchObject({ asPath: newPage, pathname: newPage, }); expect(cb).toHaveBeenCalled(); }); });