import Factor from "@/apps/new-ui/pages/ReportAll/factor"; import { render, screen } from "@testing-library/react"; import { MemoryRouter } from "react-router-dom"; import * as FactorService from "@/apps/new-ui/services/Factor"; jest.mock("@/apps/new-ui/services/User", () => ({ useGetUserInfo: () => ({ data: { current_user: { id: 1, name: "test user", phone_number: "09120000000", profile_picture: "", user_id: "XX1", address: "", city: "", province: "", latitude: 0, longitude: 0, wallet_balance: 0, sms_balance: 0, services: [], score: 0, specialty: "", date_of_birth: "", }, feeling_status: "", profile_complete: { active_time: null, has_profile_action: false }, user_abilities_list: [ {}, {}, {}, { ability_action: "accountant_service", active: true } ] }, isLoading: false }) })); /* =========================== mocks: router =========================== */ jest.mock("react-router-dom", () => ({ ...jest.requireActual("react-router-dom"), useNavigate: () => jest.fn(), useLocation: () => ({ pathname: "/factor", search: "", }), })); /* =========================== mocks: services =========================== */ jest.mock("@/apps/new-ui/services/Factor", () => ({ useGetCombinationAccountingData: jest.fn(), useDownloadTransactionsExcel: () => ({ mutate: jest.fn(), }), useGetFinancialSummary: () => ({ data: null, isLoading: false, }), })); jest.mock("@/apps/new-ui/services/IncomeAndCost", () => ({ useDeleteIncome: () => ({ mutate: jest.fn(), }), useDeleteExpense: () => ({ mutate: jest.fn(), }), })); /* =========================== mocks: components =========================== */ jest.mock("@/apps/new-ui/pages/ReportAll/+components/Header.tsx", () => () => (
)); jest.mock( "@/apps/new-ui/pages/ReportAll/factor/+components/Loader.tsx", () => ({ text }: any) =>
{text}
, ); jest.mock( "@/apps/new-ui/pages/ReportAll/+components/EmptyState.tsx", () => ({ text }: any) =>
{text}
, ); jest.mock( "@/apps/new-ui/pages/ReportAll/factor/+components/IncomeSwipper.tsx", () => () =>
, ); jest.mock( "@/apps/new-ui/components/SubscriptionWrapper", () => ({ children }: any) =>
{children}
, ); jest.mock( "@/apps/new-ui/pages/ReportAll/+components/CardList.tsx", () => ({ items }: any) => (
{items.map((it: any) => (
{it.description}
))}
), ); jest.mock( "@/apps/new-ui/components/CustomeComponents/ButtonActionsExcelIcon.tsx", () => ({ onCreate }: any) => ( ), ); /* =========================== helpers =========================== */ const mockUseGetCombinationAccountingData = FactorService.useGetCombinationAccountingData as jest.Mock; /* =========================== tests =========================== */ describe("Factor page", () => { afterEach(() => { jest.clearAllMocks(); }); it("renders loader when loading", () => { mockUseGetCombinationAccountingData.mockReturnValue({ data: { transactions: [ { id: 1, type: "income", description: "درآمد تست", amount: 100 }, { id: 2, type: "expense", description: "هزینه تست", amount: 50 } ] }, isLoading: false, isError: false, refetch: jest.fn(), }); render( , ); expect(screen.getByTestId("loader")).toBeInTheDocument(); }); it("renders empty state when no transactions exist", () => { mockUseGetCombinationAccountingData.mockReturnValue({ data: { transactions: [] }, isLoading: false, isError: false, refetch: jest.fn(), }); render( , ); expect( screen.getByText("هنوز درآمد یا هزینه‌ای ثبت نشده است."), ).toBeInTheDocument(); }); it("renders card list when transactions exist", async () => { mockUseGetCombinationAccountingData.mockReturnValue({ data: { transactions: [ { id: 1, description: "درآمد تست", type: "income", amount: 1000, date: "1405-01-15", }, { id: 2, description: "هزینه تست", type: "expense", amount: 500, date: "1405-01-10", }, ], }, isLoading: false, isError: false, refetch: jest.fn(), }); render( ); expect(await screen.findByText("درآمد تست")).toBeInTheDocument(); expect(await screen.findByText("هزینه تست")).toBeInTheDocument(); }); });