2022-05-06 19:54:00 +03:00
|
|
|
import { render, screen } from '@testing-library/react';
|
|
|
|
import { createMemoryHistory } from 'history';
|
2023-02-18 13:11:01 +03:00
|
|
|
import { Router, useParams } from 'react-router-dom';
|
2021-02-28 11:28:46 +03:00
|
|
|
import { Mock } from 'ts-mockery';
|
2022-05-06 19:54:00 +03:00
|
|
|
import { MenuLayout as createMenuLayout } from '../../src/common/MenuLayout';
|
2023-02-18 12:40:37 +03:00
|
|
|
import type { NonReachableServer, NotFoundServer, ReachableServer, SelectedServer } from '../../src/servers/data';
|
|
|
|
import type { SemVer } from '../../src/utils/helpers/version';
|
2021-02-28 11:28:46 +03:00
|
|
|
|
2022-05-06 19:54:00 +03:00
|
|
|
jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), useParams: jest.fn() }));
|
2022-02-08 00:17:57 +03:00
|
|
|
|
2021-02-28 11:28:46 +03:00
|
|
|
describe('<MenuLayout />', () => {
|
2022-05-06 19:54:00 +03:00
|
|
|
const MenuLayout = createMenuLayout(
|
|
|
|
() => <>TagsList</>,
|
|
|
|
() => <>ShortUrlsList</>,
|
|
|
|
() => <>AsideMenu</>,
|
|
|
|
() => <>CreateShortUrl</>,
|
|
|
|
() => <>ShortUrlVisits</>,
|
|
|
|
() => <>TagVisits</>,
|
|
|
|
() => <>DomainVisits</>,
|
|
|
|
() => <>OrphanVisits</>,
|
|
|
|
() => <>NonOrphanVisits</>,
|
|
|
|
() => <>ServerError</>,
|
|
|
|
() => <>Overview</>,
|
|
|
|
() => <>EditShortUrl</>,
|
|
|
|
() => <>ManageDomains</>,
|
|
|
|
);
|
|
|
|
const setUp = (selectedServer: SelectedServer, currentPath = '/') => {
|
|
|
|
const history = createMemoryHistory();
|
|
|
|
history.push(currentPath);
|
2022-02-08 00:17:57 +03:00
|
|
|
|
2022-05-06 19:54:00 +03:00
|
|
|
return render(
|
|
|
|
<Router location={history.location} navigator={history}>
|
|
|
|
<MenuLayout
|
|
|
|
sidebarNotPresent={jest.fn()}
|
|
|
|
sidebarPresent={jest.fn()}
|
|
|
|
selectServer={jest.fn()}
|
|
|
|
selectedServer={selectedServer}
|
|
|
|
/>
|
|
|
|
</Router>,
|
2022-03-11 18:03:15 +03:00
|
|
|
);
|
2021-02-28 11:28:46 +03:00
|
|
|
};
|
|
|
|
|
2022-05-06 19:54:00 +03:00
|
|
|
beforeEach(() => {
|
|
|
|
(useParams as any).mockReturnValue({ serverId: 'abc123' });
|
|
|
|
});
|
|
|
|
|
2022-02-08 00:17:57 +03:00
|
|
|
afterEach(jest.clearAllMocks);
|
2021-02-28 11:28:46 +03:00
|
|
|
|
2022-05-06 19:54:00 +03:00
|
|
|
it('shows loading indicator while loading server', () => {
|
|
|
|
setUp(null);
|
2021-02-28 11:28:46 +03:00
|
|
|
|
2022-05-06 19:54:00 +03:00
|
|
|
expect(screen.getByText('Loading...')).toBeInTheDocument();
|
|
|
|
expect(screen.queryByText('ServerError')).not.toBeInTheDocument();
|
2021-02-28 11:28:46 +03:00
|
|
|
});
|
|
|
|
|
2022-05-06 19:54:00 +03:00
|
|
|
it.each([
|
|
|
|
[Mock.of<NotFoundServer>({ serverNotFound: true })],
|
|
|
|
[Mock.of<NonReachableServer>({ serverNotReachable: true })],
|
|
|
|
])('shows error for non reachable servers', (selectedServer) => {
|
|
|
|
setUp(selectedServer);
|
2021-02-28 11:28:46 +03:00
|
|
|
|
2022-05-06 19:54:00 +03:00
|
|
|
expect(screen.queryByText('Loading...')).not.toBeInTheDocument();
|
|
|
|
expect(screen.getByText('ServerError')).toBeInTheDocument();
|
2021-02-28 11:28:46 +03:00
|
|
|
});
|
|
|
|
|
|
|
|
it.each([
|
2022-05-06 19:54:00 +03:00
|
|
|
['3.0.0' as SemVer, '/overview', 'Overview'],
|
|
|
|
['3.0.0' as SemVer, '/list-short-urls/1', 'ShortUrlsList'],
|
|
|
|
['3.0.0' as SemVer, '/create-short-url', 'CreateShortUrl'],
|
|
|
|
['3.0.0' as SemVer, '/short-code/abc123/visits/foo', 'ShortUrlVisits'],
|
|
|
|
['3.0.0' as SemVer, '/short-code/abc123/edit', 'EditShortUrl'],
|
|
|
|
['3.0.0' as SemVer, '/tag/foo/visits/foo', 'TagVisits'],
|
|
|
|
['3.0.0' as SemVer, '/orphan-visits/foo', 'OrphanVisits'],
|
|
|
|
['3.0.0' as SemVer, '/manage-tags', 'TagsList'],
|
|
|
|
['3.0.0' as SemVer, '/not-found', 'Oops! We could not find requested route.'],
|
|
|
|
['3.0.0' as SemVer, '/domain/domain.com/visits/foo', 'Oops! We could not find requested route.'],
|
|
|
|
['3.1.0' as SemVer, '/domain/domain.com/visits/foo', 'DomainVisits'],
|
|
|
|
['2.10.0' as SemVer, '/non-orphan-visits/foo', 'Oops! We could not find requested route.'],
|
|
|
|
['3.0.0' as SemVer, '/non-orphan-visits/foo', 'NonOrphanVisits'],
|
|
|
|
['2.8.0' as SemVer, '/manage-domains', 'ManageDomains'],
|
|
|
|
])(
|
|
|
|
'renders expected component based on location and server version',
|
|
|
|
(version, currentPath, expectedContent) => {
|
|
|
|
setUp(Mock.of<ReachableServer>({ version }), currentPath);
|
|
|
|
expect(screen.getByText(expectedContent)).toBeInTheDocument();
|
|
|
|
},
|
|
|
|
);
|
2021-02-28 11:28:46 +03:00
|
|
|
});
|