import { describe, expect, it } from "@effect/vitest";import { Effect } from "effect"; import { OpenApiParseError } from "./errors";import { parse } from "./parse"; describe("OpenAPI parse", () => { it.effect("parses JSON OpenAPI documents", () => Effect.gen(function* () { const doc = yield* parse( JSON.stringify({ openapi: "3.1.0", info: { title: "Test", version: "1.0.0" }, paths: {}, }), ); expect(doc.openapi).toBe("3.1.0"); }), ); it.effect("parses YAML OpenAPI documents", () => Effect.gen(function* () { const doc = yield* parse(`openapi: 3.0.0info: title: Test version: 1.0.0paths: {}`); expect(doc.openapi).toBe("3.0.0"); }), ); it.effect("falls back to YAML for flow-style YAML documents", () => Effect.gen(function* () { const doc = yield* parse(`{ openapi: 3.0.0, info: { title: Test, version: 1.0.0 }, paths: {}}`); expect(doc.openapi).toBe("3.0.0"); }), ); it.effect("returns a stable parse error for empty documents", () => Effect.gen(function* () { const error = yield* parse("").pipe(Effect.flip); expect(error).toBeInstanceOf(OpenApiParseError); expect(error).toHaveProperty("message", "OpenAPI document is empty"); }), ); it.effect("returns a stable parse error for non-object documents", () => Effect.gen(function* () { const error = yield* parse("[]").pipe(Effect.flip); expect(error).toBeInstanceOf(OpenApiParseError); expect(error).toHaveProperty("message", "OpenAPI document must parse to an object"); }), ); it.effect("parses Graph-sized YAML OpenAPI documents", () => Effect.gen(function* () { const largeDescription = "x".repeat(36 * 1024 * 1024); const doc = yield* parse( `openapi: 3.0.0info: title: Large Test version: 1.0.0 description: "${largeDescription}"paths: {}`, ); expect(doc.info.title).toBe("Large Test"); expect(doc.info.description).toHaveLength(largeDescription.length); }), );});
import { describe, expect, it } from "@effect/vitest";
import { Effect } from "effect";
import { OpenApiParseError } from "./errors";
import { parse } from "./parse";
describe("OpenAPI parse", () => {
it.effect("parses JSON OpenAPI documents", () =>
Effect.gen(function* () {
const doc = yield* parse(
JSON.stringify({
openapi: "3.1.0",
info: { title: "Test", version: "1.0.0" },
paths: {},
}),
);
expect(doc.openapi).toBe("3.1.0");
}),
);
it.effect("parses YAML OpenAPI documents", () =>
Effect.gen(function* () {
const doc = yield* parse(`
openapi: 3.0.0
info:
title: Test
version: 1.0.0
paths: {}
`);
expect(doc.openapi).toBe("3.0.0");
}),
);
it.effect("falls back to YAML for flow-style YAML documents", () =>
Effect.gen(function* () {
const doc = yield* parse(`
{
openapi: 3.0.0,
info: { title: Test, version: 1.0.0 },
paths: {}
}
`);
expect(doc.openapi).toBe("3.0.0");
}),
);
it.effect("returns a stable parse error for empty documents", () =>
Effect.gen(function* () {
const error = yield* parse("").pipe(Effect.flip);
expect(error).toBeInstanceOf(OpenApiParseError);
expect(error).toHaveProperty("message", "OpenAPI document is empty");
}),
);
it.effect("returns a stable parse error for non-object documents", () =>
Effect.gen(function* () {
const error = yield* parse("[]").pipe(Effect.flip);
expect(error).toBeInstanceOf(OpenApiParseError);
expect(error).toHaveProperty("message", "OpenAPI document must parse to an object");
}),
);
it.effect("parses Graph-sized YAML OpenAPI documents", () =>
Effect.gen(function* () {
const largeDescription = "x".repeat(36 * 1024 * 1024);
const doc = yield* parse(
`openapi: 3.0.0
info:
title: Large Test
version: 1.0.0
description: "${largeDescription}"
paths: {}
`,
);
expect(doc.info.title).toBe("Large Test");
expect(doc.info.description).toHaveLength(largeDescription.length);
}),
);
});