import { describe, it, expect, vi } from 'vitest'; import { render, screen, fireEvent } from '@testing-library/react'; import Input from '@/components/ui/Input'; import Field from '@/components/ui/Field'; describe('Input', () => { it('مقدار و placeholder را رندر می‌کند', () => { render(); const el = screen.getByPlaceholderText('نام') as HTMLInputElement; expect(el.value).toBe('ساغر'); expect(el.className).toBe('cp-input'); }); it('در حالت hasError قاب قرمز می‌گیرد', () => { render(); const el = screen.getByPlaceholderText('کدملی') as HTMLInputElement; expect(el.style.borderColor).toBe('var(--danger)'); }); it('با numeric کیبورد عددی و جهت LTR می‌گیرد', () => { render(); const el = screen.getByPlaceholderText('مبلغ') as HTMLInputElement; expect(el.inputMode).toBe('numeric'); expect(el.getAttribute('dir')).toBe('ltr'); expect(el.getAttribute('lang')).toBe('en'); }); it('با numeric ارقام فارسی را قبل از onChange به لاتین تبدیل می‌کند', () => { const onChange = vi.fn(); render(); const el = screen.getByPlaceholderText('مبلغ') as HTMLInputElement; fireEvent.change(el, { target: { value: '۱۲۳۴' } }); expect(onChange).toHaveBeenCalledTimes(1); expect(onChange.mock.calls[0][0].target.value).toBe('1234'); }); it('بدون numeric ورودی را دست‌نخورده می‌گذارد', () => { const onChange = vi.fn(); render(); const el = screen.getByPlaceholderText('نام') as HTMLInputElement; fireEvent.change(el, { target: { value: 'علی۱۲' } }); expect(onChange.mock.calls[0][0].target.value).toBe('علی۱۲'); }); }); describe('Field', () => { it('برچسب و فرزند را نشان می‌دهد و بدون خطا پیام خطا ندارد', () => { render( , ); expect(screen.getByText('نام پدر')).toBeInTheDocument(); expect(screen.getByPlaceholderText('نام پدر را وارد کنید')).toBeInTheDocument(); }); it('پیام خطا را وقتی error داده شود نمایش می‌دهد', () => { render( , ); expect(screen.getByText('کد ملی باید ۱۰ رقم باشد')).toBeInTheDocument(); }); });