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()
})
})