From 8f916068fc54ddf54ba801ba0fe1686f4deb941c Mon Sep 17 00:00:00 2001 From: Rhys Sullivan <39114868+RhysSullivan@users.noreply.github.com> Date: Tue, 5 May 2026 22:40:57 -0700 Subject: [PATCH] Add OpenAPI parse boundary tests --- .../plugins/openapi/src/sdk/parse.test.ts | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 packages/plugins/openapi/src/sdk/parse.test.ts diff --git a/packages/plugins/openapi/src/sdk/parse.test.ts b/packages/plugins/openapi/src/sdk/parse.test.ts new file mode 100644 index 000000000..c48248d73 --- /dev/null +++ b/packages/plugins/openapi/src/sdk/parse.test.ts @@ -0,0 +1,53 @@ +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("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"); + }), + ); +});