import { useState } from 'react'; import { describe, it, expect, vi } from 'vitest'; import { screen, fireEvent } from '@testing-library/react'; import { renderWithProviders } from '../test/utils'; import FieldSchemaEditor from './FieldSchemaEditor'; import type { TreatmentFormField } from '../types'; const selectField = (options?: TreatmentFormField['options']): TreatmentFormField => ({ key: 'spot', label: 'اسپات', type: 'select', required: false, sort_order: 0, options, }); /** والدِ کنترل‌شده — همان قراردادی که مودال نوع منبع دارد. */ function Harness({ initial, onEmit }: { initial: TreatmentFormField[]; onEmit?: (fields: TreatmentFormField[]) => void; }) { const [value, setValue] = useState(initial); return ( { setValue(next); onEmit?.(next); }} /> ); } const optionsInput = () => screen.getByPlaceholderText('7, 8, 9, 10, 12, 14, 16, 18') as HTMLInputElement; describe('FieldSchemaEditor — ورودی گزینه‌های فیلد select', () => { it('کاما در فیلد باقی می‌ماند و پاک نمی‌شود', () => { renderWithProviders(); fireEvent.change(optionsInput(), { target: { value: '7,' } }); expect(optionsInput().value).toBe('7,'); }); it('فاصلهٔ بعد از کاما حفظ می‌شود و گزینهٔ بعدی تایپ‌شدنی است', () => { const onEmit = vi.fn(); renderWithProviders(); fireEvent.change(optionsInput(), { target: { value: '7, ' } }); expect(optionsInput().value).toBe('7, '); fireEvent.change(optionsInput(), { target: { value: '7, 8' } }); expect(optionsInput().value).toBe('7, 8'); expect(onEmit).toHaveBeenLastCalledWith([expect.objectContaining({ options: ['7', '8'] })]); }); it('کامای فارسی هم جداکننده است', () => { const onEmit = vi.fn(); renderWithProviders(); fireEvent.change(optionsInput(), { target: { value: 'کم، زیاد' } }); expect(onEmit).toHaveBeenLastCalledWith([expect.objectContaining({ options: ['کم', 'زیاد'] })]); }); it('مقدار اولیه از آرایه ساخته می‌شود', () => { renderWithProviders(); expect(optionsInput().value).toBe('7, 8, 9'); }); it('گزینهٔ خالی به بک‌اند فرستاده نمی‌شود', () => { const onEmit = vi.fn(); renderWithProviders(); fireEvent.change(optionsInput(), { target: { value: '7,, ,8,' } }); expect(onEmit).toHaveBeenLastCalledWith([expect.objectContaining({ options: ['7', '8'] })]); }); });