Files
next-tjwater-agent/tests/mcp/queryTimeouts.test.ts
T

35 lines
2.0 KiB
TypeScript

import { expect, it } from "bun:test";
import type { Tool } from "@modelcontextprotocol/client";
import { nativeQueryTimeout, queryTimeouts } from "../../src/mcp/query-timeouts.js";
const simulation: Tool = { name: "run_simulation", inputSchema: { type: "object", properties: {
timeout_seconds: { type: "integer", minimum: 1, maximum: 3600, default: 120 },
} } };
it("budgets calculations independently from their simulated duration and from ordinary reads", () => {
expect(queryTimeouts(simulation, { duration: 86400, timeout_seconds: 900 })).toEqual({ executionMs: 900_000, callMs: 30_000, requestMs: 35_000 });
expect(queryTimeouts(simulation, {})).toEqual({ executionMs: 120_000, callMs: 30_000, requestMs: 35_000 });
expect(queryTimeouts({ name: "list_elements", inputSchema: { type: "object" } }, {})).toEqual({ executionMs: 30_000, callMs: 30_000, requestMs: 35_000 });
});
it("honors the effective advertised maximum and rejects invalid per-call budgets", () => {
for (const timeout_seconds of [0, -1, 1.5, 3601, "900", null, true, NaN, Infinity]) {
expect(() => queryTimeouts(simulation, { timeout_seconds })).toThrow();
}
const limited = { ...simulation, inputSchema: { type: "object" as const, properties: {
timeout_seconds: { type: "integer", maximum: 120, default: 120 },
} } };
expect(queryTimeouts(limited, { timeout_seconds: 120 }).executionMs).toBe(120_000);
expect(() => queryTimeouts(limited, { timeout_seconds: 121 })).toThrow();
expect(nativeQueryTimeout([simulation, limited])).toBe(35_000);
expect(nativeQueryTimeout([limited])).toBe(35_000);
});
it("uses the catalog's thirty-minute burst-location default as a worker execution budget", () => {
const location: Tool = { name: "run_burst_location", inputSchema: { type: "object", properties: {
timeout_seconds: { type: "integer", minimum: 1, maximum: 3600, default: 1800 },
} } };
expect(queryTimeouts(location, {})).toEqual({ executionMs: 1_800_000, callMs: 30_000, requestMs: 35_000 });
expect(nativeQueryTimeout([location])).toBe(35_000);
});