Skip to content

Commit 55b501c

Browse files
committed
Update format to in.name as defined in OAS3. Add console.warn message for user when buildRequest is passed an ambiguous parameter.
1 parent 39e3ba6 commit 55b501c

File tree

2 files changed

+72
-23
lines changed

2 files changed

+72
-23
lines changed

src/execute.js

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ const OperationNotFoundError = createError('OperationNotFoundError', function (m
1717
Object.assign(this, extra || {})
1818
})
1919

20+
const findParametersWithName = (name, parameters) => {
21+
return parameters.filter(p => p.name === name)
22+
}
23+
2024
// For stubbing in tests
2125
export const self = {
2226
buildRequest
@@ -110,36 +114,43 @@ export function buildRequest({
110114
req.headers.accept = responseContentType
111115
}
112116

113-
// Add values to request
114-
arrayOrEmpty(operation.parameters) // operation parameters
117+
const combinedParameters = []
118+
.concat(arrayOrEmpty(operation.parameters)) // operation parameters
115119
.concat(arrayOrEmpty(path.parameters)) // path parameters
116-
.forEach((parameter) => {
117-
const builder = parameterBuilders[parameter.in]
118-
let value
119120

120-
if (parameter.in === 'body' && parameter.schema && parameter.schema.properties) {
121-
value = parameters
122-
}
121+
// Add values to request
122+
combinedParameters.forEach((parameter) => {
123+
const builder = parameterBuilders[parameter.in]
124+
let value
123125

124-
value = parameter && parameter.name && parameters[parameter.name]
126+
if (parameter.in === 'body' && parameter.schema && parameter.schema.properties) {
127+
value = parameters
128+
}
129+
130+
value = parameter && parameter.name && parameters[parameter.name]
125131

126-
if (typeof value === 'undefined') {
132+
if (typeof value === 'undefined') {
127133
// check for `name-in` formatted key
128-
value = parameter && parameter.name && parameters[`${parameter.name}-${parameter.in}`]
129-
}
134+
value = parameter && parameter.name && parameters[`${parameter.in}.${parameter.name}`]
135+
}
136+
else if (findParametersWithName(parameter.name, combinedParameters).length > 1) {
137+
// value came from `parameters[parameter.name]`
138+
// check to see if this is an ambiguous parameter
139+
console.warn(`Parameter '${parameter.name}' is ambiguous because the defined spec has more than one parameter with the name: '${parameter.name}' and the passed-in parameter values did not define an 'in' value.`)
140+
}
130141

131-
if (typeof parameter.default !== 'undefined' && typeof value === 'undefined') {
132-
value = parameter.default
133-
}
142+
if (typeof parameter.default !== 'undefined' && typeof value === 'undefined') {
143+
value = parameter.default
144+
}
134145

135-
if (typeof value === 'undefined' && parameter.required && !parameter.allowEmptyValue) {
136-
throw new Error(`Required parameter ${parameter.name} is not provided`)
137-
}
146+
if (typeof value === 'undefined' && parameter.required && !parameter.allowEmptyValue) {
147+
throw new Error(`Required parameter ${parameter.name} is not provided`)
148+
}
138149

139-
if (builder) {
140-
builder({req, parameter, value, operation, spec})
141-
}
142-
})
150+
if (builder) {
151+
builder({req, parameter, value, operation, spec})
152+
}
153+
})
143154

144155
// Add securities, which are applicable
145156
req = applySecurities({request: req, securities, operation, spec})

test/execute.js

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1335,7 +1335,7 @@ describe('execute', () => {
13351335
}
13361336

13371337
// When
1338-
const req = buildRequest({spec, operationId: 'getMe', parameters: {'name-query': 'john'}})
1338+
const req = buildRequest({spec, operationId: 'getMe', parameters: {'query.name': 'john'}})
13391339

13401340
// Then
13411341
expect(req).toEqual({
@@ -1345,6 +1345,44 @@ describe('execute', () => {
13451345
headers: { }
13461346
})
13471347
})
1348+
1349+
it('should set all parameter options when given an ambiguous parameter value', function () {
1350+
// Given
1351+
const spec = {
1352+
host: 'swagger.io',
1353+
basePath: '/v1',
1354+
paths: {
1355+
'/one': {
1356+
get: {
1357+
operationId: 'getMe',
1358+
parameters: [{
1359+
name: 'name',
1360+
in: 'query',
1361+
type: 'string'
1362+
}, {
1363+
name: 'name',
1364+
in: 'formData',
1365+
type: 'string'
1366+
}]
1367+
}
1368+
}
1369+
}
1370+
}
1371+
1372+
// When
1373+
const req = buildRequest({spec, operationId: 'getMe', parameters: {name: 'john'}})
1374+
1375+
// Then
1376+
expect(req).toEqual({
1377+
url: 'http://swagger.io/v1/one?name=john',
1378+
method: 'GET',
1379+
credentials: 'same-origin',
1380+
headers: {
1381+
'content-type': 'application/x-www-form-urlencoded'
1382+
},
1383+
body: 'name=john'
1384+
})
1385+
})
13481386
})
13491387

13501388
describe('body', function () {

0 commit comments

Comments
 (0)