import { render, screen, fireEvent, waitFor } from "@testing-library/react"; import { useGetUnConfirmedReservedAppointmentsCount, useRejectReservedAppointment } from "@/apps/new-ui/services/ReservedAppointment"; import { useGetCustomerProfilePicture } from "@/apps/new-ui/services/Customer"; import { useConfirmReservedAppointment } from "@/apps/new-ui/services/NewTest"; import { showWarningAlert } from "@/apps/new-ui/components/CustomAlert"; import toast from "react-hot-toast"; import AppointmentRequest from "@/apps/new-ui/pages/reserved-appointments/+components/AppointmentRequest"; import { IReservedAppointment } from "@/apps/new-ui/Utils/types"; jest.mock("@/apps/new-ui/pages/CustomerClub/index.css", () => ({})); jest.mock("../src/apps/new-ui/Utils/env.ts", () => ({ ENV: { API_URL: "https://api.test", }, })); // --- Mocks --- jest.mock("@/apps/new-ui/services/ReservedAppointment", () => ({ useGetUnConfirmedReservedAppointmentsCount: jest.fn(), useRejectReservedAppointment: jest.fn(), })); jest.mock("@/apps/new-ui/services/Customer", () => ({ useGetCustomerProfilePicture: jest.fn(), })); jest.mock("@/apps/new-ui/services/NewTest", () => ({ useConfirmReservedAppointment: jest.fn(), })); jest.mock("@/apps/new-ui/components/CustomAlert", () => ({ showWarningAlert: jest.fn(), })); jest.mock("react-hot-toast", () => ({ success: jest.fn(), error: jest.fn(), })); jest.mock("@/apps/new-ui/assets/profilePhoto.svg", () => "mock-avatar"); // کامپوننت فرزند را ساده می‌کنیم تا فقط تست والد را انجام دهیم jest.mock("@/apps/new-ui/pages/reserved-appointments/+components/AppointmentDetail.tsx", () => { return ({ isOpen }: { isOpen: boolean }) => isOpen ?
Detail Modal
: null; }); describe("AppointmentRequest Component", () => { const mockRefetch = jest.fn(); const mockCloseOverlay = jest.fn(); const mockAppointments: IReservedAppointment[] = [ { id: 1, name: "کاربر تست", phone_number: "09120000000", service: "کوتاهی مو", jalali_time: "14:30", jalali_date: "1402/10/01", // اضافه شد creation_time: "2024-01-15T10:00:00Z", // اضافه شد description: "توضیح تست", confrimed: false, }, ]; const mockMutateReject = jest.fn(); const mockRefetchUnconfirmed = jest.fn(); const mockMutateConfirm = jest.fn(); const mockMutateGetProfile = jest.fn(); beforeEach(() => { jest.clearAllMocks(); (useRejectReservedAppointment as jest.Mock).mockReturnValue({ mutate: mockMutateReject }); (useGetUnConfirmedReservedAppointmentsCount as jest.Mock).mockReturnValue({ refetch: mockRefetchUnconfirmed }); (useConfirmReservedAppointment as jest.Mock).mockReturnValue({ mutateAsync: mockMutateConfirm }); (useGetCustomerProfilePicture as jest.Mock).mockReturnValue({ mutateAsync: mockMutateGetProfile.mockResolvedValue({ data: { "09120000000": { customer_type: "VIP", profile_picture: "pic.jpg" } } }), }); }); test("به درستی لیست درخواست‌ها را رندر می‌کند", async () => { render( ); expect(screen.getByText("کاربر تست")).toBeInTheDocument(); expect(screen.getByText("کوتاهی مو")).toBeInTheDocument(); expect(screen.getByText("14:30")).toBeInTheDocument(); expect(screen.getByText("تایید نشده")).toBeInTheDocument(); }); test("با کلیک روی 'باز کردن'، مودال جزئیات باز می‌شود", () => { render( ); const openBtn = screen.getByText("باز کردن"); fireEvent.click(openBtn); expect(mockCloseOverlay).toHaveBeenCalled(); expect(screen.getByTestId("appointment-detail")).toBeInTheDocument(); }); test("عملکرد دکمه تایید نوبت را تست می‌کند", async () => { mockMutateConfirm.mockResolvedValueOnce({}); // شبیه‌سازی موفقیت API render( ); const confirmBtn = screen.getByText("تایید"); fireEvent.click(confirmBtn); expect(mockMutateConfirm).toHaveBeenCalledWith(1); await waitFor(() => { expect(toast.success).toHaveBeenCalledWith(expect.any(String)); expect(mockRefetchUnconfirmed).toHaveBeenCalled(); expect(mockCloseOverlay).toHaveBeenCalled(); }); }); test("عملکرد دکمه رد نوبت و نمایش Alert هشدار را تست می‌کند", () => { render( ); const rejectBtn = screen.getByText("رد"); fireEvent.click(rejectBtn); // بررسی نمایش آلرت expect(showWarningAlert).toHaveBeenCalled(); // شبیه‌سازی کلیک روی تاییدِ آلرت (اجرای کالبک) const callback = (showWarningAlert as jest.Mock).mock.calls[0][1]; callback(); expect(mockMutateReject).toHaveBeenCalledWith(1); }); test("اگر نوبت قبلاً تایید شده باشد، دکمه‌های تایید/رد نمایش داده نمی‌شوند", () => { const confirmedApt = [{ ...mockAppointments[0], confrimed: true }]; render( ); expect(screen.getByText("تایید شده")).toBeInTheDocument(); expect(screen.queryByText("تایید")).not.toBeInTheDocument(); expect(screen.queryByText("رد")).not.toBeInTheDocument(); }); });