import { describe, expect, it, afterEach } from 'vitest' import { render, screen, cleanup } from '@testing-library/react' import userEvent from '@testing-library/user-event' import { FormProvider, useForm } from 'react-hook-form' import { IntlProvider } from 'react-intl' import { PasswordInput } from './PasswordInput' afterEach(() => { cleanup() }) function FormWrapper({ children, defaultValues = { password: '' }, }: { children: React.ReactNode defaultValues?: Record }) { const methods = useForm({ defaultValues }) return (
{children}
) } const renderPasswordInput = ( props: React.ComponentProps = {}, defaultValues?: Record ) => { return render( ) } describe('PasswordInput', () => { describe('rendering', () => { it('renders with default password label', () => { renderPasswordInput() expect(screen.getByLabelText('Password')).toBeTruthy() }) it('renders with custom label', () => { renderPasswordInput({ label: 'Enter your password' }) expect(screen.getByLabelText('Enter your password')).toBeTruthy() }) it('renders with new password label when isNewPassword is true', () => { renderPasswordInput({ isNewPassword: true }) expect(screen.getByLabelText('New password')).toBeTruthy() }) }) describe('visibility toggle', () => { it('shows visibility toggle button by default', () => { renderPasswordInput() expect(screen.getByLabelText('Show password')).toBeTruthy() }) it('hides visibility toggle when visibilityToggleable is false', () => { renderPasswordInput({ visibilityToggleable: false }) expect(screen.queryByLabelText('Show password')).toBeNull() expect(screen.queryByLabelText('Hide password')).toBeNull() }) }) describe('disabled state', () => { it('disables the input when disabled prop is true', () => { renderPasswordInput({ disabled: true }) expect(screen.getByLabelText('Password')).toHaveProperty('disabled', true) }) }) describe('form integration', () => { it('updates form value when typing', async () => { const user = userEvent.setup() renderPasswordInput() const input = screen.getByLabelText('Password') await user.type(input, 'secret123') expect(input).toHaveProperty('value', 'secret123') }) it('uses custom name prop', async () => { const user = userEvent.setup() renderPasswordInput({ name: 'confirmPassword' }, { confirmPassword: '' }) const input = screen.getByLabelText('Password') await user.type(input, 'test') expect(input).toHaveProperty('value', 'test') }) }) })