import { describe, it, expect, vi, beforeEach } from "vitest";
import { createStatusResource } from "../status.js";
import type { MySQLAdapter } from "../../MySQLAdapter.js";
import {
createMockMySQLAdapter,
createMockRequestContext,
createMockQueryResult,
} from "../../../../__tests__/mocks/index.js";
describe("Status Resource", () => {
let mockAdapter: ReturnType<typeof createMockMySQLAdapter>;
let mockContext: ReturnType<typeof createMockRequestContext>;
beforeEach(() => {
vi.clearAllMocks();
mockAdapter = createMockMySQLAdapter();
mockContext = createMockRequestContext();
});
it("should map query results to status object", async () => {
mockAdapter.executeQuery.mockResolvedValueOnce(
createMockQueryResult([
{ Variable_name: "Uptime", Value: "1000" },
{ Variable_name: "Threads_connected", Value: "5" },
]),
);
const resource = createStatusResource(
mockAdapter as unknown as MySQLAdapter,
);
const result = await resource.handler("mysql://status", mockContext);
expect(result).toEqual({
status: {
Uptime: "1000",
Threads_connected: "5",
},
});
expect(mockAdapter.executeQuery).toHaveBeenCalledWith("SHOW GLOBAL STATUS");
});
it("should handle empty results", async () => {
mockAdapter.executeQuery.mockResolvedValueOnce(createMockQueryResult([]));
const resource = createStatusResource(
mockAdapter as unknown as MySQLAdapter,
);
const result = await resource.handler("mysql://status", mockContext);
expect(result).toEqual({ status: {} });
});
it("should handle null query results", async () => {
mockAdapter.executeQuery.mockResolvedValueOnce(
createMockQueryResult(null as any),
);
const resource = createStatusResource(
mockAdapter as unknown as MySQLAdapter,
);
const result = await resource.handler("mysql://status", mockContext);
expect(result).toEqual({ status: {} });
});
it("should propagate errors", async () => {
mockAdapter.executeQuery.mockRejectedValue(new Error("Connection failed"));
const resource = createStatusResource(
mockAdapter as unknown as MySQLAdapter,
);
await expect(
resource.handler("mysql://status", mockContext),
).rejects.toThrow("Connection failed");
});
});