import { describe, it, expect, vi, beforeEach } from "vitest";
import { createCapabilitiesResource } from "../capabilities.js";
import type { MySQLAdapter } from "../../MySQLAdapter.js";
import {
createMockMySQLAdapter,
createMockRequestContext,
createMockQueryResult,
} from "../../../../__tests__/mocks/index.js";
interface CapabilitiesResult {
server: {
version: string;
features: { json: boolean; fulltext: boolean; partitioning: boolean };
};
toolGroups: unknown[];
metaGroups: unknown[];
}
describe("Capabilities Resource", () => {
let mockAdapter: ReturnType<typeof createMockMySQLAdapter>;
let mockContext: ReturnType<typeof createMockRequestContext>;
beforeEach(() => {
vi.clearAllMocks();
mockAdapter = createMockMySQLAdapter();
mockContext = createMockRequestContext();
});
it("should return server capabilities", async () => {
mockAdapter.executeQuery.mockResolvedValue(
createMockQueryResult([{ version: "8.0.35" }]),
);
const resource = createCapabilitiesResource(
mockAdapter as unknown as MySQLAdapter,
);
const result = (await resource.handler(
"mysql://capabilities",
mockContext,
)) as CapabilitiesResult;
expect(result).toHaveProperty("server");
expect(result.server).toHaveProperty("version");
expect(result).toHaveProperty("toolGroups");
expect(result).toHaveProperty("metaGroups");
});
it("should include server features", async () => {
mockAdapter.executeQuery.mockResolvedValue(
createMockQueryResult([{ version: "8.0.35" }]),
);
const resource = createCapabilitiesResource(
mockAdapter as unknown as MySQLAdapter,
);
const result = (await resource.handler(
"mysql://capabilities",
mockContext,
)) as CapabilitiesResult;
expect(result.server).toHaveProperty("features");
expect(result.server.features).toHaveProperty("json");
expect(result.server.features).toHaveProperty("fulltext");
expect(result.server.features).toHaveProperty("partitioning");
});
it("should have correct metadata", () => {
const resource = createCapabilitiesResource(
mockAdapter as unknown as MySQLAdapter,
);
expect(resource.uri).toBe("mysql://capabilities");
expect(resource.mimeType).toBe("application/json");
});
});