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 { useAuthStore } from '../stores/authStore'; import AppointmentCreatePage from './AppointmentCreatePage'; const get = api.get as ReturnType; const post = api.post as ReturnType; beforeEach(() => { get.mockReset(); post.mockReset(); useAuthStore.setState({ primaryRole: 'doctor', dbUuid: 'doc1' } as any); get.mockResolvedValue({ success: true, data: [] }); post.mockResolvedValue({ success: true, data: { uuid: 'new1' } }); }); describe('AppointmentCreatePage — افزودن نوبت', () => { it('posts a new appointment with the entered patient (happy path)', async () => { renderWithProviders(, { route: '/admin/appointments/new' }); fireEvent.change(screen.getByPlaceholderText('نام و نام خانوادگی مراجعه کننده'), { target: { value: 'علی محمدی' } }); fireEvent.change(screen.getByPlaceholderText('شماره تماس مراجعه کننده'), { target: { value: '09121234567' } }); fireEvent.click(screen.getByText('ثبت اطلاعات')); await waitFor(() => expect(post).toHaveBeenCalled()); const [url, body] = post.mock.calls[0]; expect(url).toBe('/api/v1/my/appointment'); expect(body).toMatchObject({ doctor_uuid: 'doc1', patient_name: 'علی محمدی', patient_mobile: '09121234567' }); }); it('keeps the submit button disabled until a valid patient is entered (boundary)', () => { renderWithProviders(, { route: '/admin/appointments/new' }); const btn = screen.getByText('ثبت اطلاعات') as HTMLButtonElement; expect(btn).toBeDisabled(); // شماره ناقص → همچنان غیرفعال fireEvent.change(screen.getByPlaceholderText('نام و نام خانوادگی مراجعه کننده'), { target: { value: 'ب' } }); fireEvent.change(screen.getByPlaceholderText('شماره تماس مراجعه کننده'), { target: { value: '0912' } }); expect(btn).toBeDisabled(); }); });