import { render, screen } from "@testing-library/react";
import { afterEach, expect, test, vi } from "vitest";
import { AppUserPrettyIdsPage } from "./AppUserPrettyIdsPage.jsx";
import { usePrettyIdsPage } from "@/features/app-users/hooks/usePrettyIdsPage.js";
vi.mock("@/features/app-users/hooks/usePrettyIdsPage.js", () => ({
usePrettyIdsPage: vi.fn(),
}));
afterEach(() => {
vi.clearAllMocks();
});
test("pretty id page uses tabs and hides internal pretty record ids", () => {
vi.mocked(usePrettyIdsPage).mockReturnValue(pageFixture());
render();
expect(screen.getByRole("tab", { name: "靓号列表 1" })).toHaveAttribute("aria-selected", "true");
expect(screen.getByRole("tab", { name: "靓号池 1" })).toBeInTheDocument();
expect(screen.getAllByText("777777").length).toBeGreaterThan(0);
expect(screen.queryByText("pretty_1782492525506_0b70bb6c6dbc63cf")).not.toBeInTheDocument();
expect(screen.getByText("占用人 A")).toBeInTheDocument();
expect(screen.getByText("Admin ID 8")).toBeInTheDocument();
expect(screen.getByText("释放 2026-06-27 01:00:00")).toBeInTheDocument();
});
test("pretty id page can switch to pool tab", () => {
const page = pageFixture({ activeTab: "pools" });
vi.mocked(usePrettyIdsPage).mockReturnValue(page);
render();
expect(screen.getByRole("tab", { name: "靓号池 1" })).toHaveAttribute("aria-selected", "true");
expect(screen.getByText("≥LV.10")).toBeInTheDocument();
});
function pageFixture(patch = {}) {
return {
abilities: {
canPrettyGenerate: true,
canPrettyGrant: true,
canPrettyUpdate: true,
},
activeDialog: "",
activePool: null,
activePrettyID: null,
activeTab: "ids",
assignedUserId: "",
changeAssignedUserId: vi.fn(),
changeIDKeyword: vi.fn(),
changeIDPool: vi.fn(),
changeIDSource: vi.fn(),
changeIDStatus: vi.fn(),
changePoolStatus: vi.fn(),
changePoolTrack: vi.fn(),
closeDialog: vi.fn(),
generateForm: { count: 100, poolId: "", ruleConfigJson: "", ruleType: "aabbcc" },
grantForm: { displayUserId: "", durationDays: "", reason: "", targetUserId: "" },
idKeyword: "",
idPage: 1,
idPoolId: "",
idQuery: {
data: {
items: [prettyIdFixture()],
page: 1,
pageSize: 20,
total: 1,
},
error: null,
loading: false,
reload: vi.fn(),
},
idSource: "",
idStatus: "",
loadingAction: "",
openCreatePool: vi.fn(),
openEditPool: vi.fn(),
openGenerate: vi.fn(),
openGrant: vi.fn(),
openStatus: vi.fn(),
poolForm: {
levelTrack: "wealth",
maxLevel: 19,
minLevel: 10,
name: "",
ruleConfigJson: "",
ruleType: "aabbcc",
sortOrder: 0,
status: "active",
},
poolOptions: [{ label: "≥LV.10 · 10-19", value: "pool-1" }],
poolPage: 1,
poolQuery: {
data: {
items: [poolFixture()],
page: 1,
pageSize: 20,
total: 1,
},
error: null,
loading: false,
reload: vi.fn(),
},
poolStatus: "",
poolTrack: "",
reloadAll: vi.fn(),
resetIDFilters: vi.fn(),
resetPoolFilters: vi.fn(),
setActiveTab: vi.fn(),
setGenerateForm: vi.fn(),
setGrantForm: vi.fn(),
setIdPage: vi.fn(),
setPoolForm: vi.fn(),
setPoolPage: vi.fn(),
setStatusForm: vi.fn(),
statusForm: { prettyId: "", reason: "", status: "available" },
submitGenerate: vi.fn(),
submitGrant: vi.fn(),
submitPool: vi.fn(),
submitStatus: vi.fn(),
...patch,
};
}
function poolFixture() {
return {
createdAtMs: 1781249886288,
levelTrack: "wealth",
maxLevel: 19,
minLevel: 10,
name: "≥LV.10",
poolId: "pretty_pool_1781249886288_301d1a449c51fbc0",
ruleType: "abccba",
status: "active",
updatedAtMs: 1781249886288,
};
}
function prettyIdFixture() {
return {
assignedAtMs: 1782499200000,
assignedUser: {
avatar: "",
defaultDisplayUserId: "10001",
displayUserId: "777777",
userId: "9001",
username: "占用人 A",
},
assignedUserId: "9001",
createdAtMs: 1782499100000,
createdByAdminId: "7",
displayUserId: "777777",
operator: {
account: "ops",
adminId: "8",
name: "运营",
type: "admin",
},
pool: poolFixture(),
poolId: "pool-1",
prettyId: "pretty_1782492525506_0b70bb6c6dbc63cf",
releasedAtMs: 1782493200000,
source: "admin_grant",
status: "assigned",
updatedAtMs: 1782499300000,
updatedByAdminId: "8",
};
}