Files
clinicpro/assets/admin/pages/RecordNumberSettingsPage.test.tsx
T
hamed 85a27812c7 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.
2026-08-04 12:30:17 +03:30

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();
});
});