import { describe, it, expect, vi, beforeEach } from 'vitest'; import { screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { renderWithProviders } from '../test/utils'; vi.mock('sonner', () => ({ toast: { success: vi.fn(), error: vi.fn() } })); const create = { mutate: vi.fn(), isPending: false }; const update = { mutate: vi.fn(), isPending: false }; const remove = { mutate: vi.fn(), isPending: false }; let holidays: Array<{ uuid: string; date: number; jalali_date: string; jalali_year: number; title: string }> = []; vi.mock('../hooks/useNationalHolidays', () => ({ useNationalHolidays: () => ({ holidays, loading: false, create, update, remove }), })); import NationalHolidaysPage from './NationalHolidaysPage'; // ۱۴۰۵-۰۱-۱۳ ⇒ ۲۰۲۶-۰۴-۰۲ const NOWRUZ13 = { uuid: 'h-1', date: Math.floor(new Date(2026, 3, 2).getTime() / 1000), jalali_date: '1405-01-13', jalali_year: 1405, title: 'سیزده‌بدر', }; describe('NationalHolidaysPage', () => { beforeEach(() => { holidays = [NOWRUZ13]; vi.clearAllMocks(); }); it('تعطیلات سال را فهرست می‌کند', () => { renderWithProviders(); expect(screen.getByText('سیزده‌بدر')).toBeInTheDocument(); }); /** تاریخ کلید یکتاست؛ ویرایش فقط عنوان را عوض می‌کند. */ it('ویرایش، تاریخ را قفل و فقط عنوان را می‌فرستد', async () => { const user = userEvent.setup(); renderWithProviders(); await user.click(screen.getByRole('button', { name: 'ویرایش' })); expect(screen.getByText(/تاریخ تغییر نمی‌کند/)).toBeInTheDocument(); const title = screen.getByLabelText('مناسبت'); await user.clear(title); await user.type(title, 'روز طبیعت'); await user.click(screen.getByRole('button', { name: 'ذخیره' })); expect(update.mutate).toHaveBeenCalledWith( { uuid: 'h-1', title: 'روز طبیعت' }, expect.anything(), ); }); it('بدون تاریخ، دکمهٔ ذخیره غیرفعال است', async () => { const user = userEvent.setup(); renderWithProviders(); await user.click(screen.getByRole('button', { name: /افزودن تعطیلی/ })); await user.type(screen.getByLabelText('مناسبت'), 'مناسبت تازه'); expect(screen.getByRole('button', { name: 'ذخیره' })).toBeDisabled(); }); it('حذف، هشدارِ دامنهٔ اثر را می‌دهد', async () => { const user = userEvent.setup(); renderWithProviders(); await user.click(screen.getByRole('button', { name: 'حذف' })); expect(screen.getByText(/از تقویم همهٔ کلینیک‌ها برداشته می‌شود/)).toBeInTheDocument(); }); it('سالِ خالی را صریح می‌گوید', () => { holidays = []; renderWithProviders(); expect(screen.getByText(/تعطیلی رسمی ثبت نشده است/)).toBeInTheDocument(); }); /** سال در URL می‌نشیند تا «بازگشت» و رفرش همان سال را بدهند. */ it('سال را از URL می‌خواند', () => { renderWithProviders(, { route: '/admin/national-holidays?year=1403' }); expect(screen.getByText('سال ۱۴۰۳')).toBeInTheDocument(); }); });