/** * Copyright (c) Paymium. * * This source code is licensed under the MIT license found in the * LICENSE file in the root of this projects source tree. */ import '@testing-library/jest-dom'; import { Focus, useFocus } from '../Focus.web'; import { View } from 'react-native'; import { renderHook, render, screen } from '@crossed/test'; import type { KeyboardEvent } from 'react'; jest.mock('react-focus-lock', () => ({ __esModule: true, useFocusScope: jest .fn() .mockImplementation(() => ({ focusNext: jest.fn(), focusPrev: jest.fn() })), default: jest.fn().mockImplementation(({ children }) => children), })); describe('Accordion Focus web', () => { test('Component', async () => { const children = 'Pass child'; const ReactFocusLock = jest.requireMock('react-focus-lock'); render({children}); await screen.findByText(children); expect(ReactFocusLock.default).toBeCalledWith( { children, disabled: true, lockProps: { testID: 'toto' }, as: View, }, {} ); }); test('useFocus', async () => { const onPress = jest.fn(); const { useFocusScope } = jest.requireMock('react-focus-lock'); const focusNext = jest.fn(); const focusPrev = jest.fn(); const stopPropagation = jest.fn(); const preventDefault = jest.fn(); useFocusScope.mockImplementation(() => ({ focusNext, focusPrev })); const { result } = renderHook(() => useFocus({ onPress })); const reset = () => { stopPropagation.mockReset(); preventDefault.mockReset(); focusNext.mockReset(); focusPrev.mockReset(); }; expect(result.current).toHaveProperty(['onKeyDown']); const params = { stopPropagation, preventDefault, } as unknown as KeyboardEvent; result.current.onKeyDown(params); expect(stopPropagation).toBeCalledTimes(0); expect(preventDefault).toBeCalledTimes(0); expect(onPress).toBeCalledTimes(0); expect(focusNext).toBeCalledTimes(0); expect(focusPrev).toBeCalledTimes(0); reset(); result.current.onKeyDown({ ...params, code: 'ArrowDown' }); expect(stopPropagation).toBeCalledTimes(1); expect(preventDefault).toBeCalledTimes(1); expect(onPress).toBeCalledTimes(0); expect(focusNext).toBeCalledTimes(1); expect(focusPrev).toBeCalledTimes(0); reset(); result.current.onKeyDown({ ...params, code: 'ArrowUp' }); expect(stopPropagation).toBeCalledTimes(1); expect(preventDefault).toBeCalledTimes(1); expect(onPress).toBeCalledTimes(0); expect(focusNext).toBeCalledTimes(0); expect(focusPrev).toBeCalledTimes(1); reset(); result.current.onKeyDown({ ...params, code: 'Space' }); expect(stopPropagation).toBeCalledTimes(1); expect(preventDefault).toBeCalledTimes(1); expect(onPress).toBeCalledTimes(1); expect(focusNext).toBeCalledTimes(0); expect(focusPrev).toBeCalledTimes(0); reset(); }); });