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 InsuranceServiceCategoriesCard from './InsuranceServiceCategoriesCard'; const get = api.get as ReturnType; const put = api.put as ReturnType; function mockCategories(enabled: Record) { get.mockResolvedValue({ success: true, data: { service_categories: [ { key: 'outpatient', label: 'خدمات سرپایی', enabled: enabled.outpatient }, { key: 'inpatient', label: 'خدمات بستری', enabled: enabled.inpatient }, ], }, }); } beforeEach(() => { get.mockReset(); put.mockReset(); put.mockResolvedValue({ success: true, data: {} }); }); describe('InsuranceServiceCategoriesCard', () => { it('سوییچ هر نوع خدمت را با وضعیت سرور نشان می‌دهد', async () => { mockCategories({ outpatient: true, inpatient: false }); renderWithProviders(); expect(await screen.findByText('نوع خدمات بیمه')).toBeInTheDocument(); expect(screen.getByLabelText('خدمات سرپایی')).toBeChecked(); expect(screen.getByLabelText('خدمات بستری')).not.toBeChecked(); }); it('تغییر سوییچ فقط همان نوع را PUT می‌کند', async () => { mockCategories({ outpatient: true, inpatient: true }); renderWithProviders(); await screen.findByText('نوع خدمات بیمه'); fireEvent.click(screen.getByLabelText('خدمات بستری')); await waitFor(() => expect(put).toHaveBeenCalledWith('/api/v1/insurance-pricing', { service_categories: [ { key: 'outpatient', enabled: true }, { key: 'inpatient', enabled: false }, ], })); }); it('غیرفعال‌کردن آخرین نوع فعال ارسال نمی‌شود', async () => { mockCategories({ outpatient: true, inpatient: false }); renderWithProviders(); await screen.findByText('نوع خدمات بیمه'); fireEvent.click(screen.getByLabelText('خدمات سرپایی')); expect(put).not.toHaveBeenCalled(); expect(screen.getByLabelText('خدمات سرپایی')).toBeChecked(); }); });