import { describe, it, expect, vi, beforeEach } from 'vitest'; import { screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; 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 {}, })); vi.mock('sonner', () => ({ toast: { success: vi.fn(), error: vi.fn() } })); import { api } from '../../lib/api'; import ResourceFormModal from './ResourceFormModal'; const get = api.get as ReturnType; const resource = { uuid: 'r-1', name: 'لیزر ۱', address_uuid: 'b-1', type_uuid: 't-1', capacity: 1, is_active: true, attributes: {}, }; const props = { open: true, resource: resource as never, addresses: [{ uuid: 'b-1', name: 'محل نوبت‌دهی' }] as never, types: [{ uuid: 't-1', name: 'دستگاه', code: 'device' }] as never, saving: false, onClose: () => {}, onSave: () => {}, }; describe('ResourceFormModal — هشدار غیرفعال‌سازی', () => { beforeEach(() => vi.clearAllMocks()); /** ⭐ غیرفعال‌کردن نوبت‌ها را لغو نمی‌کند؛ اپراتور باید بداند چند بیمار درگیرند. */ it('warns with the upcoming count only once the resource is switched off', async () => { get.mockResolvedValue({ data: { ...resource, upcoming_appointments: 4 } }); const user = userEvent.setup(); renderWithProviders(); await waitFor(() => expect(get).toHaveBeenCalledWith('/api/v1/resource/r-1')); expect(screen.queryByText(/نوبت آیندهٔ فعال دارد/)).toBeNull(); await user.click(screen.getByLabelText('منبع فعال است')); expect(await screen.findByText(/۴ نوبت آیندهٔ فعال دارد/)).toBeInTheDocument(); }); it('stays quiet when nothing is booked on the resource', async () => { get.mockResolvedValue({ data: { ...resource, upcoming_appointments: 0 } }); const user = userEvent.setup(); renderWithProviders(); await waitFor(() => expect(get).toHaveBeenCalled()); await user.click(screen.getByLabelText('منبع فعال است')); expect(screen.queryByText(/نوبت آیندهٔ فعال دارد/)).toBeNull(); }); });