import * as fs from "node:fs/promises"; import * as os from "node:os"; import * as path from "node:path"; import { describe, expect, it } from "vitest"; import { cameraTempPath, parseCameraClipPayload, parseCameraSnapPayload, writeBase64ToFile, } from "./nodes-camera.js"; describe("nodes camera helpers", () => { it("parses camera.snap payload", () => { expect( parseCameraSnapPayload({ format: "jpg", base64: "aGk=", width: 10, height: 20, }), ).toEqual({ format: "jpg", base64: "aGk=", width: 10, height: 20 }); }); it("rejects invalid camera.snap payload", () => { expect(() => parseCameraSnapPayload({ format: "jpg" })).toThrow( /invalid camera\.snap payload/i, ); }); it("parses camera.clip payload", () => { expect( parseCameraClipPayload({ format: "mp4", base64: "AAEC", durationMs: 1234, hasAudio: true, }), ).toEqual({ format: "mp4", base64: "AAEC", durationMs: 1234, hasAudio: true, }); }); it("builds stable temp paths when id provided", () => { const p = cameraTempPath({ kind: "snap", facing: "front", ext: "jpg", tmpDir: "/tmp", id: "id1", }); expect(p).toBe(path.join("/tmp", "clawdis-camera-snap-front-id1.jpg")); }); it("writes base64 to file", async () => { const dir = await fs.mkdtemp(path.join(os.tmpdir(), "clawdis-test-")); const out = path.join(dir, "x.bin"); await writeBase64ToFile(out, "aGk="); await expect(fs.readFile(out, "utf8")).resolves.toBe("hi"); await fs.rm(dir, { recursive: true, force: true }); }); });