























@@ -20,6 +20,11 @@ type FakeGateway = {
20202121const servers: WebSocketServer[] = [];
222223+function expectJsonObject(value: unknown): JsonObject {
24+expect(value && typeof value).toBe("object");
25+return value as JsonObject;
26+}
27+2328function sendJson(socket: WebSocket, payload: JsonObject): void {
2429socket.send(JSON.stringify(payload));
2530}
@@ -405,17 +410,14 @@ describe("OpenClaw SDK websocket e2e", () => {
405410406411expect(run.id).toBe("run-sdk-e2e");
407412expect(seen).toEqual(["run.started", "assistant.delta", "run.completed"]);
408-expect(result).toMatchObject({
409-runId: "run-sdk-e2e",
410-sessionKey: "main",
411-status: "completed",
412-startedAt: 123,
413-endedAt: 456,
414-});
415-await expect(run.cancel()).resolves.toMatchObject({
416-abortedRunId: "run-sdk-e2e",
417-status: "aborted",
418-});
413+expect(result.runId).toBe("run-sdk-e2e");
414+expect(result.sessionKey).toBe("main");
415+expect(result.status).toBe("completed");
416+expect(result.startedAt).toBe(123);
417+expect(result.endedAt).toBe(456);
418+const cancelResult = expectJsonObject(await run.cancel());
419+expect(cancelResult.abortedRunId).toBe("run-sdk-e2e");
420+expect(cancelResult.status).toBe("aborted");
419421} finally {
420422await oc.close();
421423await gateway.close();
@@ -432,65 +434,78 @@ describe("OpenClaw SDK websocket e2e", () => {
432434const oc = new OpenClaw({ transport });
433435434436try {
435-await expect(oc.agents.list()).resolves.toMatchObject({ agents: [{ id: "main" }] });
437+const agents = expectJsonObject(await oc.agents.list());
438+expect(agents.agents).toEqual([{ id: "main" }]);
436439const agent = await oc.agents.get("main");
437-await expect(agent.identity({ sessionKey: "sdk-session" })).resolves.toMatchObject({
438-agentId: "main",
439-sessionKey: "sdk-session",
440-});
441-await expect(oc.agents.create({ id: "sdk-agent" })).resolves.toMatchObject({
442-method: "agents.create",
443-});
444-await expect(
445-oc.agents.update({ id: "sdk-agent", label: "SDK Agent" }),
446-).resolves.toMatchObject({ method: "agents.update" });
447-await expect(oc.agents.delete({ id: "sdk-agent" })).resolves.toMatchObject({
448-method: "agents.delete",
449-});
440+const identity = expectJsonObject(await agent.identity({ sessionKey: "sdk-session" }));
441+expect(identity.agentId).toBe("main");
442+expect(identity.sessionKey).toBe("sdk-session");
443+const createAgent = expectJsonObject(await oc.agents.create({ id: "sdk-agent" }));
444+expect(createAgent.method).toBe("agents.create");
445+const updateAgent = expectJsonObject(
446+await oc.agents.update({ id: "sdk-agent", label: "SDK Agent" }),
447+);
448+expect(updateAgent.method).toBe("agents.update");
449+const deleteAgent = expectJsonObject(await oc.agents.delete({ id: "sdk-agent" }));
450+expect(deleteAgent.method).toBe("agents.delete");
450451451-await expect(oc.sessions.list()).resolves.toMatchObject({
452-sessions: [{ key: "sdk-session" }],
453-});
452+const sessions = expectJsonObject(await oc.sessions.list());
453+expect(sessions.sessions).toEqual([{ key: "sdk-session" }]);
454454const session = await oc.sessions.create({ key: "sdk-session", agentId: "main" });
455455expect(session.key).toBe("sdk-session");
456-await expect(oc.sessions.resolve({ key: "sdk-session" })).resolves.toMatchObject({
457-key: "sdk-session",
458-});
456+const resolvedSession = expectJsonObject(await oc.sessions.resolve({ key: "sdk-session" }));
457+expect(resolvedSession.key).toBe("sdk-session");
459458const sessionRun = await session.send("continue");
460459expect(sessionRun.id).toBe("run-session-e2e");
461-await expect(session.abort(sessionRun.id)).resolves.toMatchObject({
462-abortedRunId: "run-session-e2e",
463-});
464-await expect(session.patch({ label: "Renamed" })).resolves.toMatchObject({
465-method: "sessions.patch",
466-});
467-await expect(session.compact({ maxLines: 200 })).resolves.toMatchObject({
468-method: "sessions.compact",
469-});
470-471-await expect(oc.tasks.list({ status: "running" })).resolves.toMatchObject({
472-tasks: [{ id: "task-sdk-e2e" }],
473-});
474-await expect(oc.tasks.get("task-sdk-e2e")).resolves.toMatchObject({
475-task: { id: "task-sdk-e2e" },
476-});
477-await expect(oc.tasks.cancel("task-sdk-e2e")).resolves.toMatchObject({
478-cancelled: true,
460+const abortSession = expectJsonObject(await session.abort(sessionRun.id));
461+expect(abortSession.abortedRunId).toBe("run-session-e2e");
462+const patchSession = expectJsonObject(await session.patch({ label: "Renamed" }));
463+expect(patchSession.method).toBe("sessions.patch");
464+const compactSession = expectJsonObject(await session.compact({ maxLines: 200 }));
465+expect(compactSession.method).toBe("sessions.compact");
466+467+const tasks = await oc.tasks.list({ status: "running" });
468+expect(tasks.tasks).toEqual([
469+{
470+id: "task-sdk-e2e",
471+status: "running",
472+title: "SDK task",
473+runId: "run-sdk-e2e",
474+sessionKey: "sdk-session",
475+},
476+]);
477+const task = await oc.tasks.get("task-sdk-e2e");
478+expect(task.task).toEqual({
479+id: "task-sdk-e2e",
480+status: "running",
481+title: "SDK task",
479482});
480-481-await expect(oc.models.list()).resolves.toMatchObject({ models: [{ id: "gpt-5.4" }] });
482-await expect(oc.models.status({ probe: false })).resolves.toMatchObject({ providers: [] });
483-await expect(oc.tools.list()).resolves.toMatchObject({ tools: [{ name: "shell" }] });
484-await expect(oc.tools.effective({ sessionKey: "sdk-session" })).resolves.toMatchObject({
485-tools: [{ name: "shell", enabled: true }],
483+const cancelledTask = await oc.tasks.cancel("task-sdk-e2e");
484+expect(cancelledTask.cancelled).toBe(true);
485+486+const models = expectJsonObject(await oc.models.list());
487+expect(models.models).toEqual([{ id: "gpt-5.4" }]);
488+const modelStatus = expectJsonObject(await oc.models.status({ probe: false }));
489+expect(modelStatus.providers).toEqual([]);
490+const tools = expectJsonObject(await oc.tools.list());
491+expect(tools.tools).toEqual([{ name: "shell" }]);
492+const effectiveTools = expectJsonObject(
493+await oc.tools.effective({ sessionKey: "sdk-session" }),
494+);
495+expect(effectiveTools.tools).toEqual([{ name: "shell", enabled: true }]);
496+const toolResult = await oc.tools.invoke("shell", {
497+args: { command: "pwd" },
498+sessionKey: "sdk-session",
486499});
487-await expect(
488-oc.tools.invoke("shell", { args: { command: "pwd" }, sessionKey: "sdk-session" }),
489-).resolves.toMatchObject({ ok: true, toolName: "shell", output: { ok: true } });
490-await expect(oc.approvals.list()).resolves.toMatchObject({ approvals: [] });
491-await expect(
492-oc.approvals.respond("approval-1", { decision: "approve" }),
493-).resolves.toMatchObject({ ok: true });
500+expect(toolResult.ok).toBe(true);
501+expect(toolResult.toolName).toBe("shell");
502+expect(toolResult.output).toEqual({ ok: true });
503+const approvals = expectJsonObject(await oc.approvals.list());
504+expect(approvals.approvals).toEqual([]);
505+const approvalResult = expectJsonObject(
506+await oc.approvals.respond("approval-1", { decision: "approve" }),
507+);
508+expect(approvalResult.ok).toBe(true);
494509495510expect(gateway.requests.map((request) => request.method)).toEqual([
496511"connect",
@@ -639,8 +654,9 @@ function readLiveTextDelta(data: unknown): string {
639654}
640655641656function expectArrayProperty(value: unknown, property: string): void {
642-expect(value).toEqual(expect.objectContaining({ [property]: expect.arrayContaining([]) }));
643-expect(Array.isArray((value as Record<string, unknown>)[property])).toBe(true);
657+expect(value && typeof value).toBe("object");
658+const record = value as Record<string, unknown>;
659+expect(Array.isArray(record[property])).toBe(true);
644660}
645661646662liveGatewayDescribe("OpenClaw SDK live Gateway e2e", () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。