From 7b4fa9e1a1e8013e7f0bbb402b07419ac9885960 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 2 Jan 2026 20:22:53 +0100 Subject: [PATCH] test: cover camera list invoke --- .../ClawdisIPCTests/MacNodeRuntimeTests.swift | 19 ++++++++ src/gateway/server.test.ts | 47 +++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/apps/macos/Tests/ClawdisIPCTests/MacNodeRuntimeTests.swift b/apps/macos/Tests/ClawdisIPCTests/MacNodeRuntimeTests.swift index b10e7d0c5..74d1e915a 100644 --- a/apps/macos/Tests/ClawdisIPCTests/MacNodeRuntimeTests.swift +++ b/apps/macos/Tests/ClawdisIPCTests/MacNodeRuntimeTests.swift @@ -29,4 +29,23 @@ struct MacNodeRuntimeTests { BridgeInvokeRequest(id: "req-3", command: ClawdisSystemCommand.notify.rawValue, paramsJSON: json)) #expect(response.ok == false) } + + @Test func handleInvokeCameraListRequiresEnabledCamera() async { + let defaults = UserDefaults.standard + let previous = defaults.object(forKey: cameraEnabledKey) + defaults.set(false, forKey: cameraEnabledKey) + defer { + if let previous { + defaults.set(previous, forKey: cameraEnabledKey) + } else { + defaults.removeObject(forKey: cameraEnabledKey) + } + } + + let runtime = MacNodeRuntime() + let response = await runtime.handleInvoke( + BridgeInvokeRequest(id: "req-4", command: ClawdisCameraCommand.list.rawValue)) + #expect(response.ok == false) + #expect(response.error?.message.contains("CAMERA_DISABLED") == true) + } } diff --git a/src/gateway/server.test.ts b/src/gateway/server.test.ts index 86f21aaa1..f76fb9b48 100644 --- a/src/gateway/server.test.ts +++ b/src/gateway/server.test.ts @@ -959,6 +959,53 @@ describe("gateway server", () => { } }); + test("routes camera.list invoke to the node bridge", async () => { + const homeDir = await fs.mkdtemp(path.join(os.tmpdir(), "clawdis-home-")); + const prevHome = process.env.HOME; + process.env.HOME = homeDir; + + try { + bridgeInvoke.mockResolvedValueOnce({ + type: "invoke-res", + id: "inv-2", + ok: true, + payloadJSON: JSON.stringify({ devices: [] }), + error: null, + }); + + const { server, ws } = await startServerWithClient(); + try { + await connectOk(ws); + + const res = await rpcReq(ws, "node.invoke", { + nodeId: "ios-node", + command: "camera.list", + params: {}, + idempotencyKey: "idem-2", + }); + expect(res.ok).toBe(true); + + expect(bridgeInvoke).toHaveBeenCalledWith( + expect.objectContaining({ + nodeId: "ios-node", + command: "camera.list", + paramsJSON: JSON.stringify({}), + }), + ); + } finally { + ws.close(); + await server.close(); + } + } finally { + await fs.rm(homeDir, { recursive: true, force: true }); + if (prevHome === undefined) { + delete process.env.HOME; + } else { + process.env.HOME = prevHome; + } + } + }); + test("node.describe returns supported invoke commands for paired nodes", async () => { const homeDir = await fs.mkdtemp(path.join(os.tmpdir(), "clawdis-home-")); const prevHome = process.env.HOME;