From bccf173544a639f38949cad93e343831ea9874eb Mon Sep 17 00:00:00 2001 From: Carmine DiMascio Date: Wed, 15 Jan 2020 20:52:26 -0500 Subject: [PATCH] empty response passes response check #219 --- src/middlewares/openapi.response.validator.ts | 9 +++++ test/resources/response.validation.yaml | 14 ++++++++ test/response.validation.spec.ts | 36 +++++++++++++++++++ 3 files changed, 59 insertions(+) diff --git a/src/middlewares/openapi.response.validator.ts b/src/middlewares/openapi.response.validator.ts index c64d37cb..b4709cfb 100644 --- a/src/middlewares/openapi.response.validator.ts +++ b/src/middlewares/openapi.response.validator.ts @@ -104,6 +104,9 @@ export class ResponseValidator { // assume valid return; } + if (!body) { + throw validationError(500, '.response', 'response body required.'); + } const valid = validator({ response: body, }); @@ -127,6 +130,9 @@ export class ResponseValidator { responses: OpenAPIV3.ResponsesObject, ): { [key: string]: ajv.ValidateFunction } { const canValidate = response => { + if (!response.content) { + return 'no_content'; + } if (typeof response.content !== 'object') { return false; } @@ -157,6 +163,9 @@ export class ResponseValidator { // don't validate // assume is valid continue; + } else if (mediaTypeToValidate === 'no_content') { + schemas[name] = {}; + continue; } const schema = response.content[mediaTypeToValidate].schema; diff --git a/test/resources/response.validation.yaml b/test/resources/response.validation.yaml index 7cc88841..574ed4e5 100644 --- a/test/resources/response.validation.yaml +++ b/test/resources/response.validation.yaml @@ -14,6 +14,20 @@ info: servers: - url: /v1 paths: + /empty_response: + description: get empty response + summary: get empty response + get: + description: get empty response + operationId: get empty resp + parameters: + - name: mode + in: query + schema: + type: string + responses: + '200': + description: empty /pets: description: endpoints for pets summary: endpoints for pets diff --git a/test/response.validation.spec.ts b/test/response.validation.spec.ts index bb0d44b6..6fa5fa90 100644 --- a/test/response.validation.spec.ts +++ b/test/response.validation.spec.ts @@ -19,6 +19,9 @@ describe(packageJson.name, () => { }, 3005, app => { + app.get(`${app.basePath}/empty_response`, (req, res) => { + return res.end(); + }); app.get(`${app.basePath}/users`, (req, res) => { const json = ['user1', 'user2', 'user3']; return res.json(json); @@ -38,7 +41,12 @@ describe(packageJson.name, () => { }, { id: 3, name: 'name', tag: 'tag' }, ]; + } else if (req.query.mode === 'empty_object') { + json = {}; + } else if (req.query.mode === 'empty_response') { + return res.json(); } + return res.json(json); }); app.post(`${app.basePath}/no_additional_props`, (req, res) => { @@ -70,6 +78,34 @@ describe(packageJson.name, () => { .that.equals(500); })); + it('should fail if response is response is empty object', async () => + request(app) + .get(`${app.basePath}/pets?mode=empty_object`) + .expect(500) + .then((r: any) => { + console.log(r.body); + expect(r.body.message).to.contain('should be array'); + expect(r.body) + .to.have.property('code') + .that.equals(500); + })); + + it('should fail if response is response is empty', async () => + request(app) + .get(`${app.basePath}/pets?mode=empty_response`) + .expect(500) + .then((r: any) => { + expect(r.body.message).to.contain('body required'); + expect(r.body) + .to.have.property('code') + .that.equals(500); + })); + + it('should return 200 for endpoints that return empty response', async () => + request(app) + .get(`${app.basePath}/empty_response`) + .expect(200)); + it('should fail if additional properties are provided when set false', async () => request(app) .post(`${app.basePath}/no_additional_props`)