import { render, screen, fireEvent } from "@testing-library/react";
// --------------------------------------------------------------------
// MOCKS
// --------------------------------------------------------------------
// Router mock
jest.mock("react-router-dom", () => ({
Link: ({ children, ...rest }: any) => {children},
}));
// BeatLoader mock
jest.mock("react-spinners", () => ({
BeatLoader: () =>
,
}));
// GuidedOverlay mock
jest.mock("@/apps/new-ui/components/GuidedOverlay/GuidedOverlay", () => () => (
));
// Calendar mock
jest.mock(
"@/apps/new-ui/pages/AdvancedTurn/+components/Calendar/MobileCalendarSingleMonth.tsx",
() =>
({ onSelect }: any) => (
),
);
// WorkHour mock
jest.mock(
"@/apps/new-ui/pages/CreateTimeTable/+components/WorkHour.tsx",
() => (props: any) => (
),
);
// Toggle mock
jest.mock(
"@/apps/new-ui/pages/CreateTimeTable/+components/DraggableToggleButton.tsx",
() => (props: any) => (
),
);
// API mocks
jest.mock("@/apps/new-ui/services/User", () => ({
useGetUserInfo: jest.fn(),
}));
jest.mock("@/apps/new-ui/services/NewTest", () => ({
useGetMonthScheduleForPublic: jest.fn(),
}));
import { useGetUserInfo } from "@/apps/new-ui/services/User";
import { useGetMonthScheduleForPublic } from "@/apps/new-ui/services/NewTest";
import HolidayManagement from "@/apps/new-ui/pages/CreateTimeTable/+components/HolidayManagement";
// --------------------------------------------------------------------
// UTIL: prepare mock API data
// --------------------------------------------------------------------
const mockUserInfoWithService = {
current_user: {
services: [{ id: 1, title: "سرویس تست" }],
},
};
const mockUserInfoNoService = {
current_user: {
services: [],
},
};
const mockMonthData = {
days: [],
holidays: [],
iran_holidays: [],
year: 1403,
month: 10,
};
// --------------------------------------------------------------------
// TESTS
// --------------------------------------------------------------------
describe("HolidayManagement Component", () => {
beforeEach(() => {
localStorage.clear();
jest.clearAllMocks();
});
test("renders Lottie section when user has no services", () => {
(useGetUserInfo as jest.Mock).mockReturnValue({
data: mockUserInfoNoService,
});
(useGetMonthScheduleForPublic as jest.Mock).mockReturnValue({
data: mockMonthData,
refetch: jest.fn(),
});
render();
expect(screen.getByTestId("loader")).toBeInTheDocument();
expect(screen.getByText("ثبت خدمات جدید")).toBeInTheDocument();
});
test("renders calendar and WorkHour when user HAS services", () => {
(useGetUserInfo as jest.Mock).mockReturnValue({
data: mockUserInfoWithService,
});
(useGetMonthScheduleForPublic as jest.Mock).mockReturnValue({
data: mockMonthData,
refetch: jest.fn(),
});
render();
expect(screen.getByTestId("calendar-btn")).toBeInTheDocument();
expect(screen.getByTestId("workhour")).toBeInTheDocument();
});
test("date select updates selected day (handleDateSelect)", () => {
// 1. جلوگیری از override شدن مقدار توسط HolidayManagement
localStorage.setItem("appointmentDateGregorian", "2024-01-02");
(useGetUserInfo as jest.Mock).mockReturnValue({
data: mockUserInfoWithService,
});
(useGetMonthScheduleForPublic as jest.Mock).mockReturnValue({
data: mockMonthData,
refetch: jest.fn(),
});
render();
// 2. شبیهسازی انتخاب تاریخ
fireEvent.click(screen.getByTestId("calendar-btn"));
// 3. بررسی مقدار ذخیره شده
const isoSaved = localStorage.getItem("appointmentDateGregorian");
expect(isoSaved).toContain("2024-01-02");
});
test("toggle holiday works", () => {
(useGetUserInfo as jest.Mock).mockReturnValue({
data: mockUserInfoWithService,
});
(useGetMonthScheduleForPublic as jest.Mock).mockReturnValue({
data: mockMonthData,
refetch: jest.fn(),
});
render();
const toggle = screen.getByTestId("toggle");
fireEvent.click(toggle);
expect(toggle).toBeInTheDocument(); // simply ensures it triggered
});
test("WorkHour receives selected multiple dates", () => {
localStorage.setItem(
"appointmentDateGregorianMulti",
JSON.stringify(["1403/10/05"]),
);
(useGetUserInfo as jest.Mock).mockReturnValue({
data: mockUserInfoWithService,
});
(useGetMonthScheduleForPublic as jest.Mock).mockReturnValue({
data: mockMonthData,
refetch: jest.fn(),
});
render();
const wh = screen.getByTestId("workhour");
const props = JSON.parse(wh.getAttribute("data-props") || "{}");
expect(props.days).toEqual(["1403/10/05"]);
});
});