PageContainer.spec.tsx 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import React from 'react';
  2. import { screen, within } from '@testing-library/react';
  3. import userEvent from '@testing-library/user-event';
  4. import { render } from 'lib/testHelpers';
  5. import PageContainer from 'components/PageContainer/PageContainer';
  6. import { useClusters } from 'lib/hooks/api/clusters';
  7. import { Cluster, ServerStatus } from 'generated-sources';
  8. const burgerButtonOptions = { name: 'burger' };
  9. jest.mock('components/Version/Version', () => () => <div>Version</div>);
  10. interface DataType {
  11. data: Cluster[] | undefined;
  12. }
  13. jest.mock('lib/hooks/api/clusters');
  14. const mockedNavigate = jest.fn();
  15. jest.mock('react-router-dom', () => ({
  16. ...jest.requireActual('react-router-dom'),
  17. useNavigate: () => mockedNavigate,
  18. }));
  19. describe('Page Container', () => {
  20. const renderComponent = (hasDynamicConfig: boolean, data: DataType) => {
  21. const useClustersMock = useClusters as jest.Mock;
  22. useClustersMock.mockReturnValue(data);
  23. Object.defineProperty(window, 'matchMedia', {
  24. writable: true,
  25. value: jest.fn().mockImplementation(() => ({
  26. matches: false,
  27. addListener: jest.fn(),
  28. })),
  29. });
  30. render(
  31. <PageContainer setDarkMode={jest.fn()}>
  32. <div>child</div>
  33. </PageContainer>,
  34. {
  35. globalSettings: { hasDynamicConfig },
  36. }
  37. );
  38. };
  39. it('handle burger click correctly', async () => {
  40. renderComponent(false, { data: undefined });
  41. const burger = within(screen.getByLabelText('Page Header')).getByRole(
  42. 'button',
  43. burgerButtonOptions
  44. );
  45. const overlay = screen.getByLabelText('Overlay');
  46. expect(screen.getByLabelText('Sidebar')).toBeInTheDocument();
  47. expect(overlay).toBeInTheDocument();
  48. expect(overlay).toHaveStyleRule('visibility: hidden');
  49. expect(burger).toHaveStyleRule('display: none');
  50. await userEvent.click(burger);
  51. expect(overlay).toHaveStyleRule('visibility: visible');
  52. });
  53. it('render the inner container', async () => {
  54. renderComponent(false, { data: undefined });
  55. expect(screen.getByText('child')).toBeInTheDocument();
  56. });
  57. describe('Redirect to the Wizard page', () => {
  58. it('redirects to new cluster configuration page if there are no clusters and dynamic config is enabled', async () => {
  59. await renderComponent(true, { data: [] });
  60. expect(mockedNavigate).toHaveBeenCalled();
  61. });
  62. it('should not navigate to new cluster config page when there are clusters', async () => {
  63. await renderComponent(true, {
  64. data: [{ name: 'Cluster 1', status: ServerStatus.ONLINE }],
  65. });
  66. expect(mockedNavigate).not.toHaveBeenCalled();
  67. });
  68. it('should not navigate to new cluster config page when there are no clusters and hasDynamicConfig is false', async () => {
  69. await renderComponent(false, {
  70. data: [],
  71. });
  72. expect(mockedNavigate).not.toHaveBeenCalled();
  73. });
  74. });
  75. });