@@ -1082,7 +1082,16 @@ let QUERYPARAM = 'query',
1082
1082
1083
1083
/**
1084
1084
* Generates postman equivalent examples which contains request and response mappings of
1085
- * each example based on examples mentioned ind definition
1085
+ * each example based on examples mentioned in definition
1086
+ *
1087
+ * This matching between request bodies and response bodies are done in following order.
1088
+ * 1. Try matching keys from request and response examples
1089
+ * 2. If any key matching is found, we'll generate example from it and ignore non-matching keys
1090
+ * 3. If no matching key is found, we'll generate examples based on positional matching.
1091
+ *
1092
+ * Positional matching means first example in request body will be matched with first example
1093
+ * in response body and so on. Any left over request or response body for which
1094
+ * positional matching is not found, we'll use first req/res example.
1086
1095
*
1087
1096
* @param {Object } context - Global context object
1088
1097
* @param {Object } responseExamples - Examples defined in the response
@@ -1092,8 +1101,51 @@ let QUERYPARAM = 'query',
1092
1101
* @returns {Array } Examples for corresponding operation
1093
1102
*/
1094
1103
generateExamples = ( context , responseExamples , requestBodyExamples , responseBodySchema , isXMLExample ) => {
1095
- const pmExamples = [ ] ;
1104
+ const pmExamples = [ ] ,
1105
+ responseExampleKeys = _ . map ( responseExamples , 'key' ) ,
1106
+ requestBodyExampleKeys = _ . map ( requestBodyExamples , 'key' ) ,
1107
+ matchedKeys = _ . intersectionBy ( responseExampleKeys , requestBodyExampleKeys , _ . toLower ) ,
1108
+ usedRequestExamples = _ . fill ( Array ( requestBodyExamples . length ) , false ) ,
1109
+ exampleKeyComparator = ( example , key ) => {
1110
+ return _ . toLower ( example . key ) === _ . toLower ( key ) ;
1111
+ } ;
1112
+
1113
+ // Do keys matching first and ignore any leftover req/res body for which matching is not found
1114
+ if ( matchedKeys . length ) {
1115
+ _ . forEach ( matchedKeys , ( key ) => {
1116
+ const matchedRequestExamples = _ . filter ( requestBodyExamples , ( example ) => {
1117
+ return exampleKeyComparator ( example , key ) ;
1118
+ } ) ,
1119
+ responseExample = _ . find ( responseExamples , ( example ) => {
1120
+ return exampleKeyComparator ( example , key ) ;
1121
+ } ) ;
1122
+
1123
+ let requestExample = _ . find ( matchedRequestExamples , [ 'contentType' , _ . get ( responseExample , 'contentType' ) ] ) ,
1124
+ responseExampleData ;
1125
+
1126
+ if ( ! requestExample ) {
1127
+ requestExample = _ . head ( matchedRequestExamples ) ;
1128
+ }
1129
+
1130
+ responseExampleData = getExampleData ( context , { [ responseExample . key ] : responseExample . value } ) ;
1131
+
1132
+ if ( isXMLExample ) {
1133
+ responseExampleData = getXMLExampleData ( context , responseExampleData , responseBodySchema ) ;
1134
+ }
1135
+
1136
+ pmExamples . push ( {
1137
+ request : getExampleData ( context , { [ requestExample . key ] : requestExample . value } ) ,
1138
+ response : responseExampleData ,
1139
+ name : _ . get ( responseExample , 'value.summary' ) ||
1140
+ ( responseExample . key !== '_default' && responseExample . key ) ||
1141
+ _ . get ( requestExample , 'value.summary' ) || requestExample . key || 'Example'
1142
+ } ) ;
1143
+ } ) ;
1144
+
1145
+ return pmExamples ;
1146
+ }
1096
1147
1148
+ // No key matching between req and res were found, so perform positional matching now
1097
1149
_ . forEach ( responseExamples , ( responseExample , index ) => {
1098
1150
1099
1151
if ( ! _ . isObject ( responseExample ) ) {
@@ -1115,46 +1167,12 @@ let QUERYPARAM = 'query',
1115
1167
return ;
1116
1168
}
1117
1169
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
- } ) ;
1170
+ if ( requestBodyExamples [ index ] && ! usedRequestExamples [ index ] ) {
1171
+ requestExample = requestBodyExamples [ index ] ;
1172
+ usedRequestExamples [ index ] = true ;
1138
1173
}
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
- }
1174
+ else {
1175
+ requestExample = requestBodyExamples [ 0 ] ;
1158
1176
}
1159
1177
1160
1178
pmExamples . push ( {
@@ -1168,9 +1186,10 @@ let QUERYPARAM = 'query',
1168
1186
let responseExample ,
1169
1187
responseExampleData ;
1170
1188
1189
+ // Add any left over request body examples with first response body as matching
1171
1190
for ( let i = 0 ; i < requestBodyExamples . length ; i ++ ) {
1172
1191
1173
- if ( ! requestBodyExamples [ i ] . isUsed || pmExamples . length === 0 ) {
1192
+ if ( ! usedRequestExamples [ i ] || pmExamples . length === 0 ) {
1174
1193
if ( ! responseExample ) {
1175
1194
responseExample = _ . head ( responseExamples ) ;
1176
1195
@@ -1359,7 +1378,15 @@ let QUERYPARAM = 'query',
1359
1378
} ;
1360
1379
} ) ;
1361
1380
}
1362
- return generateExamples ( context , responseExamples , requestBodyExamples , requestBodySchema , isBodyTypeXML ) ;
1381
+
1382
+ let matchedRequestBodyExamples = _ . filter ( requestBodyExamples , [ 'contentType' , bodyType ] ) ;
1383
+
1384
+ // If content-types are not matching, match with any present content-types
1385
+ if ( _ . isEmpty ( matchedRequestBodyExamples ) ) {
1386
+ matchedRequestBodyExamples = requestBodyExamples ;
1387
+ }
1388
+
1389
+ return generateExamples ( context , responseExamples , matchedRequestBodyExamples , requestBodySchema , isBodyTypeXML ) ;
1363
1390
}
1364
1391
1365
1392
return [ { [ bodyKey ] : bodyData } ] ;
0 commit comments