import { describe, it, expect, vi, afterEach } from 'vitest'; import { render, screen, cleanup, fireEvent } from '@testing-library/react'; import NumberInput from '@/components/settings/NumberInput'; vi.mock('@/hooks/useTranslation', () => ({ useTranslation: () => (s: string) => s, })); afterEach(cleanup); describe('NumberInput', () => { const defaultProps = { label: 'Font Size', value: 16, min: 8, max: 72, onChange: vi.fn(), }; it('commits value on Enter key (form submit)', () => { const onChange = vi.fn(); render(); const input = screen.getByDisplayValue('16'); fireEvent.change(input, { target: { value: '24' } }); expect(onChange).not.toHaveBeenCalled(); // Enter triggers form submit which commits the value fireEvent.submit(input.closest('form')!); expect(onChange).toHaveBeenCalledWith(24); }); it('commits value on blur', () => { const onChange = vi.fn(); render(); const input = screen.getByDisplayValue('16'); fireEvent.change(input, { target: { value: '20' } }); fireEvent.blur(input); expect(onChange).toHaveBeenCalledWith(20); }); it('clamps value to min/max on commit', () => { const onChange = vi.fn(); render(); const input = screen.getByDisplayValue('16'); fireEvent.change(input, { target: { value: '100' } }); fireEvent.submit(input.closest('form')!); expect(onChange).toHaveBeenCalledWith(72); }); });