import { describe, it, expect, vi, beforeEach } from "vitest";
import {
createMockMySQLAdapter,
createMockQueryResult,
createMockRequestContext,
} from "../../../../__tests__/mocks/index.js";
import { createSpatialResource } from "../spatial.js";
import type { MySQLAdapter } from "../../MySQLAdapter.js";
describe("Spatial Resource", () => {
let mockAdapter: ReturnType<typeof createMockMySQLAdapter>;
let mockContext: ReturnType<typeof createMockRequestContext>;
beforeEach(() => {
vi.clearAllMocks();
mockAdapter = createMockMySQLAdapter();
mockContext = createMockRequestContext();
});
it("should return spatial columns information", async () => {
mockAdapter.executeQuery.mockResolvedValueOnce(
createMockQueryResult([
{ table_name: "locations", column_name: "geom", data_type: "geometry" },
]),
);
mockAdapter.executeQuery.mockResolvedValueOnce(createMockQueryResult([])); // spatial indexes
const resource = createSpatialResource(
mockAdapter as unknown as MySQLAdapter,
);
const result = await resource.handler("mysql://spatial", mockContext);
expect(result).toBeDefined();
// @ts-ignore
expect(result.spatialColumns).toHaveLength(1);
// @ts-ignore
expect(result.spatialIndexCount).toBe(0);
});
it("should handle null query results", async () => {
mockAdapter.executeQuery.mockResolvedValueOnce(
createMockQueryResult(null as any),
); // Columns
mockAdapter.executeQuery.mockResolvedValueOnce(
createMockQueryResult(null as any),
); // Indexes
const resource = createSpatialResource(
mockAdapter as unknown as MySQLAdapter,
);
const result = await resource.handler("mysql://spatial", mockContext);
expect(result).toEqual({
spatialColumnCount: 0,
spatialColumns: [],
spatialIndexCount: 0,
spatialIndexes: [],
});
});
});