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:
@@ -0,0 +1,76 @@
|
||||
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
||||
import { screen, fireEvent, waitFor } 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 RecordNumberSettingsPage from './RecordNumberSettingsPage';
|
||||
|
||||
const get = api.get as ReturnType<typeof vi.fn>;
|
||||
const put = api.put as ReturnType<typeof vi.fn>;
|
||||
|
||||
function mockSettings(overrides: Record<string, unknown> = {}) {
|
||||
get.mockResolvedValue({
|
||||
success: true,
|
||||
data: {
|
||||
enabled: false, pattern: '{YY}-{SEQ:4}', reset_policy: 'none',
|
||||
counter: 0, next_preview: '05-0001', can_edit: true, ...overrides,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
get.mockReset();
|
||||
put.mockReset();
|
||||
put.mockResolvedValue({ success: true, data: {} });
|
||||
});
|
||||
|
||||
describe('RecordNumberSettingsPage', () => {
|
||||
it('الگو و پیشنمایش سرور را نشان میدهد', async () => {
|
||||
mockSettings({ enabled: true, pattern: 'MD-{YY}-{SEQ:4}', reset_policy: 'yearly', counter: 12, next_preview: 'MD-05-0013' });
|
||||
renderWithProviders(<RecordNumberSettingsPage />);
|
||||
|
||||
expect(await screen.findByDisplayValue('MD-{YY}-{SEQ:4}')).toBeInTheDocument();
|
||||
expect(screen.getByText('MD-05-0013')).toBeInTheDocument();
|
||||
expect(screen.getByText(/12 پرونده را شمارهگذاری کرده/)).toBeInTheDocument();
|
||||
});
|
||||
|
||||
/** ✅ موفق: تغییر الگو و ذخیره با همان سه فیلد. */
|
||||
it('الگوی تغییریافته را ذخیره میکند', async () => {
|
||||
mockSettings();
|
||||
renderWithProviders(<RecordNumberSettingsPage />);
|
||||
|
||||
const input = await screen.findByLabelText('الگوی شماره');
|
||||
fireEvent.change(input, { target: { value: 'P-{SEQ:3}' } });
|
||||
fireEvent.click(screen.getByRole('switch', { name: 'شمارهگذاری خودکار پرونده' }));
|
||||
|
||||
fireEvent.click(screen.getByText('ذخیره تنظیمات'));
|
||||
await waitFor(() => expect(put).toHaveBeenCalled());
|
||||
|
||||
expect(put.mock.calls[0][0]).toBe('/api/v1/patient-record-number-settings');
|
||||
expect(put.mock.calls[0][1]).toEqual({ enabled: true, pattern: 'P-{SEQ:3}', reset_policy: 'none' });
|
||||
});
|
||||
|
||||
/** ⚠️ مرزی: بدون تغییر، دکمهٔ ذخیره غیرفعال است. */
|
||||
it('تا تغییری نباشد دکمهٔ ذخیره غیرفعال است', async () => {
|
||||
mockSettings();
|
||||
renderWithProviders(<RecordNumberSettingsPage />);
|
||||
|
||||
const btn = await screen.findByText('ذخیره تنظیمات');
|
||||
expect(btn).toBeDisabled();
|
||||
});
|
||||
|
||||
/** ❌ خطا: کاربری که صاحب مجموعه نیست فقط میبیند. */
|
||||
it('بدون can_edit فرم فقط خواندنی است', async () => {
|
||||
mockSettings({ can_edit: false, enabled: true });
|
||||
renderWithProviders(<RecordNumberSettingsPage />);
|
||||
|
||||
expect(await screen.findByText(/تغییر الگو فقط با حساب صاحب مجموعه/)).toBeInTheDocument();
|
||||
expect(screen.getByLabelText('الگوی شماره')).toHaveAttribute('readonly');
|
||||
expect(screen.queryByText('ذخیره تنظیمات')).toBeNull();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user