hyapp-admin-platform/src/features/payment/pages/RechargeProductConfigPage.test.jsx
2026-06-16 17:58:35 +08:00

112 lines
3.7 KiB
JavaScript

import { fireEvent, render, screen } from "@testing-library/react";
import { afterEach, expect, test, vi } from "vitest";
import { RechargeProductConfigPage } from "@/features/payment/pages/RechargeProductConfigPage.jsx";
import { useRechargeProductsPage } from "@/features/payment/hooks/useRechargeProductsPage.js";
vi.mock("@/features/payment/hooks/useRechargeProductsPage.js", () => ({
useRechargeProductsPage: vi.fn(),
}));
afterEach(() => {
vi.clearAllMocks();
});
test("recharge product page defaults to google product list", () => {
vi.mocked(useRechargeProductsPage).mockReturnValue(pageFixture());
render(<RechargeProductConfigPage />);
expect(screen.getByRole("tab", { name: "Google", selected: true })).toBeInTheDocument();
expect(screen.getByRole("button", { name: "新增 Google 商品" })).toBeInTheDocument();
expect(screen.getAllByText("coins_480000").length).toBeGreaterThan(0);
expect(screen.queryByText("支付汇率全球同步")).not.toBeInTheDocument();
});
test("third-party tab reuses product dialog and locks create platform to web", () => {
const page = pageFixture();
vi.mocked(useRechargeProductsPage).mockReturnValue(page);
render(<RechargeProductConfigPage />);
fireEvent.click(screen.getByRole("tab", { name: "三方" }));
expect(screen.getByRole("tab", { name: "三方", selected: true })).toBeInTheDocument();
expect(screen.getByRole("button", { name: "新增三方商品" })).toBeInTheDocument();
expect(screen.queryByText("支付汇率全球同步")).not.toBeInTheDocument();
fireEvent.click(screen.getByRole("button", { name: "新增三方商品" }));
expect(page.openCreate).toHaveBeenCalledTimes(1);
expect(page.setForm).toHaveBeenCalledWith({ platform: "web" });
});
function pageFixture() {
return {
abilities: {
canCreateProduct: true,
canDeleteProduct: true,
canUpdateProduct: true,
},
activeAction: "",
audienceType: "",
closeDialog: vi.fn(),
data: {
items: [
{
amountUsdt: "5.99",
audienceType: "normal",
coinAmount: 480000,
description: "480,000 coins",
enabled: true,
platform: "android",
productCode: "coins_480000",
productId: 1,
productName: "coins_480000",
regionIds: [1, 2],
updatedAtMs: 1760000000000,
},
],
total: 1,
},
editingItem: null,
error: null,
form: {
amountUsdt: "",
audienceType: "normal",
coinAmount: "",
description: "",
enabled: true,
platform: "android",
productName: "",
regionIds: [],
},
keyword: "",
loading: false,
loadingAction: "",
loadingRegions: false,
openCreate: vi.fn(),
openEdit: vi.fn(),
page: 1,
pageSize: 50,
platform: "android",
regionId: "",
regionOptions: [
{ label: "中东 · ME · 1", name: "中东", value: "1" },
{ label: "欧洲美区 · EU · 2", name: "欧洲美区", value: "2" },
],
reload: vi.fn(),
removeProduct: vi.fn(),
resetFilters: vi.fn(),
setAudienceType: vi.fn(),
setForm: vi.fn(),
setKeyword: vi.fn(),
setPage: vi.fn(),
setPlatform: vi.fn(),
setRegionId: vi.fn(),
setStatus: vi.fn(),
status: "",
submitProduct: vi.fn(),
toggleProductEnabled: vi.fn(),
};
}