import { render, screen, fireEvent } from "@testing-library/react"; import { useGetCustomerProfilePicture } from "@/apps/new-ui/services/Customer"; import { useNavigate } from "react-router-dom"; import LoyaltyCustomers from "@/apps/new-ui/pages/rose-assistant/+components/LoyaltyCustomers"; jest.mock("../src/apps/new-ui/Utils/env.ts", () => ({ ENV: { API_URL: "https://api.test", }, })); // --------------------------- // MOCKS // --------------------------- jest.mock("@/apps/new-ui/services/Customer", () => ({ useGetCustomerProfilePicture: jest.fn(), })); jest.mock("@/apps/new-ui/components/AnimatedTooltip", () => ({ AnimatedTooltip: () =>
, })); jest.mock("@/apps/new-ui/components/CustomeComponents/MessageButton", () => { return () =>
; }); jest.mock("react-router-dom", () => ({ useNavigate: jest.fn(), })); // جلوگیری از خطای تصویرها jest.mock("@/apps/new-ui/assets/profilePhoto.svg", () => "mock-photo"); describe("LoyaltyCustomers Component", () => { const mockNavigate = jest.fn(); const mockData = { loyal_customers_last_30_days: [ { customer_name: "علی رضایی", customer_phone_number: "09120000001", visits: 5, }, { customer_name: "بی‌نهایت طولانی طولانی طولانی", customer_phone_number: "09120000002", visits: 4, }, ], }; beforeEach(() => { jest.clearAllMocks(); localStorage.clear(); (useNavigate as jest.Mock).mockReturnValue(mockNavigate); (useGetCustomerProfilePicture as jest.Mock).mockReturnValue({ mutateAsync: jest.fn().mockResolvedValue({ data: { "09120000001": { customer_type: "VIP", profile_picture: null, }, "09120000002": { customer_type: "NORMAL", profile_picture: null, }, }, }), }); }); // ------------------------------------------------------------ test("renders loyal customers count + tooltip + message buttons", () => { render(); // تعداد مشتریان وفادار expect(screen.getByText("2")).toBeInTheDocument(); // Tooltip render expect(screen.getByTestId("tooltip")).toBeInTheDocument(); // Message button for each row in modal (later) }); // ------------------------------------------------------------ test("opens modal when clicking 'دیدن همه‌ی مشتریان وفادار'", () => { render(); fireEvent.click(screen.getByText("دیدن همه‌ی مشتریان وفادار")); expect(screen.getByText("2 مشتری وفادار")).toBeInTheDocument(); }); // ------------------------------------------------------------ test("filters customers when typing in search input", () => { render(); fireEvent.click(screen.getByText("دیدن همه‌ی مشتریان وفادار")); const search = screen.getByPlaceholderText("جستجو مشتری"); // تایپ غیر مطابق → 0 نتیجه fireEvent.change(search, { target: { value: "zzz" } }); expect(screen.getByText(/هیچ مشتری‌ای با/i)).toBeInTheDocument(); // تایپ مطابق fireEvent.change(search, { target: { value: "علی" } }); expect(screen.getByText("علی رضایی")).toBeInTheDocument(); }); // ------------------------------------------------------------ test("send message button stores filtered customers in localStorage and navigates", () => { render(); fireEvent.click(screen.getByText("دیدن همه‌ی مشتریان وفادار")); const sendBtn = screen.getByText("ارسال پیام"); // دکمه فعال است چون دو مشتری داریم expect(sendBtn).not.toBeDisabled(); fireEvent.click(sendBtn); const saved = JSON.parse(localStorage.getItem("loyalty-members") || "[]"); expect(saved.length).toBe(2); expect(mockNavigate).toHaveBeenCalledWith("/sms-kadeh?tab=3"); }); // ------------------------------------------------------------ test("closes modal when clicking backdrop", () => { render(); fireEvent.click(screen.getByText("دیدن همه‌ی مشتریان وفادار")); // Modal visible expect(screen.getByText("2 مشتری وفادار")).toBeInTheDocument(); // Click backdrop fireEvent.click(document.querySelector(".fixed.inset-0")!); expect(screen.queryByText("2 مشتری وفادار")).not.toBeInTheDocument(); }); });