From 54d063167ef4eb9fb2524331ace1e5d1d808e2f1 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Sun, 17 May 2026 17:01:18 +0800 Subject: [PATCH] test: use platform spy helper in cli tests --- src/cli/channels-cli.test.ts | 8 +++----- src/process/kill-tree.test.ts | 25 +++++++------------------ src/terminal/table.test.ts | 11 ++++------- 3 files changed, 14 insertions(+), 30 deletions(-) diff --git a/src/cli/channels-cli.test.ts b/src/cli/channels-cli.test.ts index 1225d94a6ba..8cbc3bd23ad 100644 --- a/src/cli/channels-cli.test.ts +++ b/src/cli/channels-cli.test.ts @@ -1,6 +1,7 @@ import { Command } from "commander"; import { afterEach, describe, expect, it, vi } from "vitest"; import type { PluginPackageChannel } from "../plugins/manifest.js"; +import { mockProcessPlatform } from "../test-utils/vitest-spies.js"; import { registerChannelsCli } from "./channels-cli.js"; const listBundledPackageChannelMetadataMock = vi.hoisted(() => @@ -19,13 +20,10 @@ function getChannelAddOptionFlags(program: Command): string[] { describe("registerChannelsCli", () => { const originalArgv = [...process.argv]; - const originalPlatform = Object.getOwnPropertyDescriptor(process, "platform"); afterEach(() => { process.argv = [...originalArgv]; - if (originalPlatform) { - Object.defineProperty(process, "platform", originalPlatform); - } + vi.restoreAllMocks(); vi.clearAllMocks(); }); @@ -78,7 +76,7 @@ describe("registerChannelsCli", () => { cliAddOptions: [{ flags: "--homeserver ", description: "Matrix homeserver URL" }], }, ]); - Object.defineProperty(process, "platform", { value: "win32", configurable: true }); + mockProcessPlatform("win32"); process.argv = [ "C:\\Program Files\\nodejs\\node.exe", "C:\\repo\\openclaw.js", diff --git a/src/process/kill-tree.test.ts b/src/process/kill-tree.test.ts index d7fab26ee33..c4ccdaccdcf 100644 --- a/src/process/kill-tree.test.ts +++ b/src/process/kill-tree.test.ts @@ -1,4 +1,5 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { withMockedPlatform } from "../test-utils/vitest-spies.js"; const { spawnMock } = vi.hoisted(() => ({ spawnMock: vi.fn(), @@ -28,18 +29,6 @@ function expectTaskkillCall(index: number, args: string[]) { ]); } -async function withPlatform(platform: NodeJS.Platform, run: () => Promise | T): Promise { - const originalPlatform = Object.getOwnPropertyDescriptor(process, "platform"); - Object.defineProperty(process, "platform", { value: platform, configurable: true }); - try { - return await run(); - } finally { - if (originalPlatform) { - Object.defineProperty(process, "platform", originalPlatform); - } - } -} - describe("killProcessTree", () => { let killSpy: ReturnType; @@ -67,7 +56,7 @@ describe("killProcessTree", () => { return true; }) as typeof process.kill); - await withPlatform("win32", async () => { + await withMockedPlatform("win32", async () => { killProcessTree(4242, { graceMs: 25 }); expect(spawnMock).toHaveBeenCalledTimes(1); @@ -86,7 +75,7 @@ describe("killProcessTree", () => { return true; }) as typeof process.kill); - await withPlatform("win32", async () => { + await withMockedPlatform("win32", async () => { killProcessTree(5252, { graceMs: 10 }); await vi.advanceTimersByTimeAsync(10); @@ -108,7 +97,7 @@ describe("killProcessTree", () => { return true; }) as typeof process.kill); - await withPlatform("linux", async () => { + await withMockedPlatform("linux", async () => { killProcessTree(3333, { graceMs: 10 }); await vi.advanceTimersByTimeAsync(10); @@ -127,7 +116,7 @@ describe("killProcessTree", () => { return true; }) as typeof process.kill); - await withPlatform("linux", async () => { + await withMockedPlatform("linux", async () => { killProcessTree(4444, { graceMs: 5 }); await vi.advanceTimersByTimeAsync(5); @@ -145,7 +134,7 @@ describe("killProcessTree", () => { return true; }) as typeof process.kill); - await withPlatform("linux", async () => { + await withMockedPlatform("linux", async () => { killProcessTree(5555, { graceMs: 10, detached: false }); await vi.advanceTimersByTimeAsync(10); @@ -169,7 +158,7 @@ describe("killProcessTree", () => { return true; }) as typeof process.kill); - await withPlatform("linux", async () => { + await withMockedPlatform("linux", async () => { killProcessTree(6666, { graceMs: 10 }); await vi.advanceTimersByTimeAsync(10); diff --git a/src/terminal/table.test.ts b/src/terminal/table.test.ts index a596c05a148..8f217273aa6 100644 --- a/src/terminal/table.test.ts +++ b/src/terminal/table.test.ts @@ -1,16 +1,13 @@ import { afterEach, describe, expect, it, vi } from "vitest"; +import { mockProcessPlatform } from "../test-utils/vitest-spies.js"; import { visibleWidth } from "./ansi.js"; import { resolveNoteColumns, wrapNoteMessage } from "./note.js"; import { renderTable } from "./table.js"; describe("renderTable", () => { - const originalPlatformDescriptor = Object.getOwnPropertyDescriptor(process, "platform"); - afterEach(() => { vi.unstubAllEnvs(); - if (originalPlatformDescriptor) { - Object.defineProperty(process, "platform", originalPlatformDescriptor); - } + vi.restoreAllMocks(); }); it("prefers shrinking flex columns to avoid wrapping non-flex labels", () => { @@ -215,7 +212,7 @@ describe("renderTable", () => { }); it("falls back to ASCII borders on legacy Windows consoles", () => { - Object.defineProperty(process, "platform", { value: "win32", configurable: true }); + mockProcessPlatform("win32"); vi.stubEnv("WT_SESSION", ""); vi.stubEnv("TERM_PROGRAM", ""); vi.stubEnv("TERM", "vt100"); @@ -233,7 +230,7 @@ describe("renderTable", () => { }); it("keeps unicode borders on modern Windows terminals", () => { - Object.defineProperty(process, "platform", { value: "win32", configurable: true }); + mockProcessPlatform("win32"); vi.stubEnv("WT_SESSION", "1"); vi.stubEnv("TERM", ""); vi.stubEnv("TERM_PROGRAM", "");