Files
hamed 54bebbd41a feat: Implement resource-based appointment booking flow
- Updated DoctorPage component to accept bookingResources prop for appointment list.
- Added serviceQuery function to serialize service item UUIDs for API requests.
- Introduced new API endpoints for fetching booking resources and resource slots.
- Enhanced tests for new resource-based booking functionality, including resource selection and service availability.
- Created ResourceSelect component for selecting appointment types, including doctor and resource options.
- Updated appointment submission logic to include resource_uuid in payload when applicable.
- Ensured UI reflects changes in booking flow without disrupting existing doctor-centric experience.
2026-08-09 10:45:52 +03:30

71 lines
2.4 KiB
JavaScript

import { describe, it, expect, vi, beforeEach } from 'vitest';
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
vi.mock('@/services/response', () => ({
request: {
postAppointment: vi.fn(() => Promise.resolve({ data: { data: { uuid: 'a1' } } })),
patchUserProfile: vi.fn(() => Promise.resolve({})),
postUserProfile: vi.fn(() => Promise.resolve({})),
},
}));
vi.mock('@/context/ProvinceProvider', () => ({ useProvince: () => ({ cityId: 7 }) }));
vi.mock('js-cookie', () => ({ default: { get: () => undefined, set: vi.fn() } }));
vi.mock('@/lib/tokenStore', () => ({ setAccessToken: vi.fn() }));
vi.mock('../paying/ButtonFixed', () => ({ default: ({ children }) => <div>{children}</div> }));
vi.mock('@/components/icons/ArrowLeftB', () => ({ default: () => null }));
import { request } from '@/services/response';
import SubmitData from './SubmitData';
const VALID = {
uuid: 'p1',
phone: { value: '09120000000' },
national_code: { value: '0012345678' },
name: { value: 'علی' },
family: { value: 'رضایی' },
gender: { value: 'male' },
basic_insurance: { value: { id: 3 } },
};
const props = (over = {}) => ({
setStep: vi.fn(),
data: VALID,
prevData: VALID,
setErrors: vi.fn(),
doctor: { uuid: 'doc-1' },
isForAnother: false,
selectedSlot: { start: 1786339800, end: 1786341000 },
selectedDate: 1786339800,
setAppointmentId: vi.fn(),
setAppointmentExpiresAt: vi.fn(),
selectedServiceUuids: ['s1'],
clinicUuid: null,
...over,
});
const submit = async (over) => {
render(<SubmitData {...props(over)} />);
await userEvent.click(screen.getByText('ثبت اطلاعات'));
return request.postAppointment.mock.calls[0]?.[0];
};
describe('payload ثبت نوبت', () => {
beforeEach(() => vi.clearAllMocks());
it('نوبت با پزشک → بدون resource_uuid', async () => {
const payload = await submit();
expect(payload).toBeDefined();
expect(payload).not.toHaveProperty('resource_uuid');
expect(payload.service_item_uuids).toEqual(['s1']);
});
it('نوبت منبع‌محور → resource_uuid فرستاده می‌شود', async () => {
const payload = await submit({ resourceUuid: 'r1' });
expect(payload.resource_uuid).toBe('r1');
expect(payload.doctor_uuid).toBe('doc-1');
});
});