From dd66d48042d7630683d4498e46fa3d6fa9ebcd40 Mon Sep 17 00:00:00 2001 From: Sueun Cho Date: Tue, 2 Jun 2026 18:43:13 -0400 Subject: [PATCH] fix: honor optional request bodies during validation --- src/validation.test.ts | 35 +++++++++++++++++++++++++++++++++++ src/validation.ts | 3 +-- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/validation.test.ts b/src/validation.test.ts index 1d04a516..8d55a742 100644 --- a/src/validation.test.ts +++ b/src/validation.test.ts @@ -497,6 +497,7 @@ describe.each([{}, { lazyCompileValidators: true }])('OpenAPIValidator with opts operationId: 'createPet', responses: { 200: { description: 'ok' } }, requestBody: { + required: true, content: { 'application/json': { schema: petSchema, @@ -519,6 +520,19 @@ describe.each([{}, { lazyCompileValidators: true }])('OpenAPIValidator with opts }, }, }, + '/optional-pets': { + post: { + operationId: 'createOptionalPet', + responses: { 200: { description: 'ok' } }, + requestBody: { + content: { + 'application/json': { + schema: petSchema, + }, + }, + }, + }, + }, '/pets/schedule': { post: { operationId: 'createPetSchedule', @@ -642,6 +656,27 @@ describe.each([{}, { lazyCompileValidators: true }])('OpenAPIValidator with opts expect(valid.errors && valid.errors[0].keyword).toBe('parse'); }); + test('passes validation when optional requestBody with one media type is omitted', async () => { + const valid = validator.validateRequest({ + path: '/optional-pets', + method: 'post', + headers, + }); + expect(valid.errors).toBeFalsy(); + }); + + test('fails validation when optional requestBody with one media type is provided but invalid', async () => { + const valid = validator.validateRequest({ + path: '/optional-pets', + method: 'post', + headers, + body: { + age: 40, + }, + }); + expect(valid.errors).toHaveLength(1); + }); + test('allows non-json data when application/json is not the only allowed media type', async () => { const valid = validator.validateRequest({ path: '/pets', diff --git a/src/validation.ts b/src/validation.ts index 88ed6f51..5576bcd6 100644 --- a/src/validation.ts +++ b/src/validation.ts @@ -578,8 +578,7 @@ export class OpenAPIValidator { }, }; requestBodySchema.required = []; - if (_.keys(requestBody.content).length === 1) { - // if application/json is the only specified format, it's required + if (requestBody.required) { requestBodySchema.required.push('requestBody'); }