import { describe, it, expect, vi, beforeEach } from 'vitest'; import { render, screen } from '@testing-library/react'; // جریان نوبت به کوکی، تم، تقویم و لایه‌ی API وابسته است؛ اینجا فقط تصمیمِ // «کدام مرحله رندر می‌شود» سنجیده می‌شود، پس بقیه mock می‌شوند. vi.mock('@/components/layout', () => ({ default: ({ children }) =>
{children}
})); vi.mock('./Content', () => ({ default: ({ children }) =>
{children}
})); vi.mock('./date', () => ({ default: () =>
مرحله-روز
})); vi.mock('@/components/appointment/paying', () => ({ default: () => null })); vi.mock('@/components/appointment/detail', () => ({ default: () => null })); vi.mock('@/components/appointment/failedPay', () => ({ default: () => null })); vi.mock('@/components/appointment/successPay', () => ({ default: () => null })); vi.mock('@/components/register/LogInPage', () => ({ default: () => null })); vi.mock('@/components/register/verificationPage', () => ({ default: () => null })); vi.mock('@/components/register/LayoutRegister', () => ({ default: ({ children }) =>
{children}
})); import Container from './Container'; const RESOURCE = { uuid: 'r1', name: 'کندلا2021', type: { name: 'دستگاه لیزر' }, services: [{ uuid: 's1', name: 'لیزر دست', duration_minutes: 20 }], }; const LOCATION = { clinic_uuid: null, title: 'مطب شخصی', booking_mode: 'slot', services: [] }; const props = (over = {}) => ({ step: 0, data: {}, doctor: { uuid: 'd1' }, setData: vi.fn(), setStep: vi.fn(), prevData: {}, matchedCity: {}, isForAnother: false, setIsForAnother: vi.fn(), disabledDates: [], setNum: vi.fn(), setUuid: vi.fn(), setIsSendMsg: vi.fn(), setSelectedSlot: vi.fn(), setSelectedDate: vi.fn(), setAppointmentId: vi.fn(), setAppointmentExpiresAt: vi.fn(), bookingMode: 'slot', bookingServices: [], selectedServiceUuids: [], setSelectedServiceUuids: vi.fn(), bookingLocations: [LOCATION], selectedLocation: LOCATION, locationConfirmed: true, changeLocation: vi.fn(), reopenLocationChoice: vi.fn(), onDateChange: vi.fn(), selectedClosedOnDate: false, resources: [], selectedResource: null, resourceStepNeeded: false, changeResource: vi.fn(), reopenResourceChoice: vi.fn(), ...over, }); describe('مرحلهٔ انتخاب نوع نوبت در جریان رزرو', () => { beforeEach(() => vi.clearAllMocks()); it('پزشکِ بدون منبع → هیچ تغییری؛ مستقیم مرحلهٔ روز', () => { render(); expect(screen.getByText('مرحله-روز')).toBeInTheDocument(); expect(screen.queryByText('انتخاب نوع نوبت')).not.toBeInTheDocument(); }); it('منبع هست و هنوز انتخاب نشده → مرحلهٔ نوع نوبت', () => { render(); expect(screen.getByText('۱. انتخاب نوع نوبت')).toBeInTheDocument(); expect(screen.getByText('کندلا2021')).toBeInTheDocument(); expect(screen.queryByText('مرحله-روز')).not.toBeInTheDocument(); }); it('محلِ تأییدنشده مقدم بر مرحلهٔ منبع است', () => { render( ); expect(screen.getByText('۱. انتخاب محل نوبت‌دهی')).toBeInTheDocument(); expect(screen.queryByText('۱. انتخاب نوع نوبت')).not.toBeInTheDocument(); }); it('پزشکِ بدون برنامهٔ هفتگی ولی دارای منبع → مرحلهٔ منبع، نه پیام «فعال نیست»', () => { render( ); expect(screen.getByText('۱. انتخاب نوع نوبت')).toBeInTheDocument(); expect(screen.getByText('کندلا2021')).toBeInTheDocument(); expect( screen.queryByText('نوبت‌دهی آنلاین برای این پزشک فعال نیست.') ).not.toBeInTheDocument(); // ویزیت مستقیم وجود ندارد، پس کارتش هم نباید باشد. expect(screen.queryByText('نوبت با پزشک')).not.toBeInTheDocument(); }); it('نه محل و نه منبع → همان پیام «فعال نیست»', () => { render(); expect(screen.getByText('نوبت‌دهی آنلاین برای این پزشک فعال نیست.')).toBeInTheDocument(); }); it('بعد از انتخاب منبع، مرحلهٔ سرویس با سرویس‌های همان منبع می‌آید', () => { render( ); expect(screen.getByText('۱. انتخاب سرویس')).toBeInTheDocument(); expect(screen.getByText('لیزر دست')).toBeInTheDocument(); }); });