import { describe, it, expect, beforeEach, vi } from 'vitest'; import { screen } 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 DashboardPage from './DashboardPage'; const get = api.get as ReturnType; const clinicPayload = { success: true, data: { clinic: { uuid: 'clinic-1', name: 'کلینیک نمونه', is_active: true, logo: null }, stats: { total_doctors: 2, today_appointments: 15, this_month_appointments: 40, pending_invitations: 0, total_patients: 151, revenue_period_rials: 5_600_002_000, today_payments_rials: 5_225_000, week_payments_rials: 12_000_000, }, charts: { revenue_by_day: [ { label: '۷ خرداد', amount_rials: 60_000 }, { label: '۸ خرداد', amount_rials: 160_000 }, { label: '۹ خرداد', amount_rials: 90_000 }, ], appointments_by_day: [ { label: '۷ خرداد', count: 15 }, { label: '۸ خرداد', count: 40 }, { label: '۹ خرداد', count: 48 }, ], }, today_appointments: [ { uuid: 'appt-1', patient_name: 'دنیا خلیلی', patient_mobile: '09136549874', doctor_name: 'حمیدی', service_name: 'ویزیت عمومی', slot_start: 1_718_000_000, slot_end: 1_718_001_800, status: 'visited', }, ], doctors: [], period: { from: 0, to: 0 }, }, }; describe('DashboardPage (ported clinic dashboard)', () => { beforeEach(() => { get.mockReset(); useAuthStore.setState({ primaryRole: 'clinic', dbUuid: 'clinic-1', context: null } as never); get.mockImplementation((url: string) => { if (url.startsWith('/api/v1/dashboard/clinic')) return Promise.resolve(clinicPayload); return Promise.resolve({ success: true, data: [] }); }); }); it('renders the ported stat cards, charts and new-appointments list', async () => { renderWithProviders(, { route: '/admin/dashboard' }); // stat card labels (ported 1:1) expect(await screen.findByText('تعداد کل مراجعین')).toBeInTheDocument(); expect(screen.getByText('کل پرداختی‌ها')).toBeInTheDocument(); expect(screen.getByText('پرداختی‌های امروز')).toBeInTheDocument(); expect(screen.getByText('تعداد نوبت‌های امروز')).toBeInTheDocument(); // chart titles expect(screen.getByText('نمودار تعداد بیماران')).toBeInTheDocument(); expect(screen.getByText('میزان درآمد')).toBeInTheDocument(); // new-appointments list + row data (mobile/service columns come from the extended API) expect(screen.getByText('لیست نوبت‌های جدید')).toBeInTheDocument(); expect(screen.getByText('دنیا خلیلی')).toBeInTheDocument(); expect(screen.getByText('09136549874')).toBeInTheDocument(); expect(screen.getByText('ویزیت عمومی')).toBeInTheDocument(); expect(screen.getByText('ویزیت شده')).toBeInTheDocument(); }); it('calls the real clinic dashboard endpoint', async () => { renderWithProviders(, { route: '/admin/dashboard' }); await screen.findByText('تعداد کل مراجعین'); expect(get).toHaveBeenCalledWith(expect.stringContaining('/api/v1/dashboard/clinic')); }); });