/** * @file ServicesQA.test.tsx * Full stable test suite for ServicesQA component */ import { render, screen, fireEvent, act } from "@testing-library/react"; import "@testing-library/jest-dom"; import ServicesQA from "@/apps/new-ui/components/AppointmentComponents/ServicesQA"; // ---------- MOCKS ---------- // Swiper mock jest.mock("swiper/react", () => ({ Swiper: ({ children }: any) =>
{children}
, SwiperSlide: ({ children }: any) =>
{children}
, })); jest.mock("swiper/modules", () => ({ Navigation: {} })); // useGetUserInfo mock jest.mock("@/apps/new-ui/services/User", () => ({ useGetUserInfo: () => ({ data: { current_user: { services: [ { name: "ماساژ", emoji: "💆", price: 200 }, { name: "مانیکور", emoji: "💅", price: 150 }, { name: "اصلاح", emoji: "✂️", price: 120 }, ], }, }, }), })); // react-router jest.mock("react-router-dom", () => ({ ...jest.requireActual("react-router-dom"), useLocation: () => ({ pathname: "/dashboard" }), })); // AddService mock jest.mock("@/apps/new-ui/pages/AddService/AddService", () => { return function MockAddService({ onclick }: any) { return (
); }; }); // localStorage mock beforeEach(() => { Storage.prototype.getItem = jest.fn(() => null); Storage.prototype.setItem = jest.fn(); Storage.prototype.removeItem = jest.fn(); }); afterEach(() => { jest.clearAllMocks(); }); // ------------------------------------------------------ // TESTS // ------------------------------------------------------ test("renders services from API (useGetUserInfo)", () => { render(); expect(screen.getByText("ماساژ")).toBeInTheDocument(); expect(screen.getByText("مانیکور")).toBeInTheDocument(); expect(screen.getByText("اصلاح")).toBeInTheDocument(); }); test("selects a service and persists serviceTitle + price", async () => { const onChange = jest.fn(); render(); const manicure = screen.getByText("مانیکور"); await act(async () => { fireEvent.click(manicure); }); expect(localStorage.setItem).toHaveBeenCalledWith("serviceTitle", "مانیکور"); expect(localStorage.setItem).toHaveBeenCalledWith("servicePrice", "150"); expect(onChange).toHaveBeenCalledWith("مانیکور"); }); test("opens AddService modal when no services available", async () => { jest.mocked(Storage.prototype.getItem).mockReturnValue(null); render(); const addBtn = screen.getByText("افزودن خدمات"); await act(async () => { fireEvent.click(addBtn); }); expect(screen.getByTestId("add-service")).toBeInTheDocument(); }); test("closing AddService modal via overlay click", async () => { render(); await act(async () => { fireEvent.click(screen.getByText("افزودن خدمات")); }); // modal should exist expect(screen.getByTestId("add-service")).toBeInTheDocument(); // click backdrop const backdrop = document.querySelector(".fixed"); await act(async () => { fireEvent.click(backdrop!); }); }); test("closing AddService modal via X button inside mock AddService", async () => { render(); await act(async () => { fireEvent.click(screen.getByText("افزودن خدمات")); }); expect(screen.getByTestId("add-service")).toBeInTheDocument(); await act(async () => { fireEvent.click(screen.getByTestId("close-add-service")); }); expect(screen.queryByTestId("add-service")).toBeNull(); });