import { Mock } from 'ts-mockery'; import { shallow, ShallowWrapper } from 'enzyme'; import { ReportExporter } from '../../../src/common/services/ReportExporter'; import { ExportShortUrlsBtn as createExportShortUrlsBtn } from '../../../src/short-urls/helpers/ExportShortUrlsBtn'; import { NotFoundServer, ReachableServer, SelectedServer } from '../../../src/servers/data'; jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), useNavigate: jest.fn().mockReturnValue(jest.fn()), useParams: jest.fn().mockReturnValue({}), useLocation: jest.fn().mockReturnValue({}), })); describe('', () => { const listShortUrls = jest.fn(); const buildShlinkApiClient = jest.fn().mockReturnValue({ listShortUrls }); const exportShortUrls = jest.fn(); const reportExporter = Mock.of({ exportShortUrls }); const ExportShortUrlsBtn = createExportShortUrlsBtn(buildShlinkApiClient, reportExporter); let wrapper: ShallowWrapper; const createWrapper = (amount?: number, selectedServer?: SelectedServer) => { wrapper = shallow( ()} amount={amount} />, ); return wrapper; }; afterEach(jest.clearAllMocks); afterEach(() => wrapper?.unmount()); it.each([ [ undefined, 0 ], [ 1, 1 ], [ 4578, 4578 ], ])('renders expected amount', (amount, expectedAmount) => { const wrapper = createWrapper(amount); expect(wrapper.prop('amount')).toEqual(expectedAmount); }); it.each([ [ null ], [ Mock.of() ], ])('does nothing on click if selected server is not reachable', (selectedServer) => { const wrapper = createWrapper(0, selectedServer); wrapper.simulate('click'); expect(listShortUrls).not.toHaveBeenCalled(); expect(exportShortUrls).not.toHaveBeenCalled(); }); it.each([ [ 10, 1 ], [ 30, 2 ], [ 39, 2 ], [ 40, 2 ], [ 41, 3 ], [ 385, 20 ], ])('loads proper amount of pages based on the amount of results', async (amount, expectedPageLoads) => { const wrapper = createWrapper(amount, Mock.of({ id: '123' })); listShortUrls.mockResolvedValue({ data: [] }); await (wrapper.prop('onClick') as Function)(); expect(listShortUrls).toHaveBeenCalledTimes(expectedPageLoads); expect(exportShortUrls).toHaveBeenCalledTimes(1); }); });