File size: 2,316 Bytes
fc93158 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | import { describe, expect, it, vi } from "vitest";
import { ErrorCodes } from "../protocol/index.js";
import { nodeHandlers } from "./nodes.js";
describe("node.canvas.capability.refresh", () => {
it("rotates the caller canvas capability and returns a fresh scoped URL", async () => {
const respond = vi.fn();
const client = {
connect: { role: "node", client: { id: "node-1" } },
canvasHostUrl: "http://127.0.0.1:18789",
canvasCapability: "old-token",
canvasCapabilityExpiresAtMs: Date.now() - 1,
};
await nodeHandlers["node.canvas.capability.refresh"]({
req: { type: "req", id: "req-1", method: "node.canvas.capability.refresh" },
params: {},
respond,
context: {} as never,
client: client as never,
isWebchatConnect: () => false,
});
const call = respond.mock.calls[0] as
| [
boolean,
{
canvasCapability?: string;
canvasHostUrl?: string;
canvasCapabilityExpiresAtMs?: number;
},
]
| undefined;
expect(call?.[0]).toBe(true);
const payload = call?.[1] ?? {};
expect(typeof payload.canvasCapability).toBe("string");
expect(payload.canvasCapability).not.toBe("old-token");
expect(payload.canvasHostUrl).toContain("/__openclaw__/cap/");
expect(typeof payload.canvasCapabilityExpiresAtMs).toBe("number");
expect(payload.canvasCapabilityExpiresAtMs).toBeGreaterThan(Date.now());
expect(client.canvasCapability).toBe(payload.canvasCapability);
expect(client.canvasCapabilityExpiresAtMs).toBe(payload.canvasCapabilityExpiresAtMs);
});
it("returns unavailable when the caller session has no base canvas URL", async () => {
const respond = vi.fn();
await nodeHandlers["node.canvas.capability.refresh"]({
req: { type: "req", id: "req-2", method: "node.canvas.capability.refresh" },
params: {},
respond,
context: {} as never,
client: { connect: { role: "node", client: { id: "node-1" } } } as never,
isWebchatConnect: () => false,
});
const call = respond.mock.calls[0] as
| [boolean, unknown, { code?: number; message?: string }]
| undefined;
expect(call?.[0]).toBe(false);
expect(call?.[2]?.code).toBe(ErrorCodes.UNAVAILABLE);
});
});
|