@letar/forms

Testing Utilities

Helpers for testing forms with Vitest and @testing-library/react

Overview

@letar/forms/testing provides helpers that reduce boilerplate when testing forms. It wraps @testing-library/react with form-specific utilities.

# Peer dependencies
npm install -D @testing-library/react @testing-library/user-event @testing-library/jest-dom

Quick Example

import { renderForm, fillField, submitForm, expectFieldError } from '@letar/forms/testing'

const { onSubmit } = renderForm(ContactForm)

await fillField('name', 'Ivan')
await fillField('email', 'invalid')
await submitForm()
expectFieldError('email', 'Invalid email')

renderForm

Renders a form component wrapped in ChakraProvider. Returns the standard @testing-library/react result plus bound helpers.

const { fillField, submitForm, expectFieldError, onSubmit } = renderForm(MyForm, {
  defaults: { name: '', email: '' },
  onSubmit: vi.fn(),
})

fillField

Fills a field by its data-field-name attribute. Auto-detects field type:

  • Text/Email/Password/Textarea — clears and types
  • Number — clears and types
  • Checkbox/Switch — clicks to toggle
await fillField('name', 'Ivan')
await fillField('age', 25)
await fillField('agree', true)

Assertion Helpers

expectFieldError('email', 'Invalid email')  // Field shows this error
expectNoFieldError('email')                 // Field has no errors
expectFieldValue('name', 'Ivan')            // Field has this value

Multi-step Helpers

await goToStep(2)         // Click "Next" to reach step 2
expectActiveStep(2)       // Assert current step

Array Helpers

await addItem('phones')                // Click "Add" in list
await removeItem(0, 'phones')         // Remove first item
expectItemCount('phones', 3)          // Assert item count

TestWrapper

Standalone ChakraProvider wrapper for custom test setups:

import { TestWrapper } from '@letar/forms/testing'

render(<TestWrapper><MyComponent /></TestWrapper>)

Live Example

Try the interactive example on forms-example.letar.best.

On this page