Files
reverse-engineering-anything/tests/conformance/verifiers/clientSchemaItemConstraints.test.ts
T
morluto eecadf35b2 fix(verification): unify client schema traversal and reference checks
Share ordered schema positions between Gemini literal checks, DeepSeek regex
checks, and catalog array-shape checks. Reuse the canonical keyword and local
reference owners; keep unreferenced instance literals opaque and unresolved
external or dynamic targets unknown.

Gemini and catalog checks now catch constraints in schemas reached through
references into examples. Preserve source paths, resource scopes, cycles and
regex occurrence counts. Align fixture first-error selection with the native
Gemini check and use consistent bracketed array locations in diagnostics.

Validation: 55 focused tests passed, including full/compact MCP catalogs;
typecheck, lint, discovery, and Node source-loader checks passed. The old
Gemini scanner reproduced the local-reference false negative. Installed
Gemini and DeepSeek clients were not run.
2026-10-26 17:15:58 +08:00

58 lines
1.6 KiB
TypeScript

import { expect, it } from "vitest";
import {
arrayItemSchemaError,
strictGatewayItemSchemaErrors,
} from "../../fixtures/mcpClientSchemaConstraints.js";
it("checks client array requirements when a reference selects literal-held schemas", () => {
const literal = { examples: [{ type: "array" }] };
expect(arrayItemSchemaError(literal, "tool")).toBeUndefined();
expect(
arrayItemSchemaError({ ...literal, $ref: "#/examples/0" }, "tool"),
).toBe("tool.examples[0]: tool parameters array type must have items");
expect(
arrayItemSchemaError(
{
$ref: "#/examples/0",
examples: [{ type: "array", items: { type: "string" } }],
},
"tool",
),
).toBeUndefined();
});
it.each([
{
selected: { type: "object", items: { type: "string" } },
error: 'tool.examples[0].items is beside type "object"',
},
{
selected: {
type: "array",
items: { anyOf: [{ type: "string" }, { type: "number" }] },
},
error: "tool.examples[0].items is an untyped union",
},
])(
"checks referenced gateway item constraints: $error",
({ selected, error }) => {
const literal = { examples: [selected] };
expect(strictGatewayItemSchemaErrors(literal, "tool")).toEqual([]);
expect(
strictGatewayItemSchemaErrors(
{ ...literal, $ref: "#/examples/0" },
"tool",
),
).toEqual([error]);
expect(
strictGatewayItemSchemaErrors(
{
$ref: "#/examples/0",
examples: [{ type: "array", items: { type: "string" } }],
},
"tool",
),
).toEqual([]);
},
);