Files
fusion/plugins/fusion-plugin-openclaw-runtime/dist/__tests__/index.test.js
Fusion f85d369bfc feat(FN-2706): merge fusion/fn-2706 (auto-resolved)
- feat(FN-2706): complete Step 6 — document Paperclip REST runtime behavior
- test(FN-2706): cover getAgentIdentity success and request payload assertions
- fix(FN-2706): align promptWithFallback signature with runtime contract
- fix(FN-2706): add session dispose compatibility for engine callers
- fix(FN-2706): refine Paperclip API client error and config handling
- test(FN-2706): complete Step 4 — cover paperclip api client and adapter flow
- feat(FN-2706): complete Step 3 — wire plugin settings and remove engine guard
- feat(FN-2706): complete Step 2 — rewrite paperclip runtime adapter
- fix(FN-2706): restore compatibility exports during runtime migration
- feat(FN-2706): complete Step 1 — add Paperclip REST client
2026-04-27 10:52:46 -07:00

123 lines
5.4 KiB
JavaScript

import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
const { mockResolveGatewayConfig, mockCreateGatewaySession, mockPromptGateway, mockDescribeGatewayModel, mockProbeGateway, } = vi.hoisted(() => ({
mockResolveGatewayConfig: vi.fn().mockReturnValue({
gatewayUrl: "http://127.0.0.1:18789",
gatewayToken: undefined,
agentId: "main",
}),
mockCreateGatewaySession: vi.fn(),
mockPromptGateway: vi.fn(),
mockDescribeGatewayModel: vi.fn().mockReturnValue("openclaw/main"),
mockProbeGateway: vi.fn().mockResolvedValue(true),
}));
vi.mock("../pi-module.js", () => ({
resolveGatewayConfig: mockResolveGatewayConfig,
createGatewaySession: mockCreateGatewaySession,
promptGateway: mockPromptGateway,
describeGatewayModel: mockDescribeGatewayModel,
probeGateway: mockProbeGateway,
}));
import plugin, { openclawRuntimeMetadata, openclawRuntimeFactory, OPENCLAW_RUNTIME_ID } from "../index.js";
import { OpenClawRuntimeAdapter } from "../runtime-adapter.js";
function createMockContext(overrides = {}) {
return {
pluginId: "fusion-plugin-openclaw-runtime",
settings: {},
logger: {
info: vi.fn(),
warn: vi.fn(),
error: vi.fn(),
debug: vi.fn(),
},
emitEvent: vi.fn(),
taskStore: {
getTask: vi.fn(),
},
...overrides,
};
}
describe("openclaw-runtime plugin", () => {
beforeEach(() => {
vi.clearAllMocks();
mockProbeGateway.mockResolvedValue(true);
});
afterEach(() => {
vi.restoreAllMocks();
});
describe("plugin manifest identity", () => {
it("should have correct manifest fields", () => {
expect(plugin.manifest.id).toBe("fusion-plugin-openclaw-runtime");
expect(plugin.manifest.name).toBe("OpenClaw Runtime Plugin");
expect(plugin.manifest.version).toBe("0.1.0");
expect(plugin.manifest.description).toContain("OpenClaw");
expect(plugin.manifest.author).toBe("Fusion Team");
expect(plugin.state).toBe("installed");
});
});
describe("runtime registration", () => {
it("should register openclaw runtime metadata", () => {
expect(plugin.runtime).toBeDefined();
expect(plugin.runtime?.metadata.runtimeId).toBe(OPENCLAW_RUNTIME_ID);
expect(plugin.runtime?.metadata.name).toBe("OpenClaw Runtime");
expect(plugin.runtime?.metadata.description).toContain("OpenClaw-backed AI session");
expect(plugin.runtime?.metadata.version).toBe("0.1.0");
});
it("should have consistent runtime metadata between export and manifest", () => {
expect(plugin.manifest.runtime).toEqual(openclawRuntimeMetadata);
expect(plugin.runtime?.metadata).toEqual(openclawRuntimeMetadata);
});
});
describe("hooks", () => {
it("onLoad should probe gateway, log startup message, and emit loaded event", async () => {
const ctx = createMockContext();
mockResolveGatewayConfig.mockReturnValue({
gatewayUrl: "http://localhost:18789",
gatewayToken: "secret-token",
agentId: "main",
});
await plugin.hooks.onLoad?.(ctx);
expect(mockProbeGateway).toHaveBeenCalledWith("http://localhost:18789");
expect(ctx.logger.info).toHaveBeenCalledWith("OpenClaw Runtime Plugin loaded (gateway: http://localhost:18789, reachable: yes)");
expect(ctx.logger.info.mock.calls.join(" ")).not.toContain("secret-token");
expect(ctx.emitEvent).toHaveBeenCalledWith("openclaw-runtime:loaded", {
runtimeId: OPENCLAW_RUNTIME_ID,
version: "0.1.0",
gatewayUrl: "http://localhost:18789",
gatewayReachable: true,
});
});
it("onUnload should not throw", () => {
expect(() => plugin.hooks.onUnload?.()).not.toThrow();
});
});
describe("runtime factory behavior", () => {
it("should export runtime constants", () => {
expect(OPENCLAW_RUNTIME_ID).toBe("openclaw");
expect(openclawRuntimeMetadata.runtimeId).toBe("openclaw");
expect(typeof openclawRuntimeFactory).toBe("function");
});
it("runtime factory should return executable runtime adapter", async () => {
const runtime = (await openclawRuntimeFactory(createMockContext({
settings: {
gatewayUrl: "http://settings-gateway:18789",
gatewayToken: "plugin-token",
agentId: "ops",
},
})));
expect(mockResolveGatewayConfig).toHaveBeenCalledWith({
gatewayUrl: "http://settings-gateway:18789",
gatewayToken: "plugin-token",
agentId: "ops",
});
expect(runtime).toBeInstanceOf(OpenClawRuntimeAdapter);
expect(runtime.id).toBe("openclaw");
expect(runtime.name).toBe("OpenClaw Runtime");
expect(runtime).not.toHaveProperty("status");
expect(runtime).not.toHaveProperty("execute");
});
it("factory creation should not throw", async () => {
await expect(openclawRuntimeFactory(createMockContext())).resolves.toBeInstanceOf(OpenClawRuntimeAdapter);
});
});
});
//# sourceMappingURL=index.test.js.map