feat(patient): implement record number pattern management
- Add RecordNumberSettingsController for managing patient record number patterns. - Create RecordNumberPattern entity to represent the pattern configuration. - Implement RecordNumberPatternRepository for database interactions. - Develop RecordNumberGenerator service for generating and validating record numbers. - Add tests for record number generation, backfilling, and API interactions. - Ensure proper access control for viewing and updating patterns based on user roles.
This commit is contained in:
@@ -11,21 +11,30 @@ vi.mock('../lib/api', () => ({
|
||||
import { api } from '../lib/api';
|
||||
import PatientRecordFormPage from './PatientRecordFormPage';
|
||||
|
||||
/** react-select (SearchableSelect) را با placeholder پیدا و گزینه را با متن انتخاب میکند. */
|
||||
async function pickSelect(placeholder: string, optionLabel: string) {
|
||||
const ph = await screen.findByText(placeholder);
|
||||
const control = ph.closest('div[class*="control"]') as HTMLElement;
|
||||
const input = control.querySelector('input') as HTMLInputElement;
|
||||
/** جنسیت را از SearchableSelect انتخاب میکند (شناسهٔ ورودی، نه placeholder). */
|
||||
async function pickGender(optionLabel: string) {
|
||||
// فلاشِ رندرهای در صف (کوئریِ تنظیمات)؛ رندرِ وسط تعامل، منوی react-select را میبندد.
|
||||
await waitFor(() => expect(document.getElementById('patient-gender-select')).toBeInTheDocument());
|
||||
await new Promise((r) => setTimeout(r, 0));
|
||||
|
||||
const input = document.getElementById('patient-gender-select') as HTMLInputElement;
|
||||
fireEvent.focus(input);
|
||||
fireEvent.keyDown(input, { key: 'ArrowDown' });
|
||||
fireEvent.click(await screen.findByText(optionLabel));
|
||||
}
|
||||
|
||||
const get = api.get as ReturnType<typeof vi.fn>;
|
||||
const post = api.post as ReturnType<typeof vi.fn>;
|
||||
const patch = api.patch as ReturnType<typeof vi.fn>;
|
||||
|
||||
beforeEach(() => {
|
||||
post.mockReset(); patch.mockReset();
|
||||
get.mockReset(); post.mockReset(); patch.mockReset();
|
||||
// صفحه الگوی شمارهٔ پرونده را میخواند؛ بدون mock، ردِ همان کوئری وسط تعامل
|
||||
// یک رندر میآورد و منوی باز react-select را میبندد.
|
||||
get.mockResolvedValue({
|
||||
success: true,
|
||||
data: { enabled: false, pattern: '{YY}-{SEQ:4}', reset_policy: 'none', counter: 0, next_preview: '05-0001', can_edit: true },
|
||||
});
|
||||
post.mockResolvedValue({ success: true, data: { uuid: 'new-1' } });
|
||||
patch.mockResolvedValue({ success: true, data: {} });
|
||||
});
|
||||
@@ -33,10 +42,12 @@ beforeEach(() => {
|
||||
describe('PatientRecordFormPage (تشکیل پرونده)', () => {
|
||||
it('creates a record then patches the demographic fields', async () => {
|
||||
renderWithProviders(<PatientRecordFormPage />, { route: '/admin/patients/new' });
|
||||
// اول تنظیمات الگو برسد؛ رندرِ بعد از پاسخ، منوی باز react-select را میبندد.
|
||||
await waitFor(() => expect(get).toHaveBeenCalled());
|
||||
|
||||
fireEvent.change(screen.getByPlaceholderText('نام و نام خانوادگی را وارد نمایید'), { target: { value: 'بیمار نمونه' } });
|
||||
fireEvent.change(screen.getByPlaceholderText('شماره پرونده'), { target: { value: 'P-1001' } });
|
||||
await pickSelect('انتخاب...', 'زن'); // gender = female
|
||||
await pickGender('زن'); // gender = female
|
||||
fireEvent.change(screen.getByPlaceholderText('کد ملی را وارد نمایید'), { target: { value: '1234567890' } });
|
||||
fireEvent.change(screen.getByPlaceholderText('شماره تماس را وارد نمایید'), { target: { value: '09120000000' } });
|
||||
fireEvent.click(screen.getByRole('button', { name: 'ثبت اطلاعات' }));
|
||||
@@ -49,10 +60,12 @@ describe('PatientRecordFormPage (تشکیل پرونده)', () => {
|
||||
|
||||
it('blocks submit and shows a validation error for a bad national code', async () => {
|
||||
renderWithProviders(<PatientRecordFormPage />, { route: '/admin/patients/new' });
|
||||
// اول تنظیمات الگو برسد؛ رندرِ بعد از پاسخ، منوی باز react-select را میبندد.
|
||||
await waitFor(() => expect(get).toHaveBeenCalled());
|
||||
|
||||
fireEvent.change(screen.getByPlaceholderText('نام و نام خانوادگی را وارد نمایید'), { target: { value: 'ب' } });
|
||||
fireEvent.change(screen.getByPlaceholderText('شماره پرونده'), { target: { value: 'P-1' } });
|
||||
await pickSelect('انتخاب...', 'مرد');
|
||||
await pickGender('مرد');
|
||||
fireEvent.change(screen.getByPlaceholderText('کد ملی را وارد نمایید'), { target: { value: '12' } });
|
||||
fireEvent.change(screen.getByPlaceholderText('شماره تماس را وارد نمایید'), { target: { value: '09120000000' } });
|
||||
fireEvent.click(screen.getByRole('button', { name: 'ثبت اطلاعات' }));
|
||||
|
||||
Reference in New Issue
Block a user