Skip to content

Commit c964c1a

Browse files
committed
Added support for option includeDeprecated in validateTransactionV2()
1 parent 2de3d44 commit c964c1a

File tree

3 files changed

+96
-91
lines changed

3 files changed

+96
-91
lines changed

libV2/schemaUtils.js

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -539,7 +539,8 @@ let QUERYPARAM = 'query',
539539
concreteUtils.compareTypes(schema.type, SCHEMA_TYPES.object) ||
540540
schema.hasOwnProperty('properties')
541541
) {
542-
let resolvedSchemaProps = {};
542+
let resolvedSchemaProps = {},
543+
{ includeDeprecated } = context.computedOptions;
543544

544545
_.forOwn(schema.properties, (property, propertyName) => {
545546
if (
@@ -552,6 +553,11 @@ let QUERYPARAM = 'query',
552553
delete property.format;
553554
}
554555

556+
// Skip addition of deprecated properties based on provided options
557+
if (!includeDeprecated && property.deprecated) {
558+
return;
559+
}
560+
555561
resolvedSchemaProps[propertyName] = resolveSchema(context, property, stack, resolveFor, _.cloneDeep(seenRef));
556562
});
557563

@@ -1421,14 +1427,15 @@ let QUERYPARAM = 'query',
14211427

14221428
resolveQueryParamsForPostmanRequest = (context, operationItem, method) => {
14231429
const params = resolvePathItemParams(context, operationItem[method].parameters, operationItem.parameters),
1424-
pmParams = [];
1430+
pmParams = [],
1431+
{ includeDeprecated } = context.computedOptions;
14251432

14261433
_.forEach(params, (param) => {
14271434
if (_.has(param, '$ref')) {
14281435
param = resolveSchema(context, param);
14291436
}
14301437

1431-
if (param.in !== QUERYPARAM) {
1438+
if (param.in !== QUERYPARAM || (!includeDeprecated && param.deprecated)) {
14321439
return;
14331440
}
14341441

@@ -1509,14 +1516,14 @@ let QUERYPARAM = 'query',
15091516
resolveHeadersForPostmanRequest = (context, operationItem, method) => {
15101517
const params = resolvePathItemParams(context, operationItem[method].parameters, operationItem.parameters),
15111518
pmParams = [],
1512-
{ keepImplicitHeaders } = context.computedOptions;
1519+
{ keepImplicitHeaders, includeDeprecated } = context.computedOptions;
15131520

15141521
_.forEach(params, (param) => {
15151522
if (_.has(param, '$ref')) {
15161523
param = resolveSchema(context, param);
15171524
}
15181525

1519-
if (param.in !== HEADER) {
1526+
if (param.in !== HEADER || (!includeDeprecated && param.deprecated)) {
15201527
return;
15211528
}
15221529

@@ -1585,13 +1592,18 @@ let QUERYPARAM = 'query',
15851592
},
15861593

15871594
resolveResponseHeaders = (context, responseHeaders) => {
1588-
const headers = [];
1595+
const headers = [],
1596+
{ includeDeprecated } = context.computedOptions;
15891597

15901598
if (_.has(responseHeaders, '$ref')) {
15911599
responseHeaders = resolveSchema(context, responseHeaders);
15921600
}
15931601

15941602
_.forOwn(responseHeaders, (value, headerName) => {
1603+
if (!includeDeprecated && value.deprecated) {
1604+
return;
1605+
}
1606+
15951607
let headerValue = resolveValueOfParameter(context, value);
15961608

15971609
if (typeof headerValue === 'number' || typeof headerValue === 'boolean') {

libV2/validationUtils.js

Lines changed: 4 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ const _ = require('lodash'),
2222
getServersPathVars } = require('../lib/common/schemaUtilsCommon.js'),
2323

2424
{ findMatchingRequestFromSchema, isPmVariable } = require('./requestMatchingUtils'),
25-
traverseUtility = require('traverse'),
2625

2726
// common global constants
2827
SCHEMA_FORMATS = {
@@ -114,22 +113,6 @@ function getDefaultContext (options, components = {}) {
114113
};
115114
}
116115

117-
/**
118-
* Remove or keep the deprecated properties according to the option
119-
* @param {object} resolvedSchema - the schema to verify properties
120-
* @param {boolean} includeDeprecated - Whether to include the deprecated properties
121-
* @returns {undefined} undefined
122-
*/
123-
function verifyDeprecatedProperties(resolvedSchema, includeDeprecated) {
124-
traverseUtility(resolvedSchema.properties).forEach(function (property) {
125-
if (property && typeof property === 'object') {
126-
if (property.deprecated === true && includeDeprecated === false) {
127-
this.delete();
128-
}
129-
}
130-
});
131-
}
132-
133116
/**
134117
* Verifies if the deprecated operations should be added
135118
*
@@ -167,8 +150,7 @@ function safeSchemaFaker (context, oldSchema, resolveTo, resolveFor, parameterSo
167150
let concreteUtils = components && components.hasOwnProperty('concreteUtils') ?
168151
components.concreteUtils :
169152
DEFAULT_SCHEMA_UTILS;
170-
const indentCharacter = options.indentCharacter,
171-
includeDeprecated = options.includeDeprecated;
153+
const indentCharacter = options.indentCharacter;
172154

173155
resolvedSchema = resolveSchema(context, oldSchema, 0, PROCESSING_TYPE.VALIDATION);
174156

@@ -218,7 +200,6 @@ function safeSchemaFaker (context, oldSchema, resolveTo, resolveFor, parameterSo
218200
}
219201
}
220202
}
221-
verifyDeprecatedProperties(resolvedSchema, includeDeprecated);
222203
}
223204

224205
try {
@@ -646,26 +627,6 @@ function getSuggestedValue (fakedValue, actualValue, ajvValidationErrorObj) {
646627
return suggestedValue;
647628
}
648629

649-
/**
650-
* Returns all security params that can be applied during converion.
651-
*
652-
* @param {Object} components - OpenAPI components
653-
* @param {String} location - location for which we want to get security params (i.e. 'header' | 'query')
654-
* @returns {Array} applicable security params
655-
*/
656-
function getSecurityParams (components, location) {
657-
let securityDefs = _.get(components, 'securitySchemes', {}),
658-
securityParams = [];
659-
660-
_.forEach(securityDefs, (securityDef) => {
661-
// Currently we only apply header and query for apiKey type of security param during conversion
662-
if (_.get(securityDef, 'type') === 'apiKey' && _.get(securityDef, 'in') === location) {
663-
securityParams.push(securityDef);
664-
}
665-
});
666-
return securityParams;
667-
}
668-
669630
/**
670631
* Tests whether given parameter is of complex array type from param key
671632
*
@@ -1762,22 +1723,19 @@ function checkQueryParams (context, queryParams, transactionPathPrefix, schemaPa
17621723
let schemaParams = _.filter(schemaPath.parameters, (param) => { return param.in === 'query'; }),
17631724
requestQueryParams = [],
17641725
resolvedSchemaParams = [],
1765-
mismatchProperty = 'QUERYPARAM',
1766-
securityParams;
1726+
mismatchProperty = 'QUERYPARAM';
17671727

17681728
if (options.validationPropertiesToIgnore.includes(mismatchProperty)) {
17691729
return callback(null, []);
17701730
}
17711731

1772-
// filter out query params added by security schemes
1773-
securityParams = _.map(getSecurityParams(_.get(components, 'components'), 'query'), 'name');
17741732
requestQueryParams = _.filter(queryParams, (pQuery) => {
17751733
// Ignoring the disabled query params
17761734
if (pQuery.disabled === true) {
17771735
return false;
17781736
}
17791737

1780-
return !_.includes(securityParams, pQuery.key) && pQuery.value !== OAS_NOT_SUPPORTED;
1738+
return pQuery.value !== OAS_NOT_SUPPORTED;
17811739
});
17821740

17831741
// resolve schema params
@@ -1899,8 +1857,6 @@ function checkQueryParams (context, queryParams, transactionPathPrefix, schemaPa
18991857
function checkRequestHeaders (context, headers, transactionPathPrefix, schemaPathPrefix, schemaPath,
19001858
components, options, schemaCache, jsonSchemaDialect, callback) {
19011859
let schemaHeaders = _.filter(schemaPath.parameters, (param) => { return param.in === 'header'; }),
1902-
// key name of headers which are added by security schemes
1903-
securityHeaders = _.map(getSecurityParams(_.get(components, 'components'), 'header'), 'name'),
19041860
// filter out headers for following cases
19051861
reqHeaders = _.filter(headers, (header) => {
19061862
// 1. If header is disabled
@@ -1910,8 +1866,7 @@ function checkRequestHeaders (context, headers, transactionPathPrefix, schemaPat
19101866
return !header.disabled;
19111867
}
19121868

1913-
return !_.includes(IMPLICIT_HEADERS, _.toLower(_.get(header, 'key'))) &&
1914-
!_.includes(securityHeaders, header.key);
1869+
return !_.includes(IMPLICIT_HEADERS, _.toLower(_.get(header, 'key')));
19151870
}),
19161871
mismatchProperty = 'HEADER';
19171872

test/unit/convertV2.test.js

Lines changed: 74 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ const expect = require('chai').expect,
5555
invalidNullInfoTitle = path.join(__dirname, INVALID_OPENAPI_PATH, '/invalid-info-null-title.json'),
5656
invalidNullInfoVersion = path.join(__dirname, INVALID_OPENAPI_PATH, '/invalid-info-null-version.json'),
5757
onlyOneOperationDeprecated = path.join(__dirname, VALID_OPENAPI_PATH, '/has_one_op_dep.json'),
58+
someOperationOneDeprecated = path.join(__dirname, VALID_OPENAPI_PATH, '/has_some_op_dep.json'),
59+
someOperationDeprecatedUsingTags =
60+
path.join(__dirname, VALID_OPENAPI_PATH, '/has_some_op_dep_use_tags.json'),
5861
deprecatedParams =
5962
path.join(__dirname, VALID_OPENAPI_PATH, '/petstore_deprecated_param.json'),
6063
deprecatedProperty =
@@ -1164,31 +1167,68 @@ describe('The convert Function', function() {
11641167
});
11651168
});
11661169

1167-
it('Should convert and include deprecated operations when option is not present' +
1168-
'- has only one op and is deprecated', function () {
1169-
const fileData = fs.readFileSync(onlyOneOperationDeprecated, 'utf8');
1170-
Converter.convertV2({ type: 'string', data: fileData }, undefined,
1171-
(err, result) => {
1172-
expect(err).to.be.null;
1173-
expect(result.result).to.be.true;
1174-
expect(result.output[0].data.item.length).to.equal(1);
1175-
});
1176-
});
1177-
11781170
// TODO: Handle deprecated property config option
1179-
describe.skip('Deprecated property', function () {
1171+
describe('Deprecated property', function () {
1172+
it('Should convert and exclude deprecated operations - has only one op and is deprecated', function () {
1173+
const fileData = fs.readFileSync(onlyOneOperationDeprecated, 'utf8');
1174+
Converter.convertV2({ type: 'string', data: fileData }, { includeDeprecated: false },
1175+
(err, result) => {
1176+
expect(err).to.be.null;
1177+
expect(result.result).to.be.true;
1178+
expect(result.output[0].data.item).to.be.empty;
1179+
});
1180+
});
1181+
1182+
it('Should convert and exclude deprecated operations - has some deprecated', function () {
1183+
const fileData = fs.readFileSync(someOperationOneDeprecated, 'utf8');
1184+
Converter.convertV2({ type: 'string', data: fileData },
1185+
{ includeDeprecated: false },
1186+
(err, result) => {
1187+
expect(err).to.be.null;
1188+
expect(result.result).to.be.true;
1189+
expect(result.output[0].data.item.length).to.equal(1);
1190+
});
1191+
});
1192+
1193+
it('Should convert and exclude deprecated operations - has only one op and is deprecated' +
1194+
'using tags as folder strategy operation has not tag', function () {
1195+
const fileData = fs.readFileSync(onlyOneOperationDeprecated, 'utf8');
1196+
Converter.convertV2({ type: 'string', data: fileData },
1197+
{ includeDeprecated: false, folderStrategy: 'tags' },
1198+
(err, result) => {
1199+
expect(err).to.be.null;
1200+
expect(result.result).to.be.true;
1201+
expect(result.output[0].data.item).to.be.empty;
1202+
});
1203+
});
1204+
1205+
it('Should convert and exclude deprecated operations - has some deprecated' +
1206+
'using tags as folder strategy', function () {
1207+
const fileData = fs.readFileSync(someOperationDeprecatedUsingTags, 'utf8');
1208+
Converter.convertV2({ type: 'string', data: fileData },
1209+
{ includeDeprecated: false, folderStrategy: 'tags' },
1210+
(err, result) => {
1211+
expect(err).to.be.null;
1212+
expect(result.result).to.be.true;
1213+
expect(result.output[0].data.item.length).to.equal(1);
1214+
expect(result.output[0].data.item[0].name).to.equal('pets');
1215+
});
1216+
});
1217+
11801218
it('Should convert and exclude deprecated params when option is set to false', function() {
11811219
const fileData = fs.readFileSync(deprecatedParams, 'utf8');
11821220
Converter.convertV2({ type: 'string', data: fileData },
11831221
{ includeDeprecated: false },
11841222
(err, result) => {
1223+
const req1 = result.output[0].data.item[0],
1224+
req2 = result.output[0].data.item[1];
1225+
11851226
expect(err).to.be.null;
1186-
expect(result.output[0].data.item[0].item[0].request.url.query.length).to.equal(1);
1187-
expect(result.output[0].data.item[0].item[0].request.url.query[0].key).to.equal('variable');
1188-
expect(result.output[0].data.item[0].item[0].request.header.length).to.equal(3);
1189-
expect(result.output[0].data.item[0].item[0].request.header[0].key).to.equal('limit');
1190-
expect(result.output[0].data.item[0].item[0].request.header[1].key).to.equal('limit_2');
1191-
expect(result.output[0].data.item[0].item[1].request.header[0].key).to.equal('limit_2');
1227+
expect(req1.request.url.query.length).to.equal(1);
1228+
expect(req1.request.url.query[0].key).to.equal('variable');
1229+
expect(req1.request.header[0].key).to.equal('limit');
1230+
expect(req1.request.header[1].key).to.equal('limit_2');
1231+
expect(req2.request.header[0].key).to.equal('limit_2');
11921232
});
11931233
});
11941234

@@ -1197,29 +1237,31 @@ describe('The convert Function', function() {
11971237
Converter.convertV2({ type: 'string', data: fileData },
11981238
{ includeDeprecated: true },
11991239
(err, result) => {
1240+
const req = result.output[0].data.item[0];
1241+
12001242
expect(err).to.be.null;
1201-
expect(result.output[0].data.item[0].item[0].request.url.query.length).to.equal(2);
1202-
expect(result.output[0].data.item[0].item[0].request.url.query[0].key).to.equal('variable');
1203-
expect(result.output[0].data.item[0].item[0].request.url.query[1].key).to.equal('variable2');
1204-
expect(result.output[0].data.item[0].item[0].request.header.length).to.equal(4);
1205-
expect(result.output[0].data.item[0].item[0].request.header[0].key).to.equal('limit');
1206-
expect(result.output[0].data.item[0].item[0].request.header[1].key).to.equal('limit_2');
1207-
expect(result.output[0].data.item[0].item[0].request.header[2].key).to.equal('limit_Dep');
1243+
expect(req.request.url.query.length).to.equal(2);
1244+
expect(req.request.url.query[0].key).to.equal('variable');
1245+
expect(req.request.url.query[1].key).to.equal('variable2');
1246+
expect(req.request.header[0].key).to.equal('limit');
1247+
expect(req.request.header[1].key).to.equal('limit_2');
1248+
expect(req.request.header[2].key).to.equal('limit_Dep');
12081249
});
12091250
});
12101251

12111252
it('Should convert and include deprecated params when option is not present', function() {
12121253
const fileData = fs.readFileSync(deprecatedParams, 'utf8');
12131254
Converter.convertV2({ type: 'string', data: fileData }, {},
12141255
(err, result) => {
1256+
const req = result.output[0].data.item[0];
1257+
12151258
expect(err).to.be.null;
1216-
expect(result.output[0].data.item[0].item[0].request.url.query.length).to.equal(2);
1217-
expect(result.output[0].data.item[0].item[0].request.url.query[0].key).to.equal('variable');
1218-
expect(result.output[0].data.item[0].item[0].request.url.query[1].key).to.equal('variable2');
1219-
expect(result.output[0].data.item[0].item[0].request.header.length).to.equal(4);
1220-
expect(result.output[0].data.item[0].item[0].request.header[0].key).to.equal('limit');
1221-
expect(result.output[0].data.item[0].item[0].request.header[1].key).to.equal('limit_2');
1222-
expect(result.output[0].data.item[0].item[0].request.header[2].key).to.equal('limit_Dep');
1259+
expect(req.request.url.query.length).to.equal(2);
1260+
expect(req.request.url.query[0].key).to.equal('variable');
1261+
expect(req.request.url.query[1].key).to.equal('variable2');
1262+
expect(req.request.header[0].key).to.equal('limit');
1263+
expect(req.request.header[1].key).to.equal('limit_2');
1264+
expect(req.request.header[2].key).to.equal('limit_Dep');
12231265
});
12241266
});
12251267

@@ -1257,8 +1299,6 @@ describe('The convert Function', function() {
12571299
.to.equal('deprecated');
12581300
expect(result.output[0].data.item[0].request.url.query[1].key)
12591301
.to.equal('b');
1260-
expect(result.output[0].data.item[0].request.url.query[1].value)
1261-
.to.equal('{"c":"<string>","d":"<string>","deprecated":"<string>"}');
12621302
expect(result.output[0].data.item[0].request.url.variable[0].value)
12631303
.to.equal(';limitPath=deprecated,<boolean>,b,<string>');
12641304
expect(result.output[0].data.item[0].request.header[0].value)
@@ -1276,8 +1316,6 @@ describe('The convert Function', function() {
12761316
.to.equal('deprecated');
12771317
expect(result.output[0].data.item[0].request.url.query[1].key)
12781318
.to.equal('b');
1279-
expect(result.output[0].data.item[0].request.url.query[1].value)
1280-
.to.equal('{"d":"<string>","deprecated":"<string>"}');
12811319
expect(result.output[0].data.item[0].request.url.variable[0].value)
12821320
.to.equal(';limitPath=b,<string>');
12831321
expect(result.output[0].data.item[0].request.header[0].value)

0 commit comments

Comments
 (0)