import { render, screen } from '@testing-library/react' import { describe, it, expect } from 'vitest' import { axe } from 'vitest-axe' import { Field as BaseField } from '@base-ui/react/field' import { Field, FieldLabel, FieldDescription, FieldError, FieldValidity } from './field' describe('Field', () => { it('renders label associated with the control', () => { render( Email , ) expect(screen.getByLabelText('Email')).toBeInTheDocument() }) it('renders a description that describes the control', () => { render( Email We never share your email. , ) const control = screen.getByLabelText('Email') const description = screen.getByText('We never share your email.') expect(control).toHaveAttribute('aria-describedby', expect.stringContaining(description.id)) }) it('shows an error message when the field is invalid', () => { render( Email Email is required , ) expect(screen.getByText('Email is required')).toBeInTheDocument() }) it('exposes validity state via FieldValidity render prop', () => { render( Email {(state) => {String(state.validity.valid)}} , ) expect(screen.getByTestId('valid')).toBeInTheDocument() }) it('forwards className to each sub-component', () => { render( Email Hint Bad , ) expect(screen.getByText('Email').className).toContain('label-x') expect(screen.getByText('Hint').className).toContain('desc-x') expect(screen.getByText('Bad').className).toContain('err-x') }) it('has no accessibility violations', async () => { const { container } = render( Email We never share your email. , ) expect(await axe(container)).toHaveNoViolations() }) })