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( {}} />, ); 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'); }); });