import React from 'react';
import { cleanup, fireEvent } from '@testing-library/react';
import { BrowserRouter } from 'react-router-dom';
import { ThemeProvider } from '../@styles/theme-provider';
import { render } from '../../utils/theme-render-wrapper';
import { ASSETS_URL } from '../../consts/common';
import { CustomIcon } from '../custom-icon';
import type { MainNavItem } from '../@navigation/breadcrumbs';
import { trimSpaces } from '../../utils';
import sidebarItemsMap, { sidebarItemsWithDecoratorsMap } from './__mocks__/mockSidebar';
import { Sidebar } from './sidebar';
afterEach(cleanup);
const setOpen = jest.fn();
const Provider: React.FC = ({ children }) => (
{children}
);
describe('', () => {
it(`should render sub item after main item click`, () => {
const { queryByText } = render(
);
const elm = queryByText(sidebarItemsMap.marketing.name);
elm?.click();
const subElm = queryByText(sidebarItemsMap.marketing.items?.[1]?.name || '');
expect(subElm).toBeTruthy();
});
it('should render inner item after items clicks with keyboard', () => {
const { queryByText, queryByTestId } = render(
);
const elm = queryByTestId(`menu-${trimSpaces(sidebarItemsMap.cs.name)}`);
if (elm) {
fireEvent.keyDown(elm, { code: 'Enter' });
}
const subElm = queryByTestId(
`subMenu-${trimSpaces(sidebarItemsMap.cs.items?.[3]?.name || '')}`
);
if (subElm) {
fireEvent.keyDown(subElm, { code: 'Enter' });
}
const innerElm = queryByText(sidebarItemsMap.cs.items?.[3]?.subItems?.[0].name || '');
expect(innerElm).toBeTruthy();
});
it(`should render with closed logo and divider`, () => {
const closedLogo = 'closedLogo';
const { queryByText, queryByTestId } = render(
closedLogo}
open="closed"
setOpen={setOpen}
sidebarItemsMap={sidebarItemsMap}
drawerWidthClose=""
drawerWidthOpen=""
/>
);
const elm = queryByText(closedLogo);
expect(elm?.innerHTML).toBe(closedLogo);
const buttonEl = queryByTestId('button-drawerLeft');
expect(buttonEl).toBeTruthy();
});
it(`should render and handle mouse enter and leave events`, () => {
const drawerWidthClose = 100;
const drawerWidthOpen = 200;
const { getByTestId } = render(
);
const elm = getByTestId('drawer');
fireEvent.mouseEnter(elm);
expect(setOpen).toHaveBeenCalled();
fireEvent.mouseLeave(elm);
expect(setOpen).toHaveBeenCalledTimes(2);
});
it(`should render without divider and drawer button`, () => {
const { queryByTestId } = render(
);
const buttonEl = queryByTestId('button-drawerLeft');
expect(buttonEl).toBeFalsy();
});
it('should render item with badge', () => {
const { queryByTestId } = render(
);
const badge = queryByTestId(`badge-${trimSpaces(sidebarItemsMap.dashboard.name)}`);
expect(badge?.innerHTML).toBe(trimSpaces(sidebarItemsMap.dashboard.badgeText));
});
it('should render decorator items', () => {
const { queryByTestId } = render(
);
const separator = queryByTestId(
`separator-${trimSpaces(sidebarItemsWithDecoratorsMap.chartsSeparator.name)}`
);
const title = queryByTestId(`title-${trimSpaces(sidebarItemsWithDecoratorsMap.arrTitle.name)}`);
expect(separator).toBeTruthy();
expect(title).toBeTruthy();
});
it('should render badges 3 levels down', () => {
const badgeItem1 = 'badgeItem1';
const badgeItem2 = 'badgeItem2';
const badgeItem3 = 'badgeItem3';
const items: Record = {
badge: {
name: badgeItem1,
badgeText: badgeItem1,
Icon: () => ,
items: [
{
path: `/badge/${badgeItem2}`,
name: badgeItem2,
badgeText: badgeItem2,
subItems: [
{
path: `/badge/${badgeItem2}/${badgeItem3}`,
name: badgeItem3,
badgeText: badgeItem3
}
]
}
]
}
};
const { queryByTestId } = render(
);
const firstItem = queryByTestId(`badge-${badgeItem1}`);
firstItem?.click();
const secondItem = queryByTestId(`badge-${badgeItem2}`);
secondItem?.click();
const thirdItem = queryByTestId(`badge-${badgeItem3}`);
expect(firstItem?.innerHTML).toBe(badgeItem1);
expect(secondItem?.innerHTML).toBe(badgeItem2);
expect(thirdItem?.innerHTML).toBe(badgeItem3);
});
describe('Test behavior on diffrent state', () => {
it(`setOpen sould be called with open = open`, () => {
const { queryByTestId } = render(
);
const elm = queryByTestId('button-drawerLeft');
elm?.click();
expect(setOpen).toBeCalledWith('closed');
});
it(`setOpen sould be called with open = closed`, () => {
const { queryByTestId } = render(
);
const elm = queryByTestId('button-drawerLeft');
elm?.click();
expect(setOpen).toBeCalledWith('open');
});
it(`setOpen sould be called with open = locked`, () => {
const { queryByTestId } = render(
);
const elm = queryByTestId('button-drawerLeft');
elm?.click();
expect(setOpen).toBeCalledWith('closed');
});
});
});