import { describe, it, expect, beforeEach, vi } from 'vitest'; import { screen, waitFor } from '@testing-library/react'; import { Routes, Route } from 'react-router-dom'; 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 AppointmentDetailPage from './AppointmentDetailPage'; const get = api.get as ReturnType; // 2024-06-01 12:00 محلی const slotStart = Math.floor(new Date('2024-06-01T12:00:00').getTime() / 1000); beforeEach(() => { get.mockReset(); // mock باید به URL حساس باشد: /events یک لیست برمی‌گرداند نه آبجکت نوبت get.mockImplementation((url: string) => Promise.resolve( String(url).endsWith('/events') ? { success: true, data: [] } : { success: true, data: { uuid: 'ap1', patient_name: 'ساغر', patient_mobile: '09120000000', slot_start: slotStart, slot_end: slotStart + 1800, status: 'confirmed', version: 1, created_at: slotStart, }, }, ), ); }); describe('AppointmentDetailPage — بازگشت به همان روز', () => { it('the «نوبت‌ها» breadcrumb points back to the appointment day', async () => { renderWithProviders( } /> , { route: '/admin/appointments/ap1' }, ); // پس از بارگذاری نوبت، لینک «نوبت‌ها» باید به روزِ نوبت اشاره کند await waitFor(() => { const link = screen.getByText('نوبت‌ها').closest('a'); expect(link?.getAttribute('href')).toContain('date=2024-06-01'); }); }); });