import { render, screen } from '@testing-library/react'; import user from '@testing-library/user-event'; import * as t from 'io-ts'; import * as tt from 'io-ts-types'; import React from 'react'; import { useForm } from 'react-hook-form'; import { ioTsResolver } from '..'; const USERNAME_REQUIRED_MESSAGE = 'username field is required'; const PASSWORD_REQUIRED_MESSAGE = 'password field is required'; const schema = t.type({ username: tt.withMessage(tt.NonEmptyString, () => USERNAME_REQUIRED_MESSAGE), password: tt.withMessage(tt.NonEmptyString, () => PASSWORD_REQUIRED_MESSAGE), }); function TestComponent({ onSubmit, }: { onSubmit: (data: t.OutputOf) => void }) { const { register, handleSubmit } = useForm({ resolver: ioTsResolver(schema), shouldUseNativeValidation: true, }); return (
); } test("form's native validation with io-ts", async () => { const handleSubmit = vi.fn(); render(); // username let usernameField = screen.getByPlaceholderText( /username/i, ) as HTMLInputElement; expect(usernameField.validity.valid).toBe(true); expect(usernameField.validationMessage).toBe(''); // password let passwordField = screen.getByPlaceholderText( /password/i, ) as HTMLInputElement; expect(passwordField.validity.valid).toBe(true); expect(passwordField.validationMessage).toBe(''); await user.click(screen.getByText(/submit/i)); // username usernameField = screen.getByPlaceholderText(/username/i) as HTMLInputElement; expect(usernameField.validity.valid).toBe(false); expect(usernameField.validationMessage).toBe(USERNAME_REQUIRED_MESSAGE); // password passwordField = screen.getByPlaceholderText(/password/i) as HTMLInputElement; expect(passwordField.validity.valid).toBe(false); expect(passwordField.validationMessage).toBe(PASSWORD_REQUIRED_MESSAGE); await user.type(screen.getByPlaceholderText(/username/i), 'joe'); await user.type(screen.getByPlaceholderText(/password/i), 'password'); // username usernameField = screen.getByPlaceholderText(/username/i) as HTMLInputElement; expect(usernameField.validity.valid).toBe(true); expect(usernameField.validationMessage).toBe(''); // password passwordField = screen.getByPlaceholderText(/password/i) as HTMLInputElement; expect(passwordField.validity.valid).toBe(true); expect(passwordField.validationMessage).toBe(''); });