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; const put = api.put as ReturnType; function mockSettings(overrides: Record = {}) { 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(); 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(); 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(); const btn = await screen.findByText('ذخیره تنظیمات'); expect(btn).toBeDisabled(); }); /** ❌ خطا: کاربری که صاحب مجموعه نیست فقط می‌بیند. */ it('بدون can_edit فرم فقط خواندنی است', async () => { mockSettings({ can_edit: false, enabled: true }); renderWithProviders(); expect(await screen.findByText(/تغییر الگو فقط با حساب صاحب مجموعه/)).toBeInTheDocument(); expect(screen.getByLabelText('الگوی شماره')).toHaveAttribute('readonly'); expect(screen.queryByText('ذخیره تنظیمات')).toBeNull(); }); });