Files
clinicpro/assets/admin/components/ServiceItemFormModal.test.tsx
T
hamed b49abee52f refactor: update pricing input handling to use PriceInput component
- Replaced raw input fields for pricing with PriceInput component across various forms and modals to ensure consistent formatting and accessibility.
- Updated tests to reflect changes in pricing input handling, ensuring values are displayed in toman with proper formatting.
- Enhanced accessibility by adding aria-labels and aria-invalid attributes to PriceInput components.
- Adjusted UI elements to improve layout and user experience, particularly in forms related to service items and scheduling.
- Changed labels from "نمایش در نوبت‌دهی" to "نمایش در نوبت‌دهی آنلاین" for clarity.
2026-08-09 08:38:23 +03:30

66 lines
2.9 KiB
TypeScript

import { describe, it, expect, beforeEach, vi } from 'vitest';
import { screen, within } from '@testing-library/react';
import { renderWithProviders } from '../test/utils';
import ServiceItemFormModal from './ServiceItemFormModal';
import { api } from '../lib/api';
const BOOKABLE_LABEL = 'نمایش در نوبت‌دهی آنلاین';
beforeEach(() => {
vi.spyOn(api, 'get').mockImplementation(async (path: string) => {
if (path.startsWith('/api/v1/staff')) return { data: [] } as never;
if (path.startsWith('/api/v1/inventory-packages')) return { data: [] } as never;
if (path.startsWith('/api/v1/inventory-items')) return { data: { items: [] } } as never;
return { data: [] } as never;
});
});
const renderModal = () =>
renderWithProviders(
<ServiceItemFormModal item="create" sectionUuid="section-1" onClose={() => {}} />,
);
describe('ServiceItemFormModal', () => {
it('سوییچ رزرو آنلاین برچسب صریح دارد', () => {
renderModal();
expect(screen.getByRole('switch', { name: BOOKABLE_LABEL })).toBeInTheDocument();
// برچسب قدیمی مبهم بود: معلوم نبود «نوبت‌دهی» یعنی تقویم داخلی یا رزرو بیمار.
expect(screen.queryByRole('switch', { name: 'نمایش در نوبت‌دهی' })).not.toBeInTheDocument();
});
it('متن راهنما می‌گوید فعال بودنش یعنی چه', () => {
renderModal();
expect(
screen.getByText(/بیمار می‌تواند این سرویس را به‌صورت آنلاین رزرو کند/),
).toBeInTheDocument();
});
it('راهنما نامِ دسترسی‌پذیرِ سوییچ را آلوده نمی‌کند', () => {
renderModal();
// نام باید همان برچسب کوتاه بماند، نه برچسب + یک جملهٔ کامل.
expect(screen.getByRole('switch').getAttribute('aria-label')).toBe(BOOKABLE_LABEL);
});
it('قیمت و زمان متوسط یک ردیف‌اند و پرسنل تمام‌عرض', () => {
renderModal();
// مودال در portal رندر می‌شود، پس جستجو از document است نه container.
const grids = Array.from(document.querySelectorAll('div'))
.filter((el) => (el as HTMLElement).style.gridTemplateColumns === '1fr 1fr');
// تنها ردیفِ دوستونی همان جفتِ عددی است؛ پرسنل با چیپ‌هایش ردیف را می‌شکست.
expect(grids).toHaveLength(1);
expect(within(grids[0] as HTMLElement).getByText('قیمت پایه (تومان) *')).toBeInTheDocument();
expect(within(grids[0] as HTMLElement).getByText('زمان متوسط (دقیقه)')).toBeInTheDocument();
});
it('دکمهٔ انصراف واریانت دارد و نامرئی نیست', () => {
renderModal();
expect(screen.getByRole('button', { name: 'انصراف' })).toHaveClass('secondary');
});
});