import { screen, userEvent } from "@testing-library/react-native"; import AddObsButton from "components/AddObsBottomSheet/AddObsButton"; import i18next from "i18next"; import React from "react"; import { renderComponent } from "tests/helpers/render"; import setStoreStateLayout from "tests/helpers/setStoreStateLayout"; const actor = userEvent.setup(); const mockDispatch = jest.fn(); jest.mock( "@react-navigation/native", () => { const actualNav = jest.requireActual( "@react-navigation/native" ); return { ...actualNav, useNavigation: () => ( { dispatch: mockDispatch, } ), }; } ); const resetNavigation = ( name, params ) => ( { payload: { index: 0, routes: [{ name: "NoBottomTabStackNavigator", state: { index: 0, routes: [{ name, params, }], }, }], }, type: "RESET", } ); beforeAll( ( ) => { jest.useFakeTimers( ); } ); const longPress = async ( ) => { const addObsButton = screen.getByLabelText( i18next.t( "Add-observations" ), ); expect( addObsButton ).toBeTruthy( ); await actor.longPress( addObsButton ); }; const showNoEvidenceOption = ( ) => { const noEvidenceButton = screen.getByTestId( i18next.t( "observe-without-evidence-button" ), ); expect( noEvidenceButton ).toBeTruthy( ); return noEvidenceButton; }; const regularPress = async ( ) => { const addObsButton = screen.getByLabelText( i18next.t( "Add-observations" ), ); expect( addObsButton ).toBeTruthy( ); await actor.press( addObsButton ); }; describe( "AddObsButton", ( ) => { it( "navigates user to AI camera", async ( ) => { renderComponent( ); await regularPress( ); expect( mockDispatch ).toHaveBeenCalledWith( resetNavigation( "Camera", { camera: "AI", previousScreen: null } ), ); } ); it( "opens model on long press", async ( ) => { renderComponent( ); await longPress( ); showNoEvidenceOption( ); } ); } ); describe( "with advanced user layout", ( ) => { beforeEach( ( ) => { setStoreStateLayout( { isAllAddObsOptionsMode: true, } ); } ); it( "opens AddObsBottomSheet", async ( ) => { renderComponent( ); await regularPress( ); showNoEvidenceOption( ); } ); it( "navigates user to obs edit with no evidence", async ( ) => { renderComponent( ); await regularPress( ); const noEvidenceButton = showNoEvidenceOption( ); await actor.press( noEvidenceButton ); expect( mockDispatch ).toHaveBeenCalledWith( resetNavigation( "ObsEdit", { previousScreen: null } ), ); } ); it( "does not open model on long press", async ( ) => { renderComponent( ); await longPress( ); const noEvidenceButton = screen.queryByLabelText( i18next.t( "Observation-with-no-evidence" ), ); expect( noEvidenceButton ).toBeFalsy( ); } ); describe( "with advanced AICamera-only setting", ( ) => { beforeEach( ( ) => { setStoreStateLayout( { isDefaultMode: false, isAllAddObsOptionsMode: false, } ); } ); it( "opens model on long press", async ( ) => { renderComponent( ); await longPress( ); showNoEvidenceOption( ); } ); } ); } );