import * as React from 'react'; import { screen } from '@testing-library/react'; import { useThemeBreakpoint } from '@aws-amplify/ui-react/internal'; import { LivenessErrorState } from '../../service'; import { renderWithLivenessProvider, getMockedFunction } from '../../__mocks__'; import { LivenessCheck } from '../LivenessCheck'; import { useLivenessSelector, useLivenessActor } from '../../hooks'; import { getDisplayText } from '../../utils/getDisplayText'; import { defaultErrorDisplayText } from '../../displayText'; import { mockMatchMedia } from '../../__mocks__'; jest.mock('../../hooks'); jest.mock('@aws-amplify/ui-react/internal'); jest.mock('../../shared/CancelButton'); jest.mock('../LivenessCameraModule'); const mockUseLivenessActor = getMockedFunction(useLivenessActor); const mockUseThemeBreakpoint = getMockedFunction(useThemeBreakpoint); const mockUseLivenessSelector = getMockedFunction(useLivenessSelector); const { landscapeHeaderText, landscapeMessageText } = defaultErrorDisplayText; const { hintDisplayText, cameraDisplayText, streamDisplayText, errorDisplayText, } = getDisplayText(undefined); const { cameraMinSpecificationsHeadingText, cameraMinSpecificationsMessageText, cameraNotFoundHeadingText, cameraNotFoundMessageText, retryCameraPermissionsText, } = cameraDisplayText; const { cancelLivenessCheckText } = streamDisplayText; describe('LivenessCheck', () => { const mockActorState: any = { matches: jest.fn(), }; const mockActorSend = jest.fn(); const { userAgent: originalUserAgent } = window.navigator; beforeAll(() => { Object.defineProperty( window.navigator, 'userAgent', ((value) => ({ get() { return value; }, set(v) { value = v; }, }))(window.navigator['userAgent']) ); }); afterAll(() => { Object.defineProperty(window, 'navigator', { configurable: true, value: originalUserAgent, }); }); beforeEach(() => { mockUseLivenessActor.mockReturnValue([mockActorState, mockActorSend]); mockUseThemeBreakpoint.mockReturnValue('small'); }); afterEach(() => { jest.clearAllMocks(); }); it('should render the component content on desktop with permissionDenied true', () => { mockActorState.matches.mockReturnValue(true); renderWithLivenessProvider( ); expect( screen.getByRole('button', { name: cancelLivenessCheckText, }) ).toBeInTheDocument(); expect(screen.getByText(cameraNotFoundHeadingText)).toBeInTheDocument(); expect(screen.getByText(cameraNotFoundMessageText)).toBeInTheDocument(); expect(screen.getByText(retryCameraPermissionsText)).toBeInTheDocument(); expect(screen.queryByText('LivenessCameraModule')).not.toBeInTheDocument(); }); it('should render the component content on desktop when no 15 fps camera is found', () => { mockActorState.matches.mockReturnValue(true); mockUseLivenessSelector.mockReturnValue( LivenessErrorState.CAMERA_FRAMERATE_ERROR ); renderWithLivenessProvider( ); expect( screen.getByRole('button', { name: cancelLivenessCheckText, }) ).toBeInTheDocument(); expect( screen.getByText(cameraMinSpecificationsHeadingText) ).toBeInTheDocument(); expect( screen.getByText(cameraMinSpecificationsMessageText) ).toBeInTheDocument(); expect(screen.queryByText('LivenessCameraModule')).not.toBeInTheDocument(); }); it('should render the component content on mobile with permissionDenied false', () => { mockActorState.matches.mockReturnValue(false); mockUseThemeBreakpoint.mockReturnValue('base'); renderWithLivenessProvider( ); expect( screen.queryByText(cameraNotFoundHeadingText) ).not.toBeInTheDocument(); expect(screen.getByText('LivenessCameraModule')).toBeInTheDocument(); }); it('should render the component content for mobile landscape errors', () => { mockActorState.matches.mockReturnValue(true); (global.navigator as any).userAgent = 'Mozilla/5.0 (Linux; Android 12; Pixel 6 Build/SD1A.210817.023; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Firefox/94.0.4606.71 Mobile Safari/537.36'; mockMatchMedia('(orientation: landscape)', true); mockActorState.matches.mockReturnValue(true); mockUseLivenessSelector.mockReturnValue( LivenessErrorState.MOBILE_LANDSCAPE_ERROR ); renderWithLivenessProvider( ); expect(screen.getByText(landscapeHeaderText)).toBeInTheDocument(); expect(screen.getByText(landscapeMessageText)).toBeInTheDocument(); expect(screen.queryByText('LivenessCameraModule')).not.toBeInTheDocument(); }); });