diff --git a/assets/admin/components/ui/SearchableSelect.test.tsx b/assets/admin/components/ui/SearchableSelect.test.tsx new file mode 100644 index 00000000..8b6b27e4 --- /dev/null +++ b/assets/admin/components/ui/SearchableSelect.test.tsx @@ -0,0 +1,33 @@ +import { describe, it, expect, vi } from 'vitest'; +import { render, screen } 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(); + }); +}); diff --git a/assets/admin/components/ui/SearchableSelect.tsx b/assets/admin/components/ui/SearchableSelect.tsx index c2fe09ec..0b77dd41 100644 --- a/assets/admin/components/ui/SearchableSelect.tsx +++ b/assets/admin/components/ui/SearchableSelect.tsx @@ -34,8 +34,12 @@ export default function SearchableSelect({ }: Props) { const darkMode = useUiStore((s) => s.darkMode); + // مقایسهٔ نرم (string↔number): مقدار پیش‌فرض ممکن است number باشد ولی value گزینه String + // (مثلاً id بیمه). تطبیق سخت‌گیرانه در این حالت گزینه را خالی نشان می‌داد. const selected = useMemo( - () => options.find((o) => o.value === value) ?? null, + () => (value == null || value === '' + ? null + : options.find((o) => String(o.value) === String(value)) ?? null), [options, value], );