import { screen } from '@testing-library/react'; import { fromPartial } from '@total-typescript/shoehorn'; import { MemoryRouter, useNavigate } from 'react-router-dom'; import type { MercureBoundProps } from '../../src/mercure/helpers/boundToMercureHub'; import type { Settings } from '../../src/settings/reducers/settings'; import type { ShortUrlsOrder } from '../../src/short-urls/data'; import type { ShortUrlsList as ShortUrlsListModel } from '../../src/short-urls/reducers/shortUrlsList'; import { ShortUrlsList as createShortUrlsList } from '../../src/short-urls/ShortUrlsList'; import type { ShortUrlsTableType } from '../../src/short-urls/ShortUrlsTable'; import type { SemVer } from '../../src/utils/helpers/version'; import { renderWithEvents } from '../__helpers__/setUpTest'; vi.mock('react-router-dom', async () => ({ ...(await vi.importActual('react-router-dom')), useNavigate: vi.fn().mockReturnValue(vi.fn()), useLocation: vi.fn().mockReturnValue({ search: '?tags=test%20tag&search=example.com' }), })); describe('', () => { const ShortUrlsTable: ShortUrlsTableType = ({ onTagClick }) => onTagClick?.('foo')}>ShortUrlsTable; const ShortUrlsFilteringBar = () => ShortUrlsFilteringBar; const listShortUrlsMock = vi.fn(); const navigate = vi.fn(); const shortUrlsList = fromPartial({ shortUrls: { data: [ { shortCode: 'testShortCode', shortUrl: 'https://www.example.com/testShortUrl', longUrl: 'https://www.example.com/testLongUrl', tags: ['test tag'], }, ], pagination: { pagesCount: 3 }, }, }); const ShortUrlsList = createShortUrlsList(ShortUrlsTable, ShortUrlsFilteringBar); const setUp = (settings: Partial = {}, version: SemVer = '3.0.0') => renderWithEvents( ({ mercureInfo: { loading: true } })} listShortUrls={listShortUrlsMock} shortUrlsList={shortUrlsList} selectedServer={fromPartial({ id: '1', version })} settings={fromPartial(settings)} /> , ); beforeEach(() => { (useNavigate as any).mockReturnValue(navigate); }); it('wraps expected components', () => { setUp(); expect(screen.getByText('ShortUrlsTable')).toBeInTheDocument(); expect(screen.getByText('ShortUrlsFilteringBar')).toBeInTheDocument(); }); it('passes current query to paginator', () => { setUp(); const links = screen.getAllByRole('link'); expect(links.length > 0).toEqual(true); links.forEach( (link) => expect(link).toHaveAttribute('href', expect.stringContaining('?tags=test%20tag&search=example.com')), ); }); it('gets list refreshed every time a tag is clicked', async () => { const { user } = setUp(); expect(navigate).not.toHaveBeenCalled(); await user.click(screen.getByText('ShortUrlsTable')); expect(navigate).toHaveBeenCalledWith(expect.stringContaining(`tags=${encodeURIComponent('test tag,foo')}`)); }); it.each([ [fromPartial({ field: 'visits', dir: 'ASC' }), 'visits', 'ASC'], [fromPartial({ field: 'title', dir: 'DESC' }), 'title', 'DESC'], [fromPartial({}), undefined, undefined], ])('has expected initial ordering based on settings', (defaultOrdering, field, dir) => { setUp({ shortUrlsList: { defaultOrdering } }); expect(listShortUrlsMock).toHaveBeenCalledWith(expect.objectContaining({ orderBy: { field, dir }, })); }); it.each([ [fromPartial({ shortUrlsList: { defaultOrdering: { field: 'visits', dir: 'ASC' }, }, }), '3.3.0' as SemVer, { field: 'visits', dir: 'ASC' }], [fromPartial({ shortUrlsList: { defaultOrdering: { field: 'visits', dir: 'ASC' }, }, visits: { excludeBots: true }, }), '3.3.0' as SemVer, { field: 'visits', dir: 'ASC' }], [fromPartial({ shortUrlsList: { defaultOrdering: { field: 'visits', dir: 'ASC' }, }, }), '3.4.0' as SemVer, { field: 'visits', dir: 'ASC' }], [fromPartial({ shortUrlsList: { defaultOrdering: { field: 'visits', dir: 'ASC' }, }, visits: { excludeBots: true }, }), '3.4.0' as SemVer, { field: 'nonBotVisits', dir: 'ASC' }], ])('parses order by based on server version and config', (settings, serverVersion, expectedOrderBy) => { setUp(settings, serverVersion); expect(listShortUrlsMock).toHaveBeenCalledWith(expect.objectContaining({ orderBy: expectedOrderBy })); }); });