import { describe, it, expect, vi } from 'vitest'; import { render, screen, fireEvent } from '@testing-library/react'; import SearchableSelect from './SearchableSelect'; vi.mock('../../stores/uiStore', () => ({ useUiStore: () => false })); const insuranceOpts = [ { value: '176', label: 'تامین اجتماعی' }, { value: '178', label: 'بیمه ارتش' }, ]; describe('SearchableSelect — تطبیق مقدار', () => { it('مقدار number با گزینهٔ string تطبیق می‌خورد (id بیمه)', () => { render( {}} />); expect(screen.getByText('تامین اجتماعی')).toBeInTheDocument(); }); it('مقدار string با گزینهٔ string تطبیق می‌خورد', () => { render( {}} />); expect(screen.getByText('بیمه ارتش')).toBeInTheDocument(); }); it('مقدار number با گزینهٔ number تطبیق می‌خورد', () => { render( {}} />); expect(screen.getByText('یزد')).toBeInTheDocument(); }); it('null/خالی → هیچ گزینه‌ای انتخاب نمی‌شود (placeholder)', () => { render( {}} placeholder="انتخاب کنید..." />); expect(screen.getByText('انتخاب کنید...')).toBeInTheDocument(); expect(screen.queryByText('تامین اجتماعی')).not.toBeInTheDocument(); }); }); describe('SearchableSelect — نام دسترس‌پذیر', () => { it('در نبود ariaLabel، از placeholder به‌عنوان نام استفاده می‌کند', () => { render( {}} placeholder="نوع بیمه" />); expect(screen.getByRole('combobox', { name: 'نوع بیمه' })).toBeInTheDocument(); }); it('ariaLabel بر placeholder اولویت دارد', () => { render( {}} placeholder="انتخاب کنید..." ariaLabel="بیمه پایه" />); expect(screen.getByRole('combobox', { name: 'بیمه پایه' })).toBeInTheDocument(); }); it('ariaLabelledBy به label قابل‌مشاهده وصل می‌شود', () => { render( <> شهر {}} ariaLabelledBy="lbl-city" /> , ); expect(screen.getByRole('combobox', { name: 'شهر' })).toBeInTheDocument(); }); }); describe('SearchableSelect — جستجوی سمت سرور', () => { it('با تایپ، onInputChange صدا زده می‌شود', () => { const onInputChange = vi.fn(); render( {}} inputId="srv" onInputChange={onInputChange} />); fireEvent.change(document.getElementById('srv') as HTMLInputElement, { target: { value: 'رضا' } }); expect(onInputChange).toHaveBeenCalledWith('رضا'); }); /** نتیجهٔ سرور نباید دوباره روی متنِ تایپ‌شده فیلتر شود. */ it('در حالت سرور، گزینه‌ای که با متن تایپ‌شده نمی‌خواند هم می‌ماند', () => { render( {}} inputId="srv2" onInputChange={() => {}} />, ); const input = document.getElementById('srv2') as HTMLInputElement; fireEvent.focus(input); fireEvent.keyDown(input, { key: 'ArrowDown' }); fireEvent.change(input, { target: { value: '0912' } }); expect(screen.getByText('دکتر رضایی')).toBeInTheDocument(); }); it('بدون onInputChange، فیلتر داخلی سر جایش می‌ماند', () => { render( {}} inputId="srv3" />); const input = document.getElementById('srv3') as HTMLInputElement; fireEvent.focus(input); fireEvent.keyDown(input, { key: 'ArrowDown' }); fireEvent.change(input, { target: { value: '0912' } }); expect(screen.queryByText('دکتر رضایی')).not.toBeInTheDocument(); }); });