Skip to content

Commit a331375

Browse files
committed
Merge branch 'master' of github.com:deriv-com/p2p
2 parents 6c3cc54 + 2bff9b7 commit a331375

File tree

3 files changed

+132
-4
lines changed

3 files changed

+132
-4
lines changed
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import { BrowserRouter } from 'react-router-dom';
2+
import { QueryParamProvider } from 'use-query-params';
3+
import { ReactRouter5Adapter } from 'use-query-params/adapters/react-router-5';
4+
import { useModalManager } from '@/hooks';
5+
import { useDevice } from '@deriv-com/ui';
6+
import { render, screen } from '@testing-library/react';
7+
import userEvent from '@testing-library/user-event';
8+
import MobileMenu from '../MobileMenu';
9+
10+
jest.mock('@/hooks', () => ({
11+
useModalManager: jest.fn().mockReturnValue({
12+
hideModal: jest.fn(),
13+
isModalOpenFor: jest.fn().mockReturnValue(false),
14+
showModal: jest.fn(),
15+
}),
16+
useNetworkStatus: jest.fn().mockReturnValue('online'),
17+
useSyncedTime: jest.fn(),
18+
}));
19+
20+
jest.mock('@deriv-com/ui', () => ({
21+
...jest.requireActual('@deriv-com/ui'),
22+
useDevice: jest.fn(),
23+
}));
24+
25+
jest.mock('@deriv-com/api-hooks', () => ({
26+
useAuthData: jest.fn().mockReturnValue({
27+
isAuthorized: true,
28+
}),
29+
}));
30+
31+
jest.mock('@deriv-com/translations', () => ({
32+
useTranslations: jest.fn().mockReturnValue({
33+
currentLang: 'EN',
34+
localize: jest.fn(text => text),
35+
}),
36+
}));
37+
38+
const MobileMenuComponent = () => (
39+
<BrowserRouter>
40+
<QueryParamProvider adapter={ReactRouter5Adapter}>
41+
<MobileMenu />
42+
</QueryParamProvider>
43+
</BrowserRouter>
44+
);
45+
46+
describe('MobileMenu component', () => {
47+
it('should not render when isDesktop is true', () => {
48+
(useDevice as jest.Mock).mockReturnValue({ isDesktop: true });
49+
render(<MobileMenuComponent />);
50+
expect(screen.queryByText('Menu')).not.toBeInTheDocument();
51+
});
52+
53+
it('should render toggle button and handle click', async () => {
54+
(useDevice as jest.Mock).mockReturnValue({ isDesktop: false });
55+
render(<MobileMenuComponent />);
56+
expect(screen.queryByText('Menu')).not.toBeInTheDocument();
57+
await userEvent.click(screen.getByRole('button'));
58+
expect(screen.getByText('Menu')).toBeInTheDocument();
59+
});
60+
61+
it('should open the language settings', async () => {
62+
(useDevice as jest.Mock).mockReturnValue({ isDesktop: false });
63+
const { isModalOpenFor, showModal } = useModalManager();
64+
65+
render(<MobileMenuComponent />);
66+
await userEvent.click(screen.getByRole('button'));
67+
expect(screen.getByText('EN')).toBeInTheDocument();
68+
69+
await userEvent.click(screen.getByText('EN'));
70+
71+
expect(showModal).toHaveBeenCalledWith('MobileLanguagesDrawer');
72+
expect(isModalOpenFor).toHaveBeenCalledWith('MobileLanguagesDrawer');
73+
});
74+
});
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { act, renderHook } from '@testing-library/react';
2+
import { useFullScreen } from '../custom-hooks';
3+
4+
describe('useFullScreen', () => {
5+
afterEach(() => {
6+
jest.restoreAllMocks();
7+
});
8+
9+
it('should add and remove fullscreen event listeners', () => {
10+
const addEventListenerSpy = jest.spyOn(document, 'addEventListener');
11+
const removeEventListenerSpy = jest.spyOn(document, 'removeEventListener');
12+
13+
const { unmount } = renderHook(() => useFullScreen());
14+
15+
expect(addEventListenerSpy).toHaveBeenCalledWith('fullscreenchange', expect.any(Function), false);
16+
expect(addEventListenerSpy).toHaveBeenCalledWith('webkitfullscreenchange', expect.any(Function), false);
17+
expect(addEventListenerSpy).toHaveBeenCalledWith('mozfullscreenchange', expect.any(Function), false);
18+
expect(addEventListenerSpy).toHaveBeenCalledWith('MSFullscreenChange', expect.any(Function), false);
19+
20+
unmount();
21+
22+
expect(removeEventListenerSpy).toHaveBeenCalledWith('fullscreenchange', expect.any(Function), false);
23+
expect(removeEventListenerSpy).toHaveBeenCalledWith('webkitfullscreenchange', expect.any(Function), false);
24+
expect(removeEventListenerSpy).toHaveBeenCalledWith('mozfullscreenchange', expect.any(Function), false);
25+
expect(removeEventListenerSpy).toHaveBeenCalledWith('MSFullscreenChange', expect.any(Function), false);
26+
});
27+
28+
it('should call requestFullscreen when trying to enter fullscreen', () => {
29+
const requestFullscreenMock = jest.fn();
30+
document.documentElement.requestFullscreen = requestFullscreenMock;
31+
const { result } = renderHook(() => useFullScreen());
32+
33+
act(() => {
34+
result.current.toggleFullScreenMode();
35+
});
36+
37+
expect(requestFullscreenMock).toHaveBeenCalled();
38+
});
39+
40+
it('should clean up event listeners on unmount', () => {
41+
const removeEventListenerSpy = jest.spyOn(document, 'removeEventListener');
42+
const { unmount } = renderHook(() => useFullScreen());
43+
44+
unmount();
45+
46+
expect(removeEventListenerSpy).toHaveBeenCalledTimes(4);
47+
});
48+
});

src/hooks/custom-hooks/useFullScreen.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,19 @@ const useFullScreen = () => {
2020
screenChange.forEach(event => {
2121
document.addEventListener(event, onFullScreen, false);
2222
});
23+
24+
return () => {
25+
screenChange.forEach(event => {
26+
document.removeEventListener(event, onFullScreen, false);
27+
});
28+
};
2329
}, [onFullScreen, screenChange]);
2430

25-
const toggleFullScreenMode = (event: MouseEvent<HTMLButtonElement>) => {
26-
event.stopPropagation();
31+
const toggleFullScreenMode = (event?: MouseEvent<HTMLButtonElement>) => {
32+
event?.stopPropagation();
2733

28-
const exitFullScreen = exit.find(element => document[element as keyof Document]);
29-
const requestFullScreen = request.find(element => document.documentElement[element as keyof HTMLElement]);
34+
const exitFullScreen = exit.find(method => document[method as keyof Document]);
35+
const requestFullScreen = request.find(method => document.documentElement[method as keyof HTMLElement]);
3036

3137
if (isInFullScreenMode && exitFullScreen) {
3238
(document[exitFullScreen as keyof Document] as Document['exitFullscreen'])();

0 commit comments

Comments
 (0)