


























@@ -96,6 +96,36 @@ function expectRecordFields(
9696return record;
9797}
989899+function requireString(value: unknown, label: string): string {
100+expect(typeof value, `${label} must be a string`).toBe("string");
101+return value as string;
102+}
103+104+function isLowerHex(value: string): boolean {
105+return [...value].every((char) => (char >= "0" && char <= "9") || (char >= "a" && char <= "f"));
106+}
107+108+function isUuidV4(value: string): boolean {
109+const parts = value.split("-");
110+if (parts.length !== 5) {
111+return false;
112+}
113+const [part0, part1, part2, part3, part4] = parts;
114+if (
115+part0?.length !== 8 ||
116+part1?.length !== 4 ||
117+part2?.length !== 4 ||
118+part3?.length !== 4 ||
119+part4?.length !== 12
120+) {
121+return false;
122+}
123+if (part2[0] !== "4" || !part3[0] || !"89ab".includes(part3[0])) {
124+return false;
125+}
126+return parts.every(isLowerHex);
127+}
128+99129function requireRespondPayload(call: RespondCall | undefined, label: string) {
100130expect(call?.[0], `${label} success`).toBe(true);
101131return requireRecord(call?.[1], `${label} payload`);
@@ -317,18 +347,22 @@ describe("node plugin surface refresh", () => {
317347context: {} as never,
318348});
319349320-expect(respond).toHaveBeenCalledWith(
321-true,
322-{
323-surface: "canvas",
324-pluginSurfaceUrls: {
325-canvas: expect.stringContaining("/__openclaw__/cap/"),
326-},
327-expiresAtMs: 1_100,
328-},
329-undefined,
330-);
331-expect(client.pluginSurfaceUrls.canvas).not.toContain("old-token");
350+expect(respond).toHaveBeenCalledTimes(1);
351+const call = respond.mock.calls[0] as RespondCall | undefined;
352+expect(call?.[0]).toBe(true);
353+expect(call?.[2]).toBeUndefined();
354+const payload = requireRecord(call?.[1], "refresh payload");
355+expect(payload.surface).toBe("canvas");
356+expect(payload.expiresAtMs).toBe(1_100);
357+const pluginSurfaceUrls = requireRecord(payload.pluginSurfaceUrls, "refresh surface urls");
358+const canvasUrl = requireString(pluginSurfaceUrls.canvas, "refresh canvas url");
359+const parsedCanvasUrl = new URL(canvasUrl);
360+expect(parsedCanvasUrl.origin).toBe("http://127.0.0.1:18789");
361+expect(parsedCanvasUrl.pathname.startsWith("/__openclaw__/cap/")).toBe(true);
362+const capabilityToken = parsedCanvasUrl.pathname.slice("/__openclaw__/cap/".length);
363+expect(capabilityToken.length).toBeGreaterThan(0);
364+expect(capabilityToken).not.toBe("old-token");
365+expect(client.pluginSurfaceUrls.canvas).toBe(canvasUrl);
332366});
333367});
334368@@ -684,15 +718,11 @@ describe("node.invoke APNs wake path", () => {
684718paramsJSON: JSON.stringify({ url: "http://example.com/" }),
685719});
686720687-const queuedActionId = (pullPayload.actions as Array<{ id?: string }> | undefined)?.[0]?.id;
688-expect(queuedActionId).toEqual(
689-expect.stringMatching(
690-/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/u,
691-),
721+const queuedActionId = requireString(
722+(pullPayload.actions as Array<{ id?: string }> | undefined)?.[0]?.id,
723+"queued action id",
692724);
693-if (queuedActionId === undefined) {
694-throw new Error("expected queued action id");
695-}
725+expect(isUuidV4(queuedActionId)).toBe(true);
696726697727const ackRespond = await ackPending("ios-node-queued", [queuedActionId], ["canvas.navigate"]);
698728const ackCall = ackRespond.mock.calls[0] as RespondCall | undefined;
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。