- Add NewAppointmentsTable for displaying today's appointments with status chips and formatted time. - Implement TauriCharts for bar and line charts representing patient counts and revenue. - Create TauriDashboardView to combine stat cards, charts, and new appointments list. - Introduce TauriStatCards for displaying key statistics with icons. - Add dashboardIcons for SVG icons used in stat cards. - Implement tests for DashboardPage to ensure correct rendering and API calls. - Create DashboardTodayAppointmentsTest to validate extended fields in today's appointments API response.
96 lines
3.6 KiB
TypeScript
96 lines
3.6 KiB
TypeScript
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<typeof vi.fn>;
|
||
|
||
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(<DashboardPage />, { 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(<DashboardPage />, { route: '/admin/dashboard' });
|
||
await screen.findByText('تعداد کل مراجعین');
|
||
expect(get).toHaveBeenCalledWith(expect.stringContaining('/api/v1/dashboard/clinic'));
|
||
});
|
||
});
|