- 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.
77 lines
3.2 KiB
TypeScript
77 lines
3.2 KiB
TypeScript
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();
|
|
});
|
|
});
|