import { describe, it, expect, vi, beforeEach } from "vitest"; import { render, screen, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import type { Mock } from "vitest"; // mock 版本模块:控制 checkUpdate 返回值、监视 openExternal。 vi.mock("../lib/version", () => ({ checkUpdate: vi.fn(), openExternal: vi.fn(), })); import { UpdateBanner } from "./UpdateBanner"; import { checkUpdate, openExternal } from "../lib/version"; const mockCheck = checkUpdate as Mock; const mockOpen = openExternal as Mock; beforeEach(() => { mockCheck.mockReset(); mockOpen.mockReset(); }); describe("UpdateBanner", () => { it("无更新(checkUpdate→null)时不渲染任何东西", async () => { mockCheck.mockResolvedValue(null); const { container } = render(); await waitFor(() => expect(mockCheck).toHaveBeenCalled()); expect(container).toBeEmptyDOMElement(); }); it("有更新时显示版本号,点「前往下载」调 openExternal(url)", async () => { mockCheck.mockResolvedValue({ version: "1.2.3", url: "https://rel", notes: "" }); render(); expect(await screen.findByText("v1.2.3")).toBeInTheDocument(); await userEvent.click(screen.getByRole("button", { name: "前往下载" })); expect(mockOpen).toHaveBeenCalledWith("https://rel"); }); it("点忽略后横幅消失", async () => { mockCheck.mockResolvedValue({ version: "1.2.3", url: "https://rel", notes: "" }); render(); expect(await screen.findByText("v1.2.3")).toBeInTheDocument(); await userEvent.click(screen.getByTitle("忽略")); expect(screen.queryByText("v1.2.3")).not.toBeInTheDocument(); }); });