import { describe, expect, it } from "vitest";
import { analyzeSchema, flattenSchema, nestArguments } from "../../src/repair/flatten.js";
describe("analyzeSchema", () => {
it("does not flatten flat shallow schemas", () => {
const d = analyzeSchema({
type: "object",
properties: { a: { type: "string" }, b: { type: "number" } },
});
expect(d.shouldFlatten).toBe(false);
});
it("flags deep schemas", () => {
const d = analyzeSchema({
type: "object",
properties: {
outer: {
type: "object",
properties: {
middle: {
type: "object",
properties: { leaf: { type: "string" } },
},
},
},
},
});
expect(d.shouldFlatten).toBe(true);
expect(d.maxDepth).toBeGreaterThan(2);
});
it("flags wide schemas (>10 leaves)", () => {
const props: Record<string, { type: string }> = {};
for (let i = 0; i < 12; i++) props[`p${i}`] = { type: "string" };
const d = analyzeSchema({ type: "object", properties: props });
expect(d.shouldFlatten).toBe(true);
expect(d.leafCount).toBe(12);
});
});
describe("flattenSchema / nestArguments roundtrip", () => {
it("flattens nested schema and re-nests arguments", () => {
const schema = {
type: "object",
required: ["user"],
properties: {
user: {
type: "object",
required: ["profile"],
properties: {
profile: {
type: "object",
required: ["name"],
properties: { name: { type: "string" }, age: { type: "integer" } },
},
},
},
},
};
const flat = flattenSchema(schema);
expect(flat.properties).toHaveProperty("user.profile.name");
expect(flat.properties).toHaveProperty("user.profile.age");
expect(flat.required).toEqual(["user.profile.name"]);
const nested = nestArguments({
"user.profile.name": "alice",
"user.profile.age": 30,
});
expect(nested).toEqual({ user: { profile: { name: "alice", age: 30 } } });
});
});