Skip to content

Commit c12e738

Browse files
committed
Added simplified request and response body matching in case of multiple examples
1 parent 228c462 commit c12e738

File tree

1 file changed

+60
-43
lines changed

1 file changed

+60
-43
lines changed

libV2/schemaUtils.js

Lines changed: 60 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1092,7 +1092,52 @@ let QUERYPARAM = 'query',
10921092
* @returns {Array} Examples for corresponding operation
10931093
*/
10941094
generateExamples = (context, responseExamples, requestBodyExamples, responseBodySchema, isXMLExample) => {
1095-
const pmExamples = [];
1095+
const pmExamples = [],
1096+
responseExampleKeys = _.map(responseExamples, 'key'),
1097+
requestBodyExampleKeys = _.map(requestBodyExamples, 'key'),
1098+
matchedKeys = _.intersectionBy(responseExampleKeys, requestBodyExampleKeys, _.toLower),
1099+
usedRequestExamples = _.fill(Array(requestBodyExamples.length), false),
1100+
exampleKeyComparator = (example, key) => {
1101+
return _.toLower(example.key) === _.toLower(key);
1102+
};
1103+
1104+
/**
1105+
* To generate examples, we first try to do matching of request and response examples based on example keys,
1106+
* If there is any matching found, we'll create example from it and ignore non-matching keys
1107+
*/
1108+
if (matchedKeys.length) {
1109+
_.forEach(matchedKeys, (key) => {
1110+
const matchedRequestExamples = _.filter(requestBodyExamples, (example) => {
1111+
return exampleKeyComparator(example, key);
1112+
}),
1113+
responseExample = _.find(responseExamples, (example) => {
1114+
return exampleKeyComparator(example, key);
1115+
});
1116+
1117+
let requestExample = _.find(matchedRequestExamples, ['contentType', _.get(responseExample, 'contentType')]),
1118+
responseExampleData;
1119+
1120+
if (!requestExample) {
1121+
requestExample = _.head(matchedRequestExamples);
1122+
}
1123+
1124+
responseExampleData = getExampleData(context, { [responseExample.key]: responseExample.value });
1125+
1126+
if (isXMLExample) {
1127+
responseExampleData = getXMLExampleData(context, responseExampleData, responseBodySchema);
1128+
}
1129+
1130+
pmExamples.push({
1131+
request: getExampleData(context, { [requestExample.key]: requestExample.value }),
1132+
response: responseExampleData,
1133+
name: _.get(responseExample, 'value.summary') ||
1134+
(responseExample.key !== '_default' && responseExample.key) ||
1135+
_.get(requestExample, 'value.summary') || requestExample.key || 'Example'
1136+
});
1137+
});
1138+
1139+
return pmExamples;
1140+
}
10961141

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

@@ -1101,60 +1146,32 @@ let QUERYPARAM = 'query',
11011146
}
11021147

11031148
let responseExampleData = getExampleData(context, { [responseExample.key]: responseExample.value }),
1104-
requestExample;
1149+
requestExample,
1150+
matchedRequestBodyExamples = _.filter(requestBodyExamples, ['contentType', responseExample.contentType]);
1151+
1152+
// If content-types are not matching, match with any present content-types
1153+
if (_.isEmpty(matchedRequestBodyExamples)) {
1154+
matchedRequestBodyExamples = requestBodyExamples;
1155+
}
11051156

11061157
if (isXMLExample) {
11071158
responseExampleData = getXMLExampleData(context, responseExampleData, responseBodySchema);
11081159
}
11091160

1110-
if (_.isEmpty(requestBodyExamples)) {
1161+
if (_.isEmpty(matchedRequestBodyExamples)) {
11111162
pmExamples.push({
11121163
response: responseExampleData,
11131164
name: _.get(responseExample, 'value.summary') || responseExample.key
11141165
});
11151166
return;
11161167
}
11171168

1118-
requestExample = _.find(requestBodyExamples, (example, index) => {
1119-
if (
1120-
example.contentType === responseExample.contentType &&
1121-
_.toLower(example.key) === _.toLower(responseExample.key)
1122-
) {
1123-
requestBodyExamples[index].isUsed = true;
1124-
return true;
1125-
}
1126-
return false;
1127-
});
1128-
1129-
// If exact content type is not matching, pick first content type with same example key
1130-
if (!requestExample) {
1131-
requestExample = _.find(requestBodyExamples, (example, index) => {
1132-
if (_.toLower(example.key) === _.toLower(responseExample.key)) {
1133-
requestBodyExamples[index].isUsed = true;
1134-
return true;
1135-
}
1136-
return false;
1137-
});
1169+
if (requestBodyExamples[index] && !usedRequestExamples[index]) {
1170+
requestExample = requestBodyExamples[index];
1171+
usedRequestExamples[index] = true;
11381172
}
1139-
1140-
if (!requestExample) {
1141-
if (requestBodyExamples[index] && !requestBodyExamples[index].isUsed) {
1142-
requestExample = requestBodyExamples[index];
1143-
requestBodyExamples[index].isUsed = true;
1144-
}
1145-
else {
1146-
for (let i = 0; i < requestBodyExamples.length; i++) {
1147-
if (!requestBodyExamples[i].isUsed) {
1148-
requestExample = requestBodyExamples[i];
1149-
requestBodyExamples[i].isUsed = true;
1150-
break;
1151-
}
1152-
}
1153-
1154-
if (!requestExample) {
1155-
requestExample = requestBodyExamples[0];
1156-
}
1157-
}
1173+
else {
1174+
requestExample = requestBodyExamples[0];
11581175
}
11591176

11601177
pmExamples.push({
@@ -1170,7 +1187,7 @@ let QUERYPARAM = 'query',
11701187

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

1173-
if (!requestBodyExamples[i].isUsed || pmExamples.length === 0) {
1190+
if (!usedRequestExamples[i] || pmExamples.length === 0) {
11741191
if (!responseExample) {
11751192
responseExample = _.head(responseExamples);
11761193

0 commit comments

Comments
 (0)