import { describe, it, expect, beforeEach, vi } from 'vitest'; import { screen, fireEvent, waitFor } from '@testing-library/react'; import { renderWithProviders } from '../test/utils'; vi.mock('../lib/api', () => ({ api: { get: vi.fn(), post: vi.fn(), patch: vi.fn(), put: vi.fn(), delete: vi.fn() }, ApiError: class extends Error {}, })); import { api } from '../lib/api'; import FreeVisitPrice from './FreeVisitPrice'; const get = api.get as ReturnType; const put = api.put as ReturnType; const pricing = (priceRials: number, require: boolean) => ({ success: true, data: { free_visit_price_rials: priceRials, require_visit_price: require }, }); beforeEach(() => { get.mockReset(); put.mockReset(); put.mockResolvedValue({ success: true }); }); describe('FreeVisitPrice — الزامی کردن هزینه ویزیت', () => { it('toggle فعال + قیمت صفر → خطای inline و عدم ارسال درخواست', async () => { get.mockResolvedValue(pricing(0, false)); renderWithProviders(); await waitFor(() => expect(screen.getByRole('textbox')).toHaveValue('0')); fireEvent.click(screen.getByRole('switch', { name: 'الزامی کردن هزینه ویزیت' })); fireEvent.click(screen.getByText('ذخیره')); expect(await screen.findByText('با فعال بودن «الزامی کردن هزینه ویزیت»، قیمت ویزیت آزاد الزامی است')).toBeInTheDocument(); expect(put).not.toHaveBeenCalled(); }); it('toggle فعال + قیمت معتبر → PUT با هر دو کلید (تومان → ریال)', async () => { get.mockResolvedValue(pricing(0, false)); renderWithProviders(); await waitFor(() => expect(screen.getByRole('textbox')).toHaveValue('0')); fireEvent.click(screen.getByRole('switch', { name: 'الزامی کردن هزینه ویزیت' })); fireEvent.change(screen.getByRole('textbox'), { target: { value: '50000' } }); fireEvent.click(screen.getByText('ذخیره')); await waitFor(() => expect(put).toHaveBeenCalledWith('/api/v1/insurance-pricing', { free_visit_price_rials: 500_000, require_visit_price: true, })); }); it('toggle غیرفعال + قیمت صفر → رفتار قبلی حفظ می‌شود (ارسال مجاز)', async () => { get.mockResolvedValue(pricing(0, false)); renderWithProviders(); await waitFor(() => expect(screen.getByRole('textbox')).toHaveValue('0')); fireEvent.click(screen.getByText('ذخیره')); await waitFor(() => expect(put).toHaveBeenCalledWith('/api/v1/insurance-pricing', { free_visit_price_rials: 0, require_visit_price: false, })); }); it('فلگ ذخیره‌شده true → سوییچ روشن و ستاره روی label قیمت', async () => { get.mockResolvedValue(pricing(500_000, true)); renderWithProviders(); await waitFor(() => expect(screen.getByRole('switch', { name: 'الزامی کردن هزینه ویزیت' })).toBeChecked()); expect(screen.getByText('قیمت (تومان)').querySelector('span')?.textContent).toContain('*'); expect(screen.getByRole('textbox')).toHaveValue('50000'); }); });