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();
});
});