f37d046f2c
测试基建:vite.config.ts 加 test 配置(jsdom + setup),package.json 加 test/test:watch 脚本,src/test/setup.ts 引 jest-dom;tsconfig 把测试文件 exclude, 使 CI 现有 tsc --noEmit 不检查测试文件(仍绿),测试由 Vitest 自跑(先不接 CI)。 覆盖(31 例 / 4 文件): - dsl:exportDsl 节点/边映射 + config 兜底 + branch 真假边 sourceHandle 条件; validate 空画布/孤立节点/必填项缺失。 - version:isNewer 版本比较矩阵;checkUpdate 有更新/同版/旧版/404限流/离线异常; openExternal Wails / 浏览器双路径。 - run:deriveNodes start→running、end→done+耗时、error、error 不被 start 覆盖、 info 累计 notes、首现顺序、label 更新。 - UpdateBanner(RTL):无更新不渲染、有更新显版本+点下载调 openExternal、点忽略消失。 小改:version.ts 导出 isNewer(原私有)以便直接测版本判定矩阵。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
48 lines
1.7 KiB
TypeScript
48 lines
1.7 KiB
TypeScript
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(<UpdateBanner />);
|
|
await waitFor(() => expect(mockCheck).toHaveBeenCalled());
|
|
expect(container).toBeEmptyDOMElement();
|
|
});
|
|
|
|
it("有更新时显示版本号,点「前往下载」调 openExternal(url)", async () => {
|
|
mockCheck.mockResolvedValue({ version: "1.2.3", url: "https://rel", notes: "" });
|
|
render(<UpdateBanner />);
|
|
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(<UpdateBanner />);
|
|
expect(await screen.findByText("v1.2.3")).toBeInTheDocument();
|
|
|
|
await userEvent.click(screen.getByTitle("忽略"));
|
|
expect(screen.queryByText("v1.2.3")).not.toBeInTheDocument();
|
|
});
|
|
});
|