Files
sundynix-agentix/sundynix-desktop/frontend/src/components/UpdateBanner.test.tsx
T
Blizzard f37d046f2c test(desktop): 前端单元 + 关键组件测试(Vitest + RTL,31 例)
测试基建: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>
2026-06-24 11:53:54 +08:00

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();
});
});