2026-03-31 20:21:13 +01:00
|
|
|
import { describe, expect, it, beforeEach, afterEach } from "vitest";
|
|
|
|
|
import type { ServerAdapterModule } from "../adapters/index.js";
|
|
|
|
|
import {
|
|
|
|
|
findServerAdapter,
|
|
|
|
|
listAdapterModels,
|
|
|
|
|
registerServerAdapter,
|
|
|
|
|
requireServerAdapter,
|
|
|
|
|
unregisterServerAdapter,
|
|
|
|
|
} from "../adapters/index.js";
|
|
|
|
|
|
|
|
|
|
const externalAdapter: ServerAdapterModule = {
|
|
|
|
|
type: "external_test",
|
|
|
|
|
execute: async () => ({
|
|
|
|
|
exitCode: 0,
|
|
|
|
|
signal: null,
|
|
|
|
|
timedOut: false,
|
|
|
|
|
}),
|
|
|
|
|
testEnvironment: async () => ({
|
|
|
|
|
adapterType: "external_test",
|
|
|
|
|
status: "pass",
|
|
|
|
|
checks: [],
|
|
|
|
|
testedAt: new Date(0).toISOString(),
|
|
|
|
|
}),
|
|
|
|
|
models: [{ id: "external-model", label: "External Model" }],
|
|
|
|
|
supportsLocalAgentJwt: false,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
describe("server adapter registry", () => {
|
|
|
|
|
beforeEach(() => {
|
|
|
|
|
unregisterServerAdapter("external_test");
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
afterEach(() => {
|
|
|
|
|
unregisterServerAdapter("external_test");
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("registers external adapters and exposes them through lookup helpers", async () => {
|
|
|
|
|
expect(findServerAdapter("external_test")).toBeNull();
|
|
|
|
|
|
|
|
|
|
registerServerAdapter(externalAdapter);
|
|
|
|
|
|
|
|
|
|
expect(requireServerAdapter("external_test")).toBe(externalAdapter);
|
|
|
|
|
expect(await listAdapterModels("external_test")).toEqual([
|
|
|
|
|
{ id: "external-model", label: "External Model" },
|
|
|
|
|
]);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("removes external adapters when unregistered", () => {
|
|
|
|
|
registerServerAdapter(externalAdapter);
|
|
|
|
|
|
|
|
|
|
unregisterServerAdapter("external_test");
|
|
|
|
|
|
|
|
|
|
expect(findServerAdapter("external_test")).toBeNull();
|
|
|
|
|
expect(() => requireServerAdapter("external_test")).toThrow(
|
|
|
|
|
"Unknown adapter type: external_test",
|
|
|
|
|
);
|
|
|
|
|
});
|
2026-04-03 22:17:34 +01:00
|
|
|
|
|
|
|
|
it("allows external plugin to override a built-in adapter type", () => {
|
|
|
|
|
// claude_local is always built-in
|
|
|
|
|
const builtIn = findServerAdapter("claude_local");
|
|
|
|
|
expect(builtIn).not.toBeNull();
|
|
|
|
|
|
|
|
|
|
const plugin: ServerAdapterModule = {
|
|
|
|
|
type: "claude_local",
|
|
|
|
|
execute: async () => ({
|
|
|
|
|
exitCode: 0,
|
|
|
|
|
signal: null,
|
|
|
|
|
timedOut: false,
|
|
|
|
|
}),
|
|
|
|
|
testEnvironment: async () => ({
|
|
|
|
|
adapterType: "claude_local",
|
|
|
|
|
status: "pass",
|
|
|
|
|
checks: [],
|
|
|
|
|
testedAt: new Date(0).toISOString(),
|
|
|
|
|
}),
|
|
|
|
|
models: [{ id: "plugin-model", label: "Plugin Override" }],
|
|
|
|
|
supportsLocalAgentJwt: false,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
registerServerAdapter(plugin);
|
|
|
|
|
|
|
|
|
|
// Plugin wins
|
|
|
|
|
const resolved = requireServerAdapter("claude_local");
|
|
|
|
|
expect(resolved).toBe(plugin);
|
|
|
|
|
expect(resolved.models).toEqual([
|
|
|
|
|
{ id: "plugin-model", label: "Plugin Override" },
|
|
|
|
|
]);
|
|
|
|
|
});
|
2026-03-31 20:21:13 +01:00
|
|
|
});
|