diff --git a/src/imessage/client.test.ts b/src/imessage/client.test.ts new file mode 100644 index 00000000000..b755b060e37 --- /dev/null +++ b/src/imessage/client.test.ts @@ -0,0 +1,22 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; + +const spawnMock = vi.hoisted(() => vi.fn()); + +vi.mock("node:child_process", () => ({ + spawn: (...args: unknown[]) => spawnMock(...args), +})); + +describe("createIMessageRpcClient", () => { + beforeEach(() => { + spawnMock.mockReset(); + vi.stubEnv("VITEST", "true"); + }); + + it("refuses to spawn imsg rpc in test environments", async () => { + const { createIMessageRpcClient } = await import("./client.js"); + await expect(createIMessageRpcClient()).rejects.toThrow( + /Refusing to start imsg rpc in test environment/i, + ); + expect(spawnMock).not.toHaveBeenCalled(); + }); +}); diff --git a/src/imessage/client.ts b/src/imessage/client.ts index 1a47f172604..d4ec458a7e9 100644 --- a/src/imessage/client.ts +++ b/src/imessage/client.ts @@ -37,6 +37,14 @@ type PendingRequest = { timer?: NodeJS.Timeout; }; +function isTestEnv(): boolean { + if (process.env.NODE_ENV === "test") { + return true; + } + const vitest = process.env.VITEST?.trim().toLowerCase(); + return Boolean(vitest); +} + export class IMessageRpcClient { private readonly cliPath: string; private readonly dbPath?: string; @@ -63,6 +71,9 @@ export class IMessageRpcClient { if (this.child) { return; } + if (isTestEnv()) { + throw new Error("Refusing to start imsg rpc in test environment; mock iMessage RPC client"); + } const args = ["rpc"]; if (this.dbPath) { args.push("--db", this.dbPath);