@@ -1092,7 +1092,52 @@ let QUERYPARAM = 'query',
1092
1092
* @returns {Array } Examples for corresponding operation
1093
1093
*/
1094
1094
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
+ }
1096
1141
1097
1142
_ . forEach ( responseExamples , ( responseExample , index ) => {
1098
1143
@@ -1101,60 +1146,32 @@ let QUERYPARAM = 'query',
1101
1146
}
1102
1147
1103
1148
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
+ }
1105
1156
1106
1157
if ( isXMLExample ) {
1107
1158
responseExampleData = getXMLExampleData ( context , responseExampleData , responseBodySchema ) ;
1108
1159
}
1109
1160
1110
- if ( _ . isEmpty ( requestBodyExamples ) ) {
1161
+ if ( _ . isEmpty ( matchedRequestBodyExamples ) ) {
1111
1162
pmExamples . push ( {
1112
1163
response : responseExampleData ,
1113
1164
name : _ . get ( responseExample , 'value.summary' ) || responseExample . key
1114
1165
} ) ;
1115
1166
return ;
1116
1167
}
1117
1168
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 ;
1138
1172
}
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 ] ;
1158
1175
}
1159
1176
1160
1177
pmExamples . push ( {
@@ -1170,7 +1187,7 @@ let QUERYPARAM = 'query',
1170
1187
1171
1188
for ( let i = 0 ; i < requestBodyExamples . length ; i ++ ) {
1172
1189
1173
- if ( ! requestBodyExamples [ i ] . isUsed || pmExamples . length === 0 ) {
1190
+ if ( ! usedRequestExamples [ i ] || pmExamples . length === 0 ) {
1174
1191
if ( ! responseExample ) {
1175
1192
responseExample = _ . head ( responseExamples ) ;
1176
1193
0 commit comments