import { describe, it, expect, vi } from 'vitest'; import { useState } from 'react'; import { render, screen, fireEvent } from '@testing-library/react'; import PriceInput from './PriceInput'; /** پوشش حالت واقعی: مقدار توسط والد نگه داشته می‌شود (controlled). */ function Controlled({ initial = 0, ...rest }: { initial?: number } & Record) { const [value, setValue] = useState(initial); return ( <> {value} ); } const input = () => screen.getByRole('textbox') as HTMLInputElement; const emitted = () => screen.getByTestId('value').textContent; describe('PriceInput', () => { it('رقم فارسی را می‌پذیرد و عدد لاتین می‌دهد', () => { render(); fireEvent.change(input(), { target: { value: '۸۵۰۰۰' } }); expect(emitted()).toBe('85000'); expect(input().value).toBe('۸۵٬۰۰۰'); }); it('رقم عربی را می‌پذیرد', () => { render(); fireEvent.change(input(), { target: { value: '٢٥٠' } }); expect(emitted()).toBe('250'); }); it('پیست با واحد و جداکننده پاک‌سازی می‌شود', () => { render(); fireEvent.change(input(), { target: { value: '۸۵,۰۰۰ تومان' } }); expect(emitted()).toBe('85000'); }); it('صفرِ تایپ‌شده حفظ می‌شود و به خالی تبدیل نمی‌شود', () => { render(); fireEvent.change(input(), { target: { value: '۰' } }); expect(input().value).toBe('۰'); expect(emitted()).toBe('0'); }); it('پاک‌کردن فیلد ⇒ خالی و مقدار صفر', () => { render(); fireEvent.change(input(), { target: { value: '' } }); expect(input().value).toBe(''); expect(emitted()).toBe('0'); }); it('مقدار اولیه صفر ⇒ فیلد خالی (نه ۰)', () => { render(); expect(input().value).toBe(''); }); it('min حین تایپ اعمال نمی‌شود ولی روی blur اعمال می‌شود', () => { render(); fireEvent.change(input(), { target: { value: '۵' } }); expect(emitted()).toBe('5'); fireEvent.blur(input()); expect(emitted()).toBe('100'); expect(input().value).toBe('۱۰۰'); }); it('max روی blur اعمال می‌شود', () => { render(); fireEvent.change(input(), { target: { value: '۵۰۰۰' } }); fireEvent.blur(input()); expect(emitted()).toBe('1000'); }); it('فیلد خالی روی blur به min پرت نمی‌شود', () => { render(); fireEvent.blur(input()); expect(input().value).toBe(''); expect(emitted()).toBe('0'); }); it('حروف نامعتبر حذف می‌شوند و هرگز NaN نمی‌دهد', () => { render(); fireEvent.change(input(), { target: { value: 'ابج' } }); expect(input().value).toBe(''); expect(emitted()).toBe('0'); expect(emitted()).not.toContain('NaN'); }); it('latin ارقام لاتین با کاما نمایش می‌دهد', () => { render(); fireEvent.change(input(), { target: { value: '۱۲۰۰' } }); expect(input().value).toBe('1,200'); }); it('suffix واحد را کنار فیلد نشان می‌دهد', () => { render(); expect(screen.getByText('تومان')).toBeTruthy(); }); it('تغییر مقدار از بیرون متن فیلد را همگام می‌کند', () => { const { rerender } = render(); expect(input().value).toBe('۱٬۰۰۰'); rerender(); expect(input().value).toBe(''); }); });