From 023a124312838126da99668c0fb6431f79f0a50a Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Wed, 7 Jan 2026 03:16:52 +0100 Subject: [PATCH] test: cover gmail tailscale error formatting --- src/hooks/gmail-setup-utils.test.ts | 76 +++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/src/hooks/gmail-setup-utils.test.ts b/src/hooks/gmail-setup-utils.test.ts index c218c9b9a..66db598aa 100644 --- a/src/hooks/gmail-setup-utils.test.ts +++ b/src/hooks/gmail-setup-utils.test.ts @@ -45,3 +45,79 @@ describe("resolvePythonExecutablePath", () => { } }, 60_000); }); + +describe("ensureTailscaleEndpoint", () => { + it("includes stdout and exit code when tailscale serve fails", async () => { + vi.doMock("../process/exec.js", () => ({ + runCommandWithTimeout: vi.fn(), + })); + + const { ensureTailscaleEndpoint } = await import("./gmail-setup-utils.js"); + const { runCommandWithTimeout } = await import("../process/exec.js"); + const runCommand = vi.mocked(runCommandWithTimeout); + + runCommand + .mockResolvedValueOnce({ + stdout: JSON.stringify({ Self: { DNSName: "host.tailnet.ts.net." } }), + stderr: "", + code: 0, + signal: null, + killed: false, + }) + .mockResolvedValueOnce({ + stdout: "tailscale output", + stderr: "Warning: client version mismatch", + code: 1, + signal: null, + killed: false, + }); + + let message = ""; + try { + await ensureTailscaleEndpoint({ + mode: "serve", + path: "/gmail-pubsub", + port: 8788, + }); + } catch (err) { + message = err instanceof Error ? err.message : String(err); + } + + expect(message).toContain("code=1"); + expect(message).toContain("stderr: Warning: client version mismatch"); + expect(message).toContain("stdout: tailscale output"); + }); + + it("includes JSON parse failure details with stdout", async () => { + vi.doMock("../process/exec.js", () => ({ + runCommandWithTimeout: vi.fn(), + })); + + const { ensureTailscaleEndpoint } = await import("./gmail-setup-utils.js"); + const { runCommandWithTimeout } = await import("../process/exec.js"); + const runCommand = vi.mocked(runCommandWithTimeout); + + runCommand.mockResolvedValueOnce({ + stdout: "not-json", + stderr: "", + code: 0, + signal: null, + killed: false, + }); + + let message = ""; + try { + await ensureTailscaleEndpoint({ + mode: "funnel", + path: "/gmail-pubsub", + port: 8788, + }); + } catch (err) { + message = err instanceof Error ? err.message : String(err); + } + + expect(message).toContain("returned invalid JSON"); + expect(message).toContain("stdout: not-json"); + expect(message).toContain("code=0"); + }); +});