components (fix) - Add new test files for: • ActiveAccounts • AddService • CreateGiftCard • CustomerCard • CustomerCards • DeleteButton • EditButton • LoyaltyCardListItem • MapPicker • Services • ServicesQA (fix) - Add axios interceptor mock (fix) - Add importMetaEnv mock (fix) - Add environment setup file for test environment
138 lines
3.7 KiB
TypeScript
138 lines
3.7 KiB
TypeScript
import { render, screen, fireEvent } from "@testing-library/react";
|
|
import { useDeleteCustomer } from "@/apps/new-ui/services/Customer";
|
|
import { showWarningAlert } from "@/apps/new-ui/components/CustomAlert";
|
|
import { useNavigate } from "react-router-dom";
|
|
import CustomerCards from "@/apps/new-ui/pages/CustomerClub/+components/CustomerCards";
|
|
jest.mock("../src/apps/new-ui/Utils/env.ts", () => ({
|
|
ENV: {
|
|
API_URL: "https://api.test",
|
|
},
|
|
}));
|
|
// Mock کردن وابستگیها
|
|
jest.mock("@/apps/new-ui/services/Customer", () => ({
|
|
useDeleteCustomer: jest.fn(() => ({ mutate: jest.fn() })),
|
|
}));
|
|
|
|
jest.mock("@/apps/new-ui/components/CustomAlert", () => ({
|
|
showWarningAlert: jest.fn(),
|
|
}));
|
|
|
|
jest.mock("react-router-dom", () => ({
|
|
...jest.requireActual("react-router-dom"),
|
|
useNavigate: jest.fn(),
|
|
}));
|
|
|
|
// Mock کردن import.meta.env
|
|
beforeAll(() => {
|
|
(global as any).import = {
|
|
meta: { env: { VITE_APP_API_URL: "https://api.test" } },
|
|
};
|
|
});
|
|
|
|
describe("CustomerCards Component", () => {
|
|
const navigateMock = jest.fn();
|
|
const deleteMock = jest.fn();
|
|
|
|
beforeEach(() => {
|
|
jest.clearAllMocks();
|
|
(useNavigate as jest.Mock).mockReturnValue(navigateMock);
|
|
(useDeleteCustomer as jest.Mock).mockReturnValue({ mutate: deleteMock });
|
|
});
|
|
|
|
// تابع کمکی برای پیدا کردن دکمه سهنقطه
|
|
const getToggleBtn = (container: HTMLElement) => {
|
|
return container.querySelector("button svg.lucide-ellipsis-vertical")
|
|
?.parentElement as HTMLButtonElement;
|
|
};
|
|
|
|
it("renders skeleton loaders when loading", () => {
|
|
const { container } = render(<CustomerCards isLoading={true} />);
|
|
const skeletons = container.querySelectorAll(".animate-pulse");
|
|
expect(skeletons.length).toBeGreaterThan(0);
|
|
});
|
|
|
|
it("renders customer list", () => {
|
|
render(
|
|
<CustomerCards
|
|
data={[
|
|
{
|
|
id: 1,
|
|
name: "سارا",
|
|
phone_number: "09350000000",
|
|
customer_type: "Silver",
|
|
profile_picture: "",
|
|
score: 40,
|
|
},
|
|
]}
|
|
/>,
|
|
);
|
|
expect(screen.getByText("سارا")).toBeInTheDocument();
|
|
});
|
|
|
|
it("opens and closes dropdown menu", () => {
|
|
const { container } = render(
|
|
<CustomerCards
|
|
data={[
|
|
{
|
|
id: 3,
|
|
name: "سارا",
|
|
phone_number: "09350000000",
|
|
customer_type: "Silver",
|
|
profile_picture: "",
|
|
score: 40,
|
|
},
|
|
]}
|
|
/>,
|
|
);
|
|
|
|
const toggleBtn = getToggleBtn(container);
|
|
fireEvent.click(toggleBtn);
|
|
expect(screen.getByText("ویرایش")).toBeInTheDocument();
|
|
|
|
fireEvent.click(toggleBtn);
|
|
expect(screen.queryByText("ویرایش")).not.toBeInTheDocument();
|
|
});
|
|
|
|
it("calls delete flow when clicking delete", () => {
|
|
const { container } = render(
|
|
<CustomerCards
|
|
data={[
|
|
{
|
|
id: 4,
|
|
name: "رضا",
|
|
phone_number: "09120000000",
|
|
customer_type: "Silver",
|
|
profile_picture: "",
|
|
score: 50,
|
|
},
|
|
]}
|
|
/>,
|
|
);
|
|
|
|
fireEvent.click(getToggleBtn(container));
|
|
fireEvent.click(screen.getByText("حذف"));
|
|
expect(showWarningAlert).toHaveBeenCalled();
|
|
});
|
|
|
|
it("navigates when clicking edit", () => {
|
|
const { container } = render(
|
|
<CustomerCards
|
|
data={[
|
|
{
|
|
id: 5,
|
|
name: "امیر",
|
|
phone_number: "09121234567",
|
|
customer_type: "Silver",
|
|
profile_picture: "",
|
|
score: 70,
|
|
},
|
|
]}
|
|
/>,
|
|
);
|
|
|
|
fireEvent.click(getToggleBtn(container));
|
|
fireEvent.click(screen.getByText("ویرایش"));
|
|
expect(navigateMock).toHaveBeenCalled();
|
|
});
|
|
});
|