import * as React from 'react'; import { screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { renderWithLivenessProvider, getMockedFunction } from '../../__mocks__'; import { useLivenessActor } from '../../hooks/useLivenessActor'; import { getVideoConstraints } from '../helpers'; import { StartLiveness } from '../StartLiveness'; import { getDisplayText } from '../../utils/getDisplayText'; jest.mock('../../hooks/useLivenessActor'); jest.mock('../../shared/CancelButton'); jest.mock('../helpers'); const mockUseLivenessActor = getMockedFunction(useLivenessActor); const mockGetVideoConstraints = getMockedFunction(getVideoConstraints); describe('StartLiveness', () => { const mockActorState: any = {}; const mockActorSend = jest.fn(); const mockBeginCheck = () => { mockActorSend({ type: 'BEGIN', data: { videoConstraints: {}, }, }); }; const { instructionDisplayText } = getDisplayText(undefined); const { instructionsBeginCheckText } = instructionDisplayText; beforeEach(() => { mockUseLivenessActor.mockReturnValue([mockActorState, mockActorSend]); }); afterEach(() => { jest.clearAllMocks(); }); it('should render the StartLiveness component and content appropriately', () => { renderWithLivenessProvider( ); expect( screen.getByText(instructionDisplayText.photosensitivyWarningHeadingText) ).toBeInTheDocument(); expect( screen.getByText(instructionDisplayText.photosensitivyWarningBodyText) ).toBeInTheDocument(); expect( screen.getByText(instructionDisplayText.instructionListHeadingText) ).toBeInTheDocument(); expect( screen.getByText(instructionDisplayText.instructionListStepOneText) ).toBeInTheDocument(); expect( screen.getByText(instructionDisplayText.instructionListStepTwoText) ).toBeInTheDocument(); expect( screen.getByText(instructionDisplayText.instructionListStepThreeText) ).toBeInTheDocument(); expect( screen.getByText(instructionDisplayText.instructionListStepFourText) ).toBeInTheDocument(); expect( screen.getByRole('button', { name: instructionsBeginCheckText, }) ).toBeInTheDocument(); }); it('should render the StartLiveness component with custom component override', () => { const photosensitiveWarning = 'Some warning related to photosensitivity'; const livenessInstructions = 'Some instructions to follow to use liveness face detector'; renderWithLivenessProvider( { return {photosensitiveWarning}; }, Instructions: (): JSX.Element => { return {livenessInstructions}; }, }} /> ); expect(screen.getByText(photosensitiveWarning)).toBeInTheDocument(); expect(screen.getByText(livenessInstructions)).toBeInTheDocument(); // check for default liveness header component if no custom override expect( screen.getByText(instructionDisplayText.instructionsHeaderHeadingText) ).toBeInTheDocument(); // check that the default components are not present when custom overrides are provided expect( screen.queryByText( instructionDisplayText.photosensitivyWarningHeadingText ) ).not.toBeInTheDocument(); expect( screen.queryByText(instructionDisplayText.instructionListHeadingText) ).not.toBeInTheDocument(); expect( screen.getByRole('button', { name: instructionsBeginCheckText }) ).toBeInTheDocument(); }); it('should call the begin handler on begin check', () => { const mockVideoConstraints = {}; mockGetVideoConstraints.mockReturnValue(mockVideoConstraints); renderWithLivenessProvider( ); userEvent.click( screen.getByRole('button', { name: instructionsBeginCheckText }) ); expect(mockActorSend).toHaveBeenCalledWith({ type: 'BEGIN', data: { videoConstraints: mockVideoConstraints, }, }); }); });