import { fireEvent, render } from "@testing-library/react-native"; import React, { useContext, useEffect } from "react"; import { Keyboard, Platform } from "react-native"; import { InputAccessoriesContext } from "./InputAccessoriesContext"; import { InputAccessoriesProvider } from "./InputAccessoriesProvider"; import { InputText } from "../InputText"; const mockUseFormController = jest.fn(); jest.mock("../../hooks", () => { return { useFormController: ( ...args: [{ name: string; value: string; validations: unknown }] ) => mockUseFormController(...args), }; }); const actualUseFormController = jest.requireActual("../../hooks").useFormController; describe("InputAccessories", () => { beforeEach(() => { Platform.OS = "ios"; }); afterEach(() => { // restore the spy created with spyOn jest.resetAllMocks(); }); const inputOneName = "testInput1"; const inputTwoName = "testInput2"; const mockInputOneFocus = jest.fn(); const mockInputTwoFocus = jest.fn(); function InputWrapper({ focusedInput }: { readonly focusedInput: string }) { const { register, setFocusedInput, unregister } = useContext( InputAccessoriesContext, ); useEffect(() => { register(inputOneName, () => mockInputOneFocus()); register(inputTwoName, () => mockInputTwoFocus()); setFocusedInput(focusedInput); return () => { unregister(inputOneName); unregister(inputTwoName); setFocusedInput(""); }; }, [register, setFocusedInput, unregister, focusedInput]); return ( <> ); } function SetupInputAccessoriesTest(focusedInput: string) { mockUseFormController.mockImplementation(({ name, value, validations }) => { const { field, error } = actualUseFormController({ name: name || inputTwoName, value, validations, }); return { field, error }; }); return render(, { wrapper: InputAccessoriesProvider, }); } it("pressing done dismisses the keyboard", async () => { const keyboardDismissSpy = jest.spyOn(Keyboard, "dismiss"); const { getByTestId } = SetupInputAccessoriesTest(inputOneName); const doneButton = getByTestId("ATL-InputAccessory-Done"); await fireEvent.press(doneButton); expect(keyboardDismissSpy).toHaveBeenCalled(); }); });