import { fireEvent, render, waitFor } from "@testing-library/react"; import { ContextScope } from "@reins/utils"; import { FormAdapter } from "utils"; import { Form } from "../form"; describe("Form [ Rendering ]", () => { const initialValues = { name: "name", email: "email", password: "password", }; const form = new FormAdapter(initialValues); const formContexts = new ContextScope("Form").createContext("FormProvider", { form }); const [FormProvider] = formContexts.getContext("FormProvider"); const Provider = (props: Omit[0], "__context">) => ( ); const onSubmit = jest.fn(); let rerenders = 0; const App = () => { rerenders += 1; return (
); }; beforeEach(() => { form.reset(); onSubmit.mockClear(); rerenders = 0; }); it("should render Form only once when values change", async () => { const { getByTestId } = render(); const submit = getByTestId("submit"); fireEvent.click(submit); await waitFor(() => { expect(onSubmit).toHaveBeenCalledTimes(1); }); expect(rerenders).toBe(1); }); it("should render Form only once", async () => { const { getByTestId } = render(); form.setFieldValue("name", "new name"); form.setFieldValue("email", "new email"); form.setFieldValue("password", "new password"); const submit = getByTestId("submit"); fireEvent.click(submit); await waitFor(() => { expect(onSubmit).toHaveBeenCalledTimes(1); }); expect(rerenders).toBe(1); }); });