- 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.
88 lines
4.3 KiB
TypeScript
88 lines
4.3 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 FreeVisitPrice from './FreeVisitPrice';
|
|
|
|
const get = api.get as ReturnType<typeof vi.fn>;
|
|
const put = api.put as ReturnType<typeof vi.fn>;
|
|
|
|
const pricing = (priceRials: number, require: boolean) => ({
|
|
success: true,
|
|
data: { free_visit_price_rials: priceRials, require_visit_price: require },
|
|
});
|
|
|
|
beforeEach(() => {
|
|
get.mockReset();
|
|
put.mockReset();
|
|
put.mockResolvedValue({ success: true });
|
|
});
|
|
|
|
describe('FreeVisitPrice — الزامی کردن هزینه ویزیت', () => {
|
|
it('toggle فعال + قیمت صفر → خطای inline و عدم ارسال درخواست', async () => {
|
|
get.mockResolvedValue(pricing(0, false));
|
|
renderWithProviders(<FreeVisitPrice />);
|
|
// PriceInput صفر را خالی نشان میدهد، پس خالیبودن فیلد نشانهٔ «داده رسید» نیست؛
|
|
// انتظار روی خودِ فراخوانی بسته میشود تا کلیک قبل از بارگذاری نیفتد.
|
|
await waitFor(() => expect(get).toHaveBeenCalled());
|
|
await waitFor(() => expect(screen.getByRole('textbox')).toHaveValue(''));
|
|
|
|
fireEvent.click(screen.getByRole('switch', { name: 'الزامی کردن هزینه ویزیت' }));
|
|
fireEvent.click(screen.getByText('ذخیره'));
|
|
|
|
expect(await screen.findByText('با فعال بودن «الزامی کردن هزینه ویزیت»، قیمت ویزیت آزاد الزامی است')).toBeInTheDocument();
|
|
expect(put).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it('toggle فعال + قیمت معتبر → PUT با هر دو کلید (تومان → ریال)', async () => {
|
|
get.mockResolvedValue(pricing(0, false));
|
|
renderWithProviders(<FreeVisitPrice />);
|
|
// PriceInput صفر را خالی نشان میدهد، پس خالیبودن فیلد نشانهٔ «داده رسید» نیست؛
|
|
// انتظار روی خودِ فراخوانی بسته میشود تا کلیک قبل از بارگذاری نیفتد.
|
|
await waitFor(() => expect(get).toHaveBeenCalled());
|
|
await waitFor(() => expect(screen.getByRole('textbox')).toHaveValue(''));
|
|
|
|
fireEvent.click(screen.getByRole('switch', { name: 'الزامی کردن هزینه ویزیت' }));
|
|
fireEvent.change(screen.getByRole('textbox'), { target: { value: '50000' } });
|
|
fireEvent.click(screen.getByText('ذخیره'));
|
|
|
|
await waitFor(() => expect(put).toHaveBeenCalledWith('/api/v1/insurance-pricing', {
|
|
free_visit_price_rials: 500_000,
|
|
require_visit_price: true,
|
|
}));
|
|
});
|
|
|
|
it('toggle غیرفعال + قیمت صفر → رفتار قبلی حفظ میشود (ارسال مجاز)', async () => {
|
|
get.mockResolvedValue(pricing(0, false));
|
|
renderWithProviders(<FreeVisitPrice />);
|
|
// PriceInput صفر را خالی نشان میدهد، پس خالیبودن فیلد نشانهٔ «داده رسید» نیست؛
|
|
// انتظار روی خودِ فراخوانی بسته میشود تا کلیک قبل از بارگذاری نیفتد.
|
|
await waitFor(() => expect(get).toHaveBeenCalled());
|
|
await waitFor(() => expect(screen.getByRole('textbox')).toHaveValue(''));
|
|
|
|
fireEvent.click(screen.getByText('ذخیره'));
|
|
|
|
await waitFor(() => expect(put).toHaveBeenCalledWith('/api/v1/insurance-pricing', {
|
|
free_visit_price_rials: 0,
|
|
require_visit_price: false,
|
|
}));
|
|
});
|
|
|
|
it('فلگ ذخیرهشده true → سوییچ روشن و ستاره روی label قیمت', async () => {
|
|
get.mockResolvedValue(pricing(500_000, true));
|
|
renderWithProviders(<FreeVisitPrice />);
|
|
|
|
await waitFor(() => expect(screen.getByRole('switch', { name: 'الزامی کردن هزینه ویزیت' })).toBeChecked());
|
|
expect(screen.getByText('قیمت (تومان)').querySelector('span')?.textContent).toContain('*');
|
|
await waitFor(() => expect(screen.getByRole('textbox')).toHaveValue(
|
|
new Intl.NumberFormat('fa-IR').format(50_000),
|
|
));
|
|
});
|
|
});
|