feat(appointments): add support for doctors without schedules and display relevant notice

This commit is contained in:
hamed
2026-08-04 10:26:36 +03:30
parent 654c1e8303
commit 41b3109478
3 changed files with 145 additions and 16 deletions
+39 -5
View File
@@ -85,6 +85,7 @@ describe('AppointmentsPage — پروفایل کلینیک چندپزشکه', ()
{ uuid: 'r-1', name: 'اتاق ۱', type_name: 'اتاق درمان', supervisor: { uuid: 'd1', name: 'دکتر محمدی' } },
{ uuid: 'r-2', name: 'لیزر CO2', type_name: 'دستگاه لیزر', supervisor: { uuid: 'd1', name: 'دکتر محمدی' } },
{ uuid: 'r-3', name: 'لیزر دکتر رضایی', type_name: 'دستگاه لیزر', supervisor: { uuid: 'd2', name: 'دکتر رضایی' } },
{ uuid: 'r-4', name: 'کندلا ۲۰۲۳', type_name: 'دستگاه لیزر', supervisor: { uuid: 'd3', name: 'دکتر بی‌برنامه' } },
] });
return Promise.resolve({ success: true, data: [] });
});
@@ -122,12 +123,44 @@ describe('AppointmentsPage — پروفایل کلینیک چندپزشکه', ()
expect(calls.some((u: string) => u.includes('doctor_uuid='))).toBe(false);
});
/** پزشکی که در تنظیمات نوبت‌دهی روز کاری تعریف نکرده تب نمی‌گیرد. */
it('پزشک بدون برنامهٔ کاری تب نمی‌گیرد', async () => {
/**
* پزشکِ بدون برنامهٔ هفتگی هم تب می‌گیرد — با برچسب «بدون ساعت کاری» — چون منابعِ
* تحت نظرش تقویم مستقل دارند و پنهان‌کردنِ پزشک، نوبت‌دهی آن منابع را هم می‌بست.
*/
it('پزشک بدون برنامهٔ کاری تب می‌گیرد و برچسب می‌خورد', async () => {
renderWithProviders(<AppointmentsPage />);
expect(await screen.findByText('دکتر محمدی')).toBeInTheDocument();
expect(screen.getByText('دکتر رضایی')).toBeInTheDocument();
expect(screen.queryByText('دکتر بی‌برنامه')).toBeNull();
expect(screen.getByText('دکتر بی‌برنامه')).toBeInTheDocument();
expect(screen.getByText('بدون ساعت کاری')).toBeInTheDocument();
});
it('پزشک بدون برنامهٔ کاری: پیام «ساعت کاری تنظیم نشده است» و منابعِ قابل نوبت‌دهی', async () => {
const user = userEvent.setup();
renderWithProviders(<AppointmentsPage />);
await user.click(await screen.findByRole('button', { name: /دکتر بی‌برنامه/ }));
expect(await screen.findByText('ساعت کاری تنظیم نشده است')).toBeInTheDocument();
// منبعِ همان پزشک هم در نوار تب‌ها و هم در میان‌بُرِ رزرو دیده می‌شود.
expect(screen.getAllByRole('button', { name: 'کندلا ۲۰۲۳' }).length).toBeGreaterThan(0);
expect(screen.getByRole('button', { name: 'ثبت نوبت' })).toBeInTheDocument();
// برای پزشکِ بدون برنامه اسلات درخواست نمی‌شود.
expect(get.mock.calls.some(
(c: any[]) => typeof c[0] === 'string' && c[0].includes('appointment-slots') && c[0].includes('doctor_uuid=d3'),
)).toBe(false);
});
it('منبعِ پزشکِ بدون برنامه، تایم‌لاین تقویم خودش را می‌دهد', async () => {
const user = userEvent.setup();
renderWithProviders(<AppointmentsPage />, { route: '/admin/appointments?resource=r-4' });
await user.click(await screen.findByRole('button', { name: /دکتر بی‌برنامه/ }));
await user.click((await screen.findAllByRole('button', { name: 'کندلا ۲۰۲۳' }))[0]);
expect(await screen.findByText(/نوبت‌ها بر اساس مدت سرویس چیده می‌شوند/)).toBeInTheDocument();
expect(get.mock.calls.some(
(c: any[]) => typeof c[0] === 'string' && c[0].includes('/api/v1/resource/r-4/day-slots'),
)).toBe(true);
});
/**
@@ -175,7 +208,8 @@ describe('AppointmentsPage — پروفایل کلینیک چندپزشکه', ()
expect(await screen.findByText(/نوبت‌ها بر اساس مدت سرویس چیده می‌شوند/)).toBeInTheDocument();
expect(await screen.findByText('افزودن نوبت سریع')).toBeInTheDocument();
expect(screen.getByText(/ساعت کاری/)).toBeInTheDocument();
// «ساعت کاری: …» بازهٔ منبع است؛ برچسبِ تبِ «بدون ساعت کاری» نباید اینجا بیفتد.
expect(screen.getByText(/^ساعت کاری:/)).toBeInTheDocument();
// بازهٔ کاری از تقویم منبع خوانده می‌شود، نه از اسلات‌های پزشک.
const askedResourceDay = get.mock.calls.some(
(c: any[]) => typeof c[0] === 'string' && c[0].includes('/api/v1/resource/r-2/day-slots'),