- 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.
66 lines
2.9 KiB
TypeScript
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');
|
|
});
|
|
});
|