import { render, screen, fireEvent } from "@testing-library/react";
import { useGetAllCustomers } from "@/apps/new-ui/services/Customer";
import { MemoryRouter } from "react-router-dom";
import CustomerCard from "@/apps/new-ui/components/AppointmentComponents/CustomerCard";
// mock portal و componentهای خارجی
jest.mock("react-dom", () => ({
...jest.requireActual("react-dom"),
createPortal: (node: any) => node,
}));
jest.mock("../src/apps/new-ui/Utils/env.ts", () => ({
ENV: {
API_URL: "https://api.test",
},
}));
jest.mock("@/apps/new-ui/components/AppointmentComponents/AddCustomer", () => {
return ({ onclick }: any) => (
);
});
jest.mock("@/utils/axios-interceptor", () => ({
appointmentClient: {
get: jest.fn(),
post: jest.fn(),
put: jest.fn(),
delete: jest.fn(),
},
}));
jest.mock("@/apps/new-ui/components/VoiceSearchInput", () => {
return ({ value, onChange, disabled }: any) => (
onChange(e.target.value)}
disabled={disabled}
/>
);
});
jest.mock("@/apps/new-ui/services/Customer");
describe("CustomerCard", () => {
const mockDispatch = jest.fn();
beforeEach(() => {
jest.clearAllMocks();
localStorage.clear();
});
const setup = (mockData: any) => {
(useGetAllCustomers as jest.Mock).mockReturnValue(mockData);
return render(
,
);
};
it("renders loading state", () => {
setup({ isLoading: true });
expect(screen.getByText("در حال بارگذاری...")).toBeInTheDocument();
});
it("renders error state", () => {
setup({ isError: true });
expect(
screen.getByText("خطا در دریافت اطلاعات مشتریان"),
).toBeInTheDocument();
});
it("renders empty state", () => {
setup({ data: { customers: [] } });
expect(screen.getByText("مشتری وجود ندارد.")).toBeInTheDocument();
});
it("renders customer list", () => {
setup({
data: {
customers: [
{ id: 1, name: "Ali", phone_number: "0912", customer_type: "NORMAL" },
],
},
});
expect(screen.getByText("Ali")).toBeInTheDocument();
expect(screen.getByText("0912")).toBeInTheDocument();
});
it("search works", () => {
setup({
data: {
customers: [
{ id: 1, name: "Ali", phone_number: "0912" },
{ id: 2, name: "Sara", phone_number: "0912333" },
],
},
});
const input = screen.getByTestId("search-input");
fireEvent.change(input, { target: { value: "sar" } });
expect(screen.queryByText("Ali")).not.toBeInTheDocument();
expect(screen.getByText("Sara")).toBeInTheDocument();
});
it("selects and deselects a customer", () => {
setup({
data: {
customers: [{ id: 1, name: "Ali", phone_number: "0912" }],
},
});
const item = screen.getByText("Ali");
// select
fireEvent.click(item);
expect(localStorage.getItem("selectedCustomerId")).toBe("1");
// deselect
fireEvent.click(item);
expect(localStorage.getItem("selectedCustomerId")).toBe(null);
});
it("opens the add customer modal", () => {
setup({
data: { customers: [{ id: 1, name: "Ali", phone_number: "09" }] },
});
const addBtn = screen.getByRole("button", { name: "" }); // آیکون است
fireEvent.click(addBtn);
expect(mockDispatch).toHaveBeenCalledWith("OPEN");
expect(screen.getByTestId("add-customer")).toBeInTheDocument();
});
it("closes modal via add-customer done", () => {
setup({
data: { customers: [{ id: 1, name: "Ali", phone_number: "09" }] },
});
const addBtn = screen.getByRole("button", { name: "" });
fireEvent.click(addBtn);
fireEvent.click(screen.getByTestId("add-customer-done"));
expect(mockDispatch).toHaveBeenCalledWith("CLOSE");
});
it("closes modal with ESC key", () => {
setup({
data: { customers: [{ id: 1, name: "Ali", phone_number: "09" }] },
});
fireEvent.click(screen.getByRole("button", { name: "" }));
fireEvent.keyDown(document, { key: "Escape" });
expect(mockDispatch).toHaveBeenCalledWith("CLOSE");
});
});