Skip to content

Commit

Permalink
Added simplified request and response body matching in case of multip…
Browse files Browse the repository at this point in the history
…le examples
  • Loading branch information
VShingala committed May 14, 2024
1 parent 228c462 commit a9a4f90
Showing 1 changed file with 47 additions and 20 deletions.
67 changes: 47 additions & 20 deletions libV2/schemaUtils.js
Original file line number Diff line number Diff line change
Expand Up @@ -1092,7 +1092,46 @@ let QUERYPARAM = 'query',
* @returns {Array} Examples for corresponding operation
*/
generateExamples = (context, responseExamples, requestBodyExamples, responseBodySchema, isXMLExample) => {
const pmExamples = [];
const pmExamples = [],
exampleKeyExtractor = (example) => { return _.has(example, 'key') && _.toLower(example.key); },
responseExampleKeys = _.map(responseExamples, exampleKeyExtractor),
requestBodyExampleKeys = _.map(requestBodyExamples, exampleKeyExtractor),
matchedKeys = _.intersectionBy(responseExampleKeys, requestBodyExampleKeys, _.toLower),
usedRequestExamples = _.fill(Array(requestBodyExamples.length), false);

/**
* To generate examples, we first try to do matching of request and response examples based on example keys,
* If there is any matching found, we'll create example from it and ignore non-matching keys
*/
if (matchedKeys.length) {
_.forEach(matchedKeys, (key) => {
const matchedRequestExamples = _.filter(requestBodyExamples, ['key', key]),
responseExample = _.find(responseExamples, ['key', key]);

let requestExample = _.find(matchedRequestExamples, ['contentType', responseExample.contentType]),
responseExampleData;

if (!requestExample) {
requestExample = _.head(matchedRequestExamples);
}

responseExampleData = getExampleData(context, { [responseExample.key]: responseExample.value });

if (isXMLExample) {
responseExampleData = getXMLExampleData(context, responseExampleData, responseBodySchema);
}

pmExamples.push({
request: getExampleData(context, { [requestExample.key]: requestExample.value }),
response: responseExampleData,
name: _.get(responseExample, 'value.summary') ||
(responseExample.key !== '_default' && responseExample.key) ||
_.get(requestExample, 'value.summary') || requestExample.key || 'Example'
});
});

return pmExamples;
}

_.forEach(responseExamples, (responseExample, index) => {

Expand All @@ -1117,36 +1156,24 @@ let QUERYPARAM = 'query',

requestExample = _.find(requestBodyExamples, (example, index) => {
if (
example.contentType === responseExample.contentType &&
_.toLower(example.key) === _.toLower(responseExample.key)
example.contentType === responseExample.contentType
) {
requestBodyExamples[index].isUsed = true;
usedRequestExamples[index] = true;
return true;
}
return false;
});

// If exact content type is not matching, pick first content type with same example key
if (!requestExample) {
requestExample = _.find(requestBodyExamples, (example, index) => {
if (_.toLower(example.key) === _.toLower(responseExample.key)) {
requestBodyExamples[index].isUsed = true;
return true;
}
return false;
});
}

if (!requestExample) {
if (requestBodyExamples[index] && !requestBodyExamples[index].isUsed) {
if (requestBodyExamples[index] && !usedRequestExamples[index]) {
requestExample = requestBodyExamples[index];
requestBodyExamples[index].isUsed = true;
usedRequestExamples[index] = true;
}
else {
for (let i = 0; i < requestBodyExamples.length; i++) {
if (!requestBodyExamples[i].isUsed) {
if (!usedRequestExamples[i]) {
requestExample = requestBodyExamples[i];
requestBodyExamples[i].isUsed = true;
usedRequestExamples[index] = true;
break;
}
}
Expand All @@ -1170,7 +1197,7 @@ let QUERYPARAM = 'query',

for (let i = 0; i < requestBodyExamples.length; i++) {

if (!requestBodyExamples[i].isUsed || pmExamples.length === 0) {
if (!usedRequestExamples[index] || pmExamples.length === 0) {
if (!responseExample) {
responseExample = _.head(responseExamples);

Expand Down

0 comments on commit a9a4f90

Please sign in to comment.