javascript / intermediate
Snippet
Asserting Accessible Form Validation States with Testing Library
Form validation should reflect both visual and semantic state changes. Testing with React Testing Library allows developers to query elements by accessible roles and attributes like `aria-invalid` and `role="alert"`, ensuring accessibility standards are met.
snippet.js
javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import React, { useState } from 'react';import { render, screen, fireEvent } from '@testing-library/react';function EmailForm({ onSubmit }) {const [email, setEmail] = useState('');const [error, setError] = useState('');const handleSubmit = (e) => {e.preventDefault();if (!email.includes('@')) {setError('Please provide a valid email address.');return;}setError('');onSubmit(email);};return (<form onSubmit={handleSubmit} noValidate><label htmlFor="email-input">Email Address</label><inputid="email-input"type="email"value={email}onChange={(e) => setEmail(e.target.value)}aria-invalid={Boolean(error)}aria-describedby={error ? 'email-error' : undefined}/>{error && <span id="email-error" role="alert">{error}</span>}<button type="submit">Subscribe</button></form>);}test('displays accessible error message on invalid email submission', () => {render(<EmailForm onSubmit={jest.fn()} />);const input = screen.getByLabelText(/email address/i);const submitButton = screen.getByRole('button', { name: /subscribe/i });fireEvent.change(input, { target: { value: 'invalid-email' } });fireEvent.click(submitButton);expect(input).toHaveAttribute('aria-invalid', 'true');const alert = screen.getByRole('alert');expect(alert).toHaveTextContent(/valid email address/i);});
react
Breakdown
1
aria-invalid={Boolean(error)}
Exposes validation status semantically to assistive technologies via accessibility trees.
2
const input = screen.getByLabelText(/email address/i);
Locates the form control using accessible name association derived from the label element.
3
expect(input).toHaveAttribute('aria-invalid', 'true');
Asserts that the component communicates its error state through ARIA attributes.