/** * Tests for AuthFormField Component * FE-TEST-005: Test auth form field component */ import { describe, it, expect } from 'vitest'; import { render, screen } from '@testing-library/react'; import { AuthFormField } from './AuthFormField'; describe('AuthFormField', () => { it('should render label and children', () => { render( , ); expect(screen.getByText('Email')).toBeInTheDocument(); expect(screen.getByRole('textbox')).toBeInTheDocument(); }); it('should show required indicator', () => { render( , ); const label = screen.getByText('Email'); expect(label).toBeInTheDocument(); // Check for required asterisk (it's in a span with aria-label="required") expect(screen.getByLabelText('required')).toBeInTheDocument(); }); it('should display error message', () => { render( , ); expect(screen.getByText('Email is required')).toBeInTheDocument(); expect(screen.getByText('Email is required')).toHaveAttribute( 'role', 'alert', ); }); it('should display help text when no error', () => { render( , ); expect(screen.getByText('Enter your email address')).toBeInTheDocument(); }); it('should not display help text when error is present', () => { render( , ); expect(screen.getByText('Email is required')).toBeInTheDocument(); expect( screen.queryByText('Enter your email address'), ).not.toBeInTheDocument(); }); it('should use custom htmlFor', () => { render( , ); const label = screen.getByText('Email'); expect(label).toHaveAttribute('for', 'custom-email'); }); it('should generate field id if htmlFor not provided', () => { render( , ); const label = screen.getByText('Email'); expect(label).toHaveAttribute('for'); expect(label.getAttribute('for')).toMatch(/^auth-field-/); }); it('should apply custom className', () => { const { container } = render( , ); const fieldContainer = container.querySelector('.custom-class'); expect(fieldContainer).toBeInTheDocument(); }); it('should associate error message with field', () => { render( , ); const errorMessage = screen.getByText('Email is required'); const errorId = errorMessage.getAttribute('id'); expect(errorId).toMatch(/-error$/); }); });