Skip to content

Commit 53f0c71

Browse files
authored
Merge pull request #138 from niloofar-deriv/sidemenu-tests
Niloofar/ Added test cases for BackButton and MenuContent components
2 parents 2e3bcff + 6ae25b2 commit 53f0c71

File tree

3 files changed

+143
-0
lines changed

3 files changed

+143
-0
lines changed

src/components/AppHeader/MobileMenu/MenuContent.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export const MenuContent = () => {
2222
className={clsx('pl-[4.8rem] pr-[1.6rem]', {
2323
'border-b border-[#f2f3f4]': !removeBorderBottom,
2424
})}
25+
data-testid='dt_menu_item'
2526
key={index}
2627
>
2728
{item.map(({ LeftComponent, RightComponent, as, href, label, onClick, target }) => {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { useDevice } from '@deriv-com/ui';
2+
import { render, screen } from '@testing-library/react';
3+
import userEvent from '@testing-library/user-event';
4+
import { BackButton } from '../BackButton';
5+
6+
const mockOnClick = jest.fn();
7+
8+
jest.mock('@deriv-com/ui', () => ({
9+
...jest.requireActual('@deriv-com/ui'),
10+
useDevice: jest.fn(() => ({ isMobile: true })),
11+
}));
12+
13+
describe('BackButton Component', () => {
14+
it('renders the button with the correct text', () => {
15+
render(<BackButton buttonText='Go Back' onClick={mockOnClick} />);
16+
expect(screen.getByRole('button')).toBeInTheDocument();
17+
});
18+
19+
it('calls the onClick handler when clicked', async () => {
20+
render(<BackButton buttonText='Go Back' onClick={mockOnClick} />);
21+
await userEvent.click(screen.getByRole('button'));
22+
expect(mockOnClick).toHaveBeenCalledTimes(1);
23+
});
24+
25+
it('adjusts the text size for mobile devices', () => {
26+
render(<BackButton buttonText='Go Back' onClick={mockOnClick} />);
27+
const textComponent = screen.getByText('Go Back');
28+
expect(textComponent).toHaveClass('derivs-text__size--lg');
29+
});
30+
31+
it('uses a smaller text size for non-mobile devices', () => {
32+
(useDevice as jest.Mock).mockReturnValue({ isMobile: false });
33+
render(<BackButton buttonText='Go Back' onClick={mockOnClick} />);
34+
const textComponent = screen.getByText('Go Back');
35+
expect(textComponent).toHaveClass('derivs-text__size--md');
36+
});
37+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import { useDevice } from '@deriv-com/ui';
2+
import { render, screen } from '@testing-library/react';
3+
import userEvent from '@testing-library/user-event';
4+
import { MenuContent } from '../MenuContent';
5+
6+
const mockSettingsButtonClick = jest.fn();
7+
8+
jest.mock('@deriv-com/ui', () => ({
9+
...jest.requireActual('@deriv-com/ui'),
10+
useDevice: jest.fn(() => ({ isMobile: true })),
11+
}));
12+
13+
jest.mock('@deriv-com/api-hooks', () => ({
14+
useAuthData: jest.fn().mockReturnValue({
15+
isAuthorized: true,
16+
}),
17+
}));
18+
19+
jest.mock('../../PlatformSwitcher', () => ({
20+
PlatformSwitcher: () => <div>PlatformSwitcher</div>,
21+
}));
22+
23+
jest.mock('../MobileMenuConfig', () => ({
24+
MobileMenuConfig: jest.fn(() => [
25+
[
26+
{
27+
as: 'a',
28+
href: '/home',
29+
label: 'Home',
30+
LeftComponent: () => <span>Home Icon</span>,
31+
removeBorderBottom: false,
32+
},
33+
],
34+
[
35+
{
36+
as: 'button',
37+
label: 'Settings',
38+
LeftComponent: () => <span>Settings Icon</span>,
39+
onClick: mockSettingsButtonClick,
40+
removeBorderBottom: true,
41+
},
42+
],
43+
]),
44+
}));
45+
46+
describe('MenuContent Component', () => {
47+
beforeEach(() => {
48+
Object.defineProperty(window, 'matchMedia', {
49+
value: jest.fn(),
50+
writable: true,
51+
});
52+
});
53+
54+
it('renders PlatformSwitcher and MenuItem components correctly', () => {
55+
render(<MenuContent />);
56+
expect(screen.getByText('PlatformSwitcher')).toBeInTheDocument();
57+
expect(screen.getByText('Home')).toBeInTheDocument();
58+
expect(screen.getByText('Settings')).toBeInTheDocument();
59+
});
60+
61+
it('renders MenuItem as an anchor when `as` prop is "a"', () => {
62+
render(<MenuContent />);
63+
expect(screen.getByRole('link', { name: 'Home Icon Home' })).toBeInTheDocument();
64+
});
65+
66+
it('renders anchor props correctly', () => {
67+
render(<MenuContent />);
68+
const link = screen.getByRole('link', { name: 'Home Icon Home' });
69+
expect(link).toBeInTheDocument();
70+
expect(link).toHaveAttribute('href', '/home');
71+
expect(screen.getByText('Home Icon')).toBeInTheDocument();
72+
});
73+
74+
it('renders MenuItem as a button when `as` prop is "button"', () => {
75+
render(<MenuContent />);
76+
expect(screen.getByRole('button', { name: 'Settings Icon Settings' })).toBeInTheDocument();
77+
});
78+
79+
it('renders button props correctly', async () => {
80+
render(<MenuContent />);
81+
const settingsButton = screen.getByRole('button', { name: 'Settings Icon Settings' });
82+
expect(settingsButton).toBeInTheDocument();
83+
await userEvent.click(settingsButton);
84+
expect(mockSettingsButtonClick).toHaveBeenCalled();
85+
});
86+
87+
it('adjusts text size for mobile devices', () => {
88+
render(<MenuContent />);
89+
const text = screen.getByText('Home');
90+
expect(text).toHaveClass('derivs-text__size--md');
91+
});
92+
93+
it('adjusts text size for desktop devices', () => {
94+
(useDevice as jest.Mock).mockReturnValue({ isMobile: false });
95+
render(<MenuContent />);
96+
const text = screen.getByText('Home');
97+
expect(text).toHaveClass('derivs-text__size--sm');
98+
});
99+
100+
it('applies conditional border styles based on configuration', () => {
101+
render(<MenuContent />);
102+
expect(screen.getAllByTestId('dt_menu_item')[0]).toHaveClass('border-b');
103+
expect(screen.getAllByTestId('dt_menu_item')[1]).not.toHaveClass('border-b');
104+
});
105+
});

0 commit comments

Comments
 (0)