hyapp-admin-platform/src/features/payment/pages/PaymentBillListPage.test.jsx
2026-06-07 14:45:51 +08:00

124 lines
4.1 KiB
JavaScript

import { fireEvent, render, screen, within } from "@testing-library/react";
import { afterEach, expect, test, vi } from "vitest";
import { PaymentBillListPage } from "@/features/payment/pages/PaymentBillListPage.jsx";
import { usePaginatedQuery } from "@/shared/hooks/usePaginatedQuery.js";
import { useRegionOptions } from "@/shared/hooks/useRegionOptions.js";
vi.mock("@/shared/hooks/usePaginatedQuery.js", () => ({
usePaginatedQuery: vi.fn(),
}));
vi.mock("@/shared/hooks/useRegionOptions.js", () => ({
useRegionOptions: vi.fn(),
}));
vi.mock("@/shared/ui/ToastProvider.jsx", () => ({
useToast: () => ({ showToast: vi.fn() }),
}));
afterEach(() => {
vi.clearAllMocks();
});
test("payment bills show user seller country region and split amount columns", () => {
mockRegions();
vi.mocked(usePaginatedQuery).mockReturnValue(queryFixture([coinSellerBill()]));
render(<PaymentBillListPage />);
expect(screen.getByText("用户信息")).toBeInTheDocument();
expect(screen.getByText("币商信息")).toBeInTheDocument();
expect(screen.getByText("金币")).toBeInTheDocument();
expect(screen.getByText("金额")).toBeInTheDocument();
expect(screen.getByText("国家/区域")).toBeInTheDocument();
expect(screen.queryByText("兑换口径")).not.toBeInTheDocument();
expect(screen.queryByText("金币 / 金额")).not.toBeInTheDocument();
expect(screen.getByText("Alice")).toBeInTheDocument();
expect(screen.getByText("165075")).toBeInTheDocument();
expect(screen.getByText("Seller")).toBeInTheDocument();
expect(screen.getByText("164917")).toBeInTheDocument();
expect(screen.getByText("菲律宾")).toBeInTheDocument();
expect(screen.getByText("东南亚")).toBeInTheDocument();
expect(screen.queryByText("USD 0.00")).not.toBeInTheDocument();
});
test("payment bills include google recharge option and region header filter", () => {
mockRegions();
vi.mocked(usePaginatedQuery).mockReturnValue(queryFixture([googleBill()]));
render(<PaymentBillListPage />);
expect(screen.getByText("谷歌充值")).toBeInTheDocument();
expect(screen.getByText("USDT 0.99")).toBeInTheDocument();
fireEvent.click(screen.getAllByRole("button", { name: /国家\/区域/ })[0]);
const filter = screen.getByRole("presentation");
expect(within(filter).getByText("全部区域")).toBeInTheDocument();
expect(within(filter).getByText("中东 · ME · 2")).toBeInTheDocument();
});
function mockRegions() {
vi.mocked(useRegionOptions).mockReturnValue({
loadingRegions: false,
regionOptions: [
{ label: "东南亚 · SEA · 1", name: "东南亚", regionId: 1, value: "1" },
{ label: "中东 · ME · 2", name: "中东", regionId: 2, value: "2" },
],
});
}
function queryFixture(items) {
return {
data: { items, page: 1, pageSize: 50, total: items.length },
error: null,
loading: false,
reload: vi.fn(),
};
}
function coinSellerBill() {
return {
coinAmount: 130000,
createdAtMs: 1760000000000,
currencyCode: "USD",
rechargeType: "coin_seller_transfer",
seller: { displayUserId: "164917", userId: "2002", username: "Seller" },
sellerUserId: 2002,
status: "succeeded",
targetRegionId: 1,
transactionId: "tx_coin",
usdMinorAmount: 0,
user: {
countryCode: "PH",
countryDisplayName: "菲律宾",
displayUserId: "165075",
userId: "1001",
username: "Alice",
},
userId: 1001,
};
}
function googleBill() {
return {
coinAmount: 80000,
createdAtMs: 1760000000000,
currencyCode: "USDT",
rechargeType: "google_play_recharge",
status: "succeeded",
targetRegionId: 2,
transactionId: "tx_google",
usdMinorAmount: 99,
user: {
countryCode: "AE",
countryDisplayName: "阿联酋",
displayUserId: "165108",
userId: "1002",
username: "Google User",
},
userId: 1002,
};
}