From d3c53f4596162d60b950724296820b3b1510e4ac Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 9 Jan 2026 18:35:52 +0100 Subject: [PATCH] fix: stabilize CI lint/tests (#592) --- .../NodeMode/MacNodeBridgeSession.swift | 9 ++++++--- src/media/store.test.ts | 13 ++++++++++++- src/web/logout.test.ts | 18 +++++++++++++++++- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/apps/macos/Sources/Clawdbot/NodeMode/MacNodeBridgeSession.swift b/apps/macos/Sources/Clawdbot/NodeMode/MacNodeBridgeSession.swift index c33aa12a3..d4693e548 100644 --- a/apps/macos/Sources/Clawdbot/NodeMode/MacNodeBridgeSession.swift +++ b/apps/macos/Sources/Clawdbot/NodeMode/MacNodeBridgeSession.swift @@ -331,7 +331,8 @@ actor MacNodeBridgeSession { let now = self.clock.now if now > last.advanced(by: timeout) { let age = last.duration(to: now) - self.logger.warning("Node bridge heartbeat timed out; disconnecting (age: \(String(describing: age), privacy: .public)).") + self.logger.warning( + "Node bridge heartbeat timed out; disconnecting (age: \(String(describing: age), privacy: .public)).") await self.disconnect() return } @@ -341,7 +342,8 @@ actor MacNodeBridgeSession { do { try await self.send(BridgePing(type: "ping", id: id)) } catch { - self.logger.warning("Node bridge ping send failed; disconnecting (error: \(String(describing: error), privacy: .public)).") + self.logger.warning( + "Node bridge ping send failed; disconnecting (error: \(String(describing: error), privacy: .public)).") await self.disconnect() return } @@ -356,7 +358,8 @@ actor MacNodeBridgeSession { private func handleConnectionState(_ state: NWConnection.State) async { switch state { case let .failed(error): - self.logger.warning("Node bridge connection failed; disconnecting (error: \(String(describing: error), privacy: .public)).") + self.logger.warning( + "Node bridge connection failed; disconnecting (error: \(String(describing: error), privacy: .public)).") await self.disconnect() case .cancelled: self.logger.warning("Node bridge connection cancelled; disconnecting.") diff --git a/src/media/store.test.ts b/src/media/store.test.ts index 20448cfe7..437fb26ff 100644 --- a/src/media/store.test.ts +++ b/src/media/store.test.ts @@ -6,6 +6,10 @@ import { afterAll, beforeAll, describe, expect, it, vi } from "vitest"; const realOs = await vi.importActual("node:os"); const HOME = path.join(realOs.tmpdir(), "clawdbot-home-test"); +const PREV_CLAWDBOT_STATE_DIR = process.env.CLAWDBOT_STATE_DIR; +const PREV_CLAWDIS_STATE_DIR = process.env.CLAWDIS_STATE_DIR; +delete process.env.CLAWDBOT_STATE_DIR; +delete process.env.CLAWDIS_STATE_DIR; vi.mock("node:os", () => ({ default: { homedir: () => HOME, tmpdir: () => realOs.tmpdir() }, @@ -22,11 +26,18 @@ describe("media store", () => { afterAll(async () => { await fs.rm(HOME, { recursive: true, force: true }); + if (PREV_CLAWDBOT_STATE_DIR !== undefined) + process.env.CLAWDBOT_STATE_DIR = PREV_CLAWDBOT_STATE_DIR; + else delete process.env.CLAWDBOT_STATE_DIR; + + if (PREV_CLAWDIS_STATE_DIR !== undefined) + process.env.CLAWDIS_STATE_DIR = PREV_CLAWDIS_STATE_DIR; + else delete process.env.CLAWDIS_STATE_DIR; }); it("creates and returns media directory", async () => { const dir = await store.ensureMediaDir(); - expect(dir).toContain("clawdbot-home-test"); + expect(path.basename(dir)).toBe("media"); const stat = await fs.stat(dir); expect(stat.isDirectory()).toBe(true); }); diff --git a/src/web/logout.test.ts b/src/web/logout.test.ts index 83f88e287..d75ba09b2 100644 --- a/src/web/logout.test.ts +++ b/src/web/logout.test.ts @@ -14,9 +14,16 @@ const runtime = { describe("web logout", () => { const origHomedir = os.homedir; let tmpDir: string; + let prevStateDir: string | undefined; + let prevClawdisStateDir: string | undefined; beforeEach(() => { vi.clearAllMocks(); + prevStateDir = process.env.CLAWDBOT_STATE_DIR; + prevClawdisStateDir = process.env.CLAWDIS_STATE_DIR; + delete process.env.CLAWDBOT_STATE_DIR; + delete process.env.CLAWDIS_STATE_DIR; + tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "clawdbot-logout-")); vi.spyOn(os, "homedir").mockReturnValue(tmpDir); vi.resetModules(); @@ -36,6 +43,14 @@ describe("web logout", () => { await fsPromises .rm(tmpDir, { recursive: true, force: true }) .catch(() => {}); + + if (prevStateDir !== undefined) process.env.CLAWDBOT_STATE_DIR = prevStateDir; + else delete process.env.CLAWDBOT_STATE_DIR; + + if (prevClawdisStateDir !== undefined) + process.env.CLAWDIS_STATE_DIR = prevClawdisStateDir; + else delete process.env.CLAWDIS_STATE_DIR; + // restore for safety // eslint-disable-next-line @typescript-eslint/unbound-method (os.homedir as unknown as typeof origHomedir) = origHomedir; @@ -47,7 +62,8 @@ describe("web logout", () => { async () => { const { logoutWeb, WA_WEB_AUTH_DIR } = await import("./session.js"); - expect(WA_WEB_AUTH_DIR.startsWith(tmpDir)).toBe(true); + const rel = path.relative(tmpDir, WA_WEB_AUTH_DIR); + expect(rel && !rel.startsWith("..") && !path.isAbsolute(rel)).toBe(true); fs.mkdirSync(WA_WEB_AUTH_DIR, { recursive: true }); fs.writeFileSync(path.join(WA_WEB_AUTH_DIR, "creds.json"), "{}"); const result = await logoutWeb({ runtime: runtime as never });