From 112b5e17276c97d91aef4c9584cc5031c11c96a5 Mon Sep 17 00:00:00 2001 From: Carmine DiMascio Date: Tue, 17 Sep 2019 21:30:22 -0400 Subject: [PATCH] specify path --- src/middlewares/openapi.response.validator.ts | 18 +++++++++++++----- test/response.validator.spec.ts | 8 +++++++- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/middlewares/openapi.response.validator.ts b/src/middlewares/openapi.response.validator.ts index 0c84fd6a..fe2df2cf 100644 --- a/src/middlewares/openapi.response.validator.ts +++ b/src/middlewares/openapi.response.validator.ts @@ -2,7 +2,11 @@ import ono from 'ono'; import * as Ajv from 'ajv'; import * as mung from 'express-mung'; import { createResponseAjv } from './ajv'; -import { extractContentType, ajvErrorsToValidatorError } from './util'; +import { + extractContentType, + ajvErrorsToValidatorError, + validationError, +} from './util'; const TYPE_JSON = 'application/json'; @@ -26,7 +30,8 @@ export class ResponseValidator { const responses = req.openapi.schema && req.openapi.schema.responses; const validators = this._getOrBuildValidator(req, responses); const statusCode = res.statusCode; - return this._validate({ validators, body, statusCode }); + const path = req.path; + return this._validate({ validators, body, statusCode, path }); } return body; }); @@ -49,7 +54,7 @@ export class ResponseValidator { return validators; } - _validate({ validators, body, statusCode }) { + _validate({ validators, body, statusCode, path }) { // find the validator for the 'status code' e.g 200, 2XX or 'default' let validator; const status = statusCode; @@ -59,8 +64,11 @@ export class ResponseValidator { else if (statusXX in validators) validator = validators[statusXX]; else if (validators.default) validator = validator.default; else { - // TODO - throw new Error('unknown status code - TODO fix me '); + throw validationError( + 500, + path, + `no schema defined for status code '${status}' in the openapi spec`, + ); } } diff --git a/test/response.validator.spec.ts b/test/response.validator.spec.ts index e97bc804..ed978e89 100644 --- a/test/response.validator.spec.ts +++ b/test/response.validator.spec.ts @@ -23,6 +23,7 @@ describe(packageJson.name, () => { validators, body: { message: 'some error message', code: 400 }, statusCode: 400, + path: '/some-path', }), ).to.not.exist; } catch (e) { @@ -43,6 +44,7 @@ describe(packageJson.name, () => { validators, body: { message, code }, statusCode: code, + path: '/some-path', }), ).to.not.exist; } catch (e) { @@ -62,6 +64,7 @@ describe(packageJson.name, () => { validators, body: [{ id: 'bad-id', name: 'test', tag: 'tag' }], statusCode: 200, + path: '/some-path', }); } catch (e) { expect(e).to.be.not.null; @@ -74,6 +77,7 @@ describe(packageJson.name, () => { validators, body: { id: 1, name: 'test', tag: 'tag' }, statusCode: 200, + path: '/some-path', }); } catch (e) { expect(e).to.be.not.null; @@ -85,6 +89,7 @@ describe(packageJson.name, () => { validators, body: [{ id: 1, name: [], tag: 'tag' }], statusCode: 200, + path: '/some-path', }); } catch (e) { expect(e).to.be.not.null; @@ -99,6 +104,7 @@ describe(packageJson.name, () => { const responses = petsResponseSchema(); const validators = v._getOrBuildValidator(null, responses); const statusCode = 200; + const path = '/some-path'; const body = [ { id: 10, @@ -108,7 +114,7 @@ describe(packageJson.name, () => { }, ]; try { - expect(v._validate({ validators, body, statusCode })).to.not.exist; + expect(v._validate({ validators, body, statusCode, path })).to.not.exist; expect('here').to.be.null; } catch (e) { // TODO include params.additionalProperty: value in error message