import { Nullable } from "@reins/types"; import { z } from "zod"; import { FormAdapter } from "../form-adapter"; type InitialValues = { name: string | null; surname: string | null; age: number | null; address: Nullable<{ street: string; city: string; country: string; }>; }; const initialValues: InitialValues = { name: null, surname: null, age: null, address: null, }; describe("Form Adapter [ Base ]", () => { let form = new FormAdapter(initialValues); beforeEach(() => { form = new FormAdapter(initialValues); }); it("should allow to use and reset form", async () => { form.registerFieldValidation("address", { validate: z.object({ street: z.string(), city: z.string(), country: z.string(), }), }); form.setFieldValue("name", "Some name"); form.setFieldValue("surname", "Some surname"); form.setFieldValue("age", 30); form.setFieldValue("address", { street: "Some street", city: "Some city", country: "Some country", }); form.setFieldTouched("name", true); form.setFieldTouched("surname", true); form.setFieldTouched("age", true); form.setFieldTouched("address", true); await form.submit(() => {}); expect(form.getState()).toEqual({ values: { name: "Some name", surname: "Some surname", age: 30, address: { street: "Some street", city: "Some city", country: "Some country", }, }, validations: { address: false, }, errors: { address: { errors: { validate: false, }, message: "", type: "none", valid: true, }, }, isSubmitting: false, isValidating: false, submitCount: 1, touched: { name: true, surname: true, age: true, address: true, }, dirty: { name: true, surname: true, age: true, address: true, }, page: 1, pages: 1, }); form.reset(); expect(form.getState()).toEqual({ values: initialValues, touched: {}, dirty: {}, errors: {}, validations: {}, isSubmitting: false, isValidating: false, submitCount: 0, page: 1, pages: 1, }); }); });