import { describe, it, expect, vi, beforeEach } from "vitest";
import { createSysSchemaResource } from "../sysschema.js";
import type { MySQLAdapter } from "../../MySQLAdapter.js";
import {
createMockMySQLAdapter,
createMockRequestContext,
createMockQueryResult,
} from "../../../../__tests__/mocks/index.js";
describe("SysSchema Resource", () => {
let mockAdapter: ReturnType<typeof createMockMySQLAdapter>;
let mockContext: ReturnType<typeof createMockRequestContext>;
beforeEach(() => {
vi.clearAllMocks();
mockAdapter = createMockMySQLAdapter();
mockContext = createMockRequestContext();
});
it("should return sys schema diagnostics when available", async () => {
// Mock top users query
mockAdapter.executeQuery.mockResolvedValueOnce(
createMockQueryResult([
{
user: "root",
total_connections: 100,
current_connections: 5,
memory_bytes: 1000000,
},
]),
);
// Mock slow statements query
mockAdapter.executeQuery.mockResolvedValueOnce(
createMockQueryResult([
{
query_preview: "SELECT * FROM large_table",
exec_count: 50,
total_latency: "5s",
},
]),
);
// Mock lock waits query
mockAdapter.executeQuery.mockResolvedValueOnce(
createMockQueryResult([{ lock_wait_count: 0 }]),
);
const resource = createSysSchemaResource(
mockAdapter as unknown as MySQLAdapter,
);
const result = (await resource.handler(
"mysql://sysschema",
mockContext,
)) as { available: boolean; topUsers: unknown[] };
expect(result).toHaveProperty("available", true);
expect(result).toHaveProperty("topUsers");
expect(result).toHaveProperty("slowStatements");
expect(result).toHaveProperty("currentLockWaits", 0);
});
it("should handle sys schema not available", async () => {
mockAdapter.executeQuery.mockRejectedValueOnce(
new Error("sys schema not found"),
);
const resource = createSysSchemaResource(
mockAdapter as unknown as MySQLAdapter,
);
const result = (await resource.handler(
"mysql://sysschema",
mockContext,
)) as { available: boolean; message: string };
expect(result.available).toBe(false);
expect(result).toHaveProperty("message");
});
it("should handle null query results", async () => {
mockAdapter.executeQuery.mockResolvedValueOnce(
createMockQueryResult(null as any),
); // Users
mockAdapter.executeQuery.mockResolvedValueOnce(
createMockQueryResult(null as any),
); // Statements
mockAdapter.executeQuery.mockResolvedValueOnce(
createMockQueryResult(null as any),
); // Locks
const resource = createSysSchemaResource(
mockAdapter as unknown as MySQLAdapter,
);
const result = (await resource.handler(
"mysql://sysschema",
mockContext,
)) as any;
expect(result.topUsers).toEqual([]);
expect(result.slowStatements).toEqual([]);
expect(result.currentLockWaits).toBe(0);
});
});