From 185246838d90a1e697a397c6dee8f9937fad9ab4 Mon Sep 17 00:00:00 2001 From: Owen Conti Date: Wed, 2 Aug 2017 22:09:05 -0600 Subject: [PATCH 1/9] Fix for swagger-ui #3511 - Update how request parameter value is obtained so that it comes directly from the parameter --- src/execute.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/execute.js b/src/execute.js index 29fe01e1d..7d7f13b31 100755 --- a/src/execute.js +++ b/src/execute.js @@ -121,7 +121,7 @@ export function buildRequest({ value = parameters } - value = parameter && parameter.name && parameters[parameter.name] + value = parameter.name && parameter.value if (typeof parameter.default !== 'undefined' && typeof value === 'undefined') { value = parameter.default From 9be77b55c183fe4cb9e27fb26f275280ca3f5308 Mon Sep 17 00:00:00 2001 From: Owen Conti Date: Wed, 2 Aug 2017 22:16:18 -0600 Subject: [PATCH 2/9] Update parameter.name check to parameter.value --- src/execute.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/execute.js b/src/execute.js index 7d7f13b31..df8417ec5 100755 --- a/src/execute.js +++ b/src/execute.js @@ -121,7 +121,7 @@ export function buildRequest({ value = parameters } - value = parameter.name && parameter.value + value = parameter.value && parameter.value if (typeof parameter.default !== 'undefined' && typeof value === 'undefined') { value = parameter.default From 710c92bc229218852ff16e724b5215f5cc2f138b Mon Sep 17 00:00:00 2001 From: Owen Conti Date: Wed, 2 Aug 2017 22:21:28 -0600 Subject: [PATCH 3/9] Default parameter value to parameter.value, then check for body value, then fallback to parameter.default value --- src/execute.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/execute.js b/src/execute.js index df8417ec5..cb1dfcc84 100755 --- a/src/execute.js +++ b/src/execute.js @@ -115,14 +115,12 @@ export function buildRequest({ .concat(arrayOrEmpty(path.parameters)) // path parameters .forEach((parameter) => { const builder = parameterBuilders[parameter.in] - let value + let value = parameter.value if (parameter.in === 'body' && parameter.schema && parameter.schema.properties) { value = parameters } - value = parameter.value && parameter.value - if (typeof parameter.default !== 'undefined' && typeof value === 'undefined') { value = parameter.default } From e250dd312a903ebb818761888db015a98b8bd9a5 Mon Sep 17 00:00:00 2001 From: Owen Conti Date: Thu, 3 Aug 2017 07:06:34 -0600 Subject: [PATCH 4/9] Fix failing tests due to parameter identification change --- src/execute.js | 4 ++- test/execute.js | 70 ++++++++++++++++++++++++------------------------- test/index.js | 4 +-- 3 files changed, 40 insertions(+), 38 deletions(-) diff --git a/src/execute.js b/src/execute.js index cb1dfcc84..935b96493 100755 --- a/src/execute.js +++ b/src/execute.js @@ -115,12 +115,14 @@ export function buildRequest({ .concat(arrayOrEmpty(path.parameters)) // path parameters .forEach((parameter) => { const builder = parameterBuilders[parameter.in] - let value = parameter.value + let value if (parameter.in === 'body' && parameter.schema && parameter.schema.properties) { value = parameters } + value = parameter && parameter.name && parameters[`${parameter.name}-${parameter.in}`] + if (typeof parameter.default !== 'undefined' && typeof value === 'undefined') { value = parameter.default } diff --git a/test/execute.js b/test/execute.js index 92e3407b3..042541a6b 100644 --- a/test/execute.js +++ b/test/execute.js @@ -146,7 +146,7 @@ describe('execute', () => { } // When - const req = buildRequest({spec, operationId: 'getMe', parameters: {petId: 123}}) + const req = buildRequest({spec, operationId: 'getMe', parameters: {'petId-query': 123}}) // Then expect(req).toEqual({ @@ -177,7 +177,7 @@ describe('execute', () => { } // When - const req = buildRequest({spec, operationId: 'getMe', parameters: {fields: '[articles]=title'}}) + const req = buildRequest({spec, operationId: 'getMe', parameters: {'fields-query': '[articles]=title'}}) // Then expect(req).toEqual({ @@ -231,8 +231,8 @@ describe('execute', () => { spec, operationId: 'getMe', parameters: { - false: false, - zero: 0 + 'false-query': false, + 'zero-query': 0 } }) @@ -265,7 +265,7 @@ describe('execute', () => { } // When - const req = buildRequest({spec, operationId: 'getMe', parameters: {petId: true}}) + const req = buildRequest({spec, operationId: 'getMe', parameters: {'petId-query': true}}) // Then expect(req).toEqual({ @@ -395,7 +395,7 @@ describe('execute', () => { } // When - const req = buildRequest({spec, operationId: 'getMe', parameters: {petId: [1, 2, 3]}}) + const req = buildRequest({spec, operationId: 'getMe', parameters: {'petId-formData': [1, 2, 3]}}) // Then expect(req.body).toEqual('petId=1,2,3') @@ -458,7 +458,7 @@ describe('execute', () => { } // When - const req = buildRequest({spec, operationId: 'getMe', parameters: {status: false}}) + const req = buildRequest({spec, operationId: 'getMe', parameters: {'status-query': false}}) // Then expect(req).toEqual({ @@ -538,7 +538,7 @@ describe('execute', () => { } } - const req = buildRequest({spec, operationId: 'loginUser', parameters: {username: 'fred', password: 'meyer'}}) + const req = buildRequest({spec, operationId: 'loginUser', parameters: {'username-query': 'fred', 'password-query': 'meyer'}}) expect(req).toEqual({ url: 'http://swagger.io/v1/one?username=fred&password=meyer', @@ -618,7 +618,7 @@ describe('execute', () => { const req = buildRequest({ spec, operationId: 'postMe', - parameters: {file: 'test'}}) + parameters: {'file-formData': 'test'}}) // Then expect(req).toEqual({ @@ -651,7 +651,7 @@ describe('execute', () => { const req = buildRequest({ spec, operationId: 'postMe', - parameters: {file: 'test'}}) + parameters: {'file-formData': 'test'}}) // Then expect(req).toEqual({ @@ -685,7 +685,7 @@ describe('execute', () => { const req = buildRequest({ spec, operationId: 'postMe', - parameters: {file: 'test'}}) + parameters: {'file-formData': 'test'}}) // Then expect(req).toEqual({ @@ -752,10 +752,10 @@ describe('execute', () => { const req = buildRequest({spec, operationId: 'getMe', parameters: { - head: 'justTheHead', - two: '2', - body: {json: 'rulez'}, - question: 'answer' + 'head-header': 'justTheHead', + 'two-path': '2', + 'body-body': {json: 'rulez'}, + 'question-query': 'answer' }}) // Then @@ -783,7 +783,7 @@ describe('execute', () => { spec, operationId: 'makeMe', parameters: { - body: { + 'body-body': { one: 1, } }}) @@ -832,7 +832,7 @@ describe('execute', () => { spec, operationId: 'makeMe', parameters: { - body: { + 'body-body': { one: 1, two: { three: 3 @@ -859,7 +859,7 @@ describe('execute', () => { spec, operationId: 'makeMe', parameters: { - body: 'hello' + 'body-body': 'hello' } }) @@ -1083,7 +1083,7 @@ describe('execute', () => { } // When - const req = buildRequest({spec, operationId: 'getMe', parameters: {petId: ['a,b']}}) + const req = buildRequest({spec, operationId: 'getMe', parameters: {'petId-query': ['a,b']}}) // Then expect(req).toEqual({ @@ -1129,7 +1129,7 @@ describe('execute', () => { } // When - const req = buildRequest({spec, operationId: 'getMe', parameters: {ids: [1, 2, 3], 'the names': ['a,b', 'mary']}}) + const req = buildRequest({spec, operationId: 'getMe', parameters: {'ids-query': [1, 2, 3], 'the names-query': ['a,b', 'mary']}}) // Then expect(req).toEqual({ @@ -1164,7 +1164,7 @@ describe('execute', () => { } // When - const req = buildRequest({spec, operationId: 'getMe', parameters: {petId: [1, 2, 3]}}) + const req = buildRequest({spec, operationId: 'getMe', parameters: {'petId-query': [1, 2, 3]}}) // Then expect(req).toEqual({ @@ -1199,7 +1199,7 @@ describe('execute', () => { } // When - const req = buildRequest({spec, operationId: 'getMe', parameters: {petId: [1, 2, 3]}}) + const req = buildRequest({spec, operationId: 'getMe', parameters: {'petId-query': [1, 2, 3]}}) // Then expect(req).toEqual({ @@ -1234,7 +1234,7 @@ describe('execute', () => { } // When - const req = buildRequest({spec, operationId: 'getMe', parameters: {petId: [1, 2, 3]}}) + const req = buildRequest({spec, operationId: 'getMe', parameters: {'petId-query': [1, 2, 3]}}) // Then expect(req).toEqual({ @@ -1269,7 +1269,7 @@ describe('execute', () => { } // When - const req = buildRequest({spec, operationId: 'getMe', parameters: {petId: [1, 2, 3]}}) + const req = buildRequest({spec, operationId: 'getMe', parameters: {'petId-query': [1, 2, 3]}}) // Then expect(req).toEqual({ @@ -1304,7 +1304,7 @@ describe('execute', () => { } // When - const req = buildRequest({spec, operationId: 'getMe', parameters: {name: ['john', 'smith']}}) + const req = buildRequest({spec, operationId: 'getMe', parameters: {'name-query': ['john', 'smith']}}) // Then expect(req).toEqual({ @@ -1372,11 +1372,11 @@ describe('execute', () => { spec: spec2, operationId: 'getBlob', parameters: { - bodyParam: { + 'bodyParam-body': { name: 'johny', id: '123' }, - someQuery: 'foo', + 'someQuery-query': 'foo', }}) @@ -1393,7 +1393,7 @@ describe('execute', () => { }) it('should not add values of body parameters to the URL', function () { - const req = buildRequest({spec, operationId: 'postMe', parameters: {petId: 123}}) + const req = buildRequest({spec, operationId: 'postMe', parameters: {'petId-body': 123}}) expect(req).toEqual({ @@ -1449,7 +1449,7 @@ describe('execute', () => { }) it('should generate a request with body parameter', function () { - const req = buildRequest({spec, operationId: 'deleteMe', parameters: {petId: 123}}) + const req = buildRequest({spec, operationId: 'deleteMe', parameters: {'petId-body': 123}}) expect(req).toEqual({ url: 'http://swagger.io/v1/one', @@ -1481,7 +1481,7 @@ describe('execute', () => { } } - const req = buildRequest({spec, operationId: 'deleteMe', parameters: {api_key: 123}}) + const req = buildRequest({spec, operationId: 'deleteMe', parameters: {'api_key-header': 123}}) expect(req).toEqual({ url: 'http://swagger.io/v1/one', @@ -1602,7 +1602,7 @@ describe('execute', () => { } } - const req = buildRequest({spec, operationId: 'getMe', parameters: {id: '123'}}) + const req = buildRequest({spec, operationId: 'getMe', parameters: {'id-path': '123'}}) expect(req).toEqual({ url: 'http://swagger.io/v1/123', @@ -1641,7 +1641,7 @@ describe('execute', () => { } } - const req = buildRequest({spec, operationId: 'getPetsById', parameters: {id: 123, test: 567}}) + const req = buildRequest({spec, operationId: 'getPetsById', parameters: {'id-path': 123, 'test-query': 567}}) expect(req).toEqual({ url: 'http://swagger.io/v1/pet/123?test=567', @@ -1679,7 +1679,7 @@ describe('execute', () => { } } - const req = buildRequest({spec, operationId: 'getPetsById', parameters: {id: 123, test: 567}}) + const req = buildRequest({spec, operationId: 'getPetsById', parameters: {'id-path': 123, 'test-query': 567}}) expect(req).toEqual({ url: 'http://swagger.io/v1/pet/123?test=567', @@ -1708,7 +1708,7 @@ describe('execute', () => { } } - const req = buildRequest({spec, operationId: 'deleteMe', parameters: {id: 'foo/bar'}}) + const req = buildRequest({spec, operationId: 'deleteMe', parameters: {'id-path': 'foo/bar'}}) expect(req).toEqual({ url: 'http://swagger.io/v1/foo%2Fbar', @@ -1742,7 +1742,7 @@ describe('execute', () => { const req = buildRequest({spec, requestContentType: 'application/x-www-form-urlencoded', operationId: 'postMe', - parameters: {petId: 'id'}}) + parameters: {'petId-formData': 'id'}}) expect(req).toEqual({ url: 'http://swagger.io/v1/one', diff --git a/test/index.js b/test/index.js index 11cb7fc6b..38821769d 100644 --- a/test/index.js +++ b/test/index.js @@ -467,7 +467,7 @@ describe('constructor', () => { req.url = 'http://petstore.swagger.io/v2/pet/4' } }).then((client) => { - client.apis.pet.getPetById({petId: 3}).then((data) => { + client.apis.pet.getPetById({'petId-path': 3}).then((data) => { expect(data.body.id).toEqual(4) cb() }) @@ -481,7 +481,7 @@ describe('constructor', () => { res.body.id = 4 } }).then((client) => { - client.apis.pet.getPetById({petId: 3}).then((data) => { + client.apis.pet.getPetById({'petId-path': 3}).then((data) => { expect(data.body.id).toEqual(4) cb() }) From b2ea186eb5eb6c87b2adc68b359b9ff9e4c7e821 Mon Sep 17 00:00:00 2001 From: Owen Conti Date: Thu, 3 Aug 2017 18:44:48 -0600 Subject: [PATCH 5/9] Change buildRequest method to handle both `name` format and `name-in` format for parameter values. --- src/execute.js | 5 +++++ test/execute.js | 31 +++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/execute.js b/src/execute.js index 29fe01e1d..6338ebe29 100755 --- a/src/execute.js +++ b/src/execute.js @@ -123,6 +123,11 @@ export function buildRequest({ value = parameter && parameter.name && parameters[parameter.name] + if (typeof value === 'undefined') { + // check for `name-in` formatted key + value = parameter && parameter.name && parameters[`${parameter.name}-${parameter.in}`] + } + if (typeof parameter.default !== 'undefined' && typeof value === 'undefined') { value = parameter.default } diff --git a/test/execute.js b/test/execute.js index 92e3407b3..49e61549b 100644 --- a/test/execute.js +++ b/test/execute.js @@ -1314,6 +1314,37 @@ describe('execute', () => { headers: { } }) }) + + it('should fall back to `name-in` format when a parameter cannot be found', function () { + // Given + const spec = { + host: 'swagger.io', + basePath: '/v1', + paths: { + '/one': { + get: { + operationId: 'getMe', + parameters: [{ + name: 'name', + in: 'query', + type: 'string' + }] + } + } + } + } + + // When + const req = buildRequest({spec, operationId: 'getMe', parameters: {'name-query': 'john'}}) + + // Then + expect(req).toEqual({ + url: 'http://swagger.io/v1/one?name=john', + method: 'GET', + credentials: 'same-origin', + headers: { } + }) + }) }) describe('body', function () { From 190f15ed7c833a93cd56aa0612f251ffcf8c922d Mon Sep 17 00:00:00 2001 From: Owen Conti Date: Thu, 3 Aug 2017 18:46:58 -0600 Subject: [PATCH 6/9] Revert forced buildRequest to use new signature --- src/execute.js | 2 +- test/execute.js | 70 ++++++++++++++++++++++++------------------------- 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/src/execute.js b/src/execute.js index 4b079f455..6338ebe29 100755 --- a/src/execute.js +++ b/src/execute.js @@ -121,7 +121,7 @@ export function buildRequest({ value = parameters } - value = parameter && parameter.name && parameters[`${parameter.name}-${parameter.in}`] + value = parameter && parameter.name && parameters[parameter.name] if (typeof value === 'undefined') { // check for `name-in` formatted key diff --git a/test/execute.js b/test/execute.js index 5fb588ab1..49e61549b 100644 --- a/test/execute.js +++ b/test/execute.js @@ -146,7 +146,7 @@ describe('execute', () => { } // When - const req = buildRequest({spec, operationId: 'getMe', parameters: {'petId-query': 123}}) + const req = buildRequest({spec, operationId: 'getMe', parameters: {petId: 123}}) // Then expect(req).toEqual({ @@ -177,7 +177,7 @@ describe('execute', () => { } // When - const req = buildRequest({spec, operationId: 'getMe', parameters: {'fields-query': '[articles]=title'}}) + const req = buildRequest({spec, operationId: 'getMe', parameters: {fields: '[articles]=title'}}) // Then expect(req).toEqual({ @@ -231,8 +231,8 @@ describe('execute', () => { spec, operationId: 'getMe', parameters: { - 'false-query': false, - 'zero-query': 0 + false: false, + zero: 0 } }) @@ -265,7 +265,7 @@ describe('execute', () => { } // When - const req = buildRequest({spec, operationId: 'getMe', parameters: {'petId-query': true}}) + const req = buildRequest({spec, operationId: 'getMe', parameters: {petId: true}}) // Then expect(req).toEqual({ @@ -395,7 +395,7 @@ describe('execute', () => { } // When - const req = buildRequest({spec, operationId: 'getMe', parameters: {'petId-formData': [1, 2, 3]}}) + const req = buildRequest({spec, operationId: 'getMe', parameters: {petId: [1, 2, 3]}}) // Then expect(req.body).toEqual('petId=1,2,3') @@ -458,7 +458,7 @@ describe('execute', () => { } // When - const req = buildRequest({spec, operationId: 'getMe', parameters: {'status-query': false}}) + const req = buildRequest({spec, operationId: 'getMe', parameters: {status: false}}) // Then expect(req).toEqual({ @@ -538,7 +538,7 @@ describe('execute', () => { } } - const req = buildRequest({spec, operationId: 'loginUser', parameters: {'username-query': 'fred', 'password-query': 'meyer'}}) + const req = buildRequest({spec, operationId: 'loginUser', parameters: {username: 'fred', password: 'meyer'}}) expect(req).toEqual({ url: 'http://swagger.io/v1/one?username=fred&password=meyer', @@ -618,7 +618,7 @@ describe('execute', () => { const req = buildRequest({ spec, operationId: 'postMe', - parameters: {'file-formData': 'test'}}) + parameters: {file: 'test'}}) // Then expect(req).toEqual({ @@ -651,7 +651,7 @@ describe('execute', () => { const req = buildRequest({ spec, operationId: 'postMe', - parameters: {'file-formData': 'test'}}) + parameters: {file: 'test'}}) // Then expect(req).toEqual({ @@ -685,7 +685,7 @@ describe('execute', () => { const req = buildRequest({ spec, operationId: 'postMe', - parameters: {'file-formData': 'test'}}) + parameters: {file: 'test'}}) // Then expect(req).toEqual({ @@ -752,10 +752,10 @@ describe('execute', () => { const req = buildRequest({spec, operationId: 'getMe', parameters: { - 'head-header': 'justTheHead', - 'two-path': '2', - 'body-body': {json: 'rulez'}, - 'question-query': 'answer' + head: 'justTheHead', + two: '2', + body: {json: 'rulez'}, + question: 'answer' }}) // Then @@ -783,7 +783,7 @@ describe('execute', () => { spec, operationId: 'makeMe', parameters: { - 'body-body': { + body: { one: 1, } }}) @@ -832,7 +832,7 @@ describe('execute', () => { spec, operationId: 'makeMe', parameters: { - 'body-body': { + body: { one: 1, two: { three: 3 @@ -859,7 +859,7 @@ describe('execute', () => { spec, operationId: 'makeMe', parameters: { - 'body-body': 'hello' + body: 'hello' } }) @@ -1083,7 +1083,7 @@ describe('execute', () => { } // When - const req = buildRequest({spec, operationId: 'getMe', parameters: {'petId-query': ['a,b']}}) + const req = buildRequest({spec, operationId: 'getMe', parameters: {petId: ['a,b']}}) // Then expect(req).toEqual({ @@ -1129,7 +1129,7 @@ describe('execute', () => { } // When - const req = buildRequest({spec, operationId: 'getMe', parameters: {'ids-query': [1, 2, 3], 'the names-query': ['a,b', 'mary']}}) + const req = buildRequest({spec, operationId: 'getMe', parameters: {ids: [1, 2, 3], 'the names': ['a,b', 'mary']}}) // Then expect(req).toEqual({ @@ -1164,7 +1164,7 @@ describe('execute', () => { } // When - const req = buildRequest({spec, operationId: 'getMe', parameters: {'petId-query': [1, 2, 3]}}) + const req = buildRequest({spec, operationId: 'getMe', parameters: {petId: [1, 2, 3]}}) // Then expect(req).toEqual({ @@ -1199,7 +1199,7 @@ describe('execute', () => { } // When - const req = buildRequest({spec, operationId: 'getMe', parameters: {'petId-query': [1, 2, 3]}}) + const req = buildRequest({spec, operationId: 'getMe', parameters: {petId: [1, 2, 3]}}) // Then expect(req).toEqual({ @@ -1234,7 +1234,7 @@ describe('execute', () => { } // When - const req = buildRequest({spec, operationId: 'getMe', parameters: {'petId-query': [1, 2, 3]}}) + const req = buildRequest({spec, operationId: 'getMe', parameters: {petId: [1, 2, 3]}}) // Then expect(req).toEqual({ @@ -1269,7 +1269,7 @@ describe('execute', () => { } // When - const req = buildRequest({spec, operationId: 'getMe', parameters: {'petId-query': [1, 2, 3]}}) + const req = buildRequest({spec, operationId: 'getMe', parameters: {petId: [1, 2, 3]}}) // Then expect(req).toEqual({ @@ -1304,7 +1304,7 @@ describe('execute', () => { } // When - const req = buildRequest({spec, operationId: 'getMe', parameters: {'name-query': ['john', 'smith']}}) + const req = buildRequest({spec, operationId: 'getMe', parameters: {name: ['john', 'smith']}}) // Then expect(req).toEqual({ @@ -1403,11 +1403,11 @@ describe('execute', () => { spec: spec2, operationId: 'getBlob', parameters: { - 'bodyParam-body': { + bodyParam: { name: 'johny', id: '123' }, - 'someQuery-query': 'foo', + someQuery: 'foo', }}) @@ -1424,7 +1424,7 @@ describe('execute', () => { }) it('should not add values of body parameters to the URL', function () { - const req = buildRequest({spec, operationId: 'postMe', parameters: {'petId-body': 123}}) + const req = buildRequest({spec, operationId: 'postMe', parameters: {petId: 123}}) expect(req).toEqual({ @@ -1480,7 +1480,7 @@ describe('execute', () => { }) it('should generate a request with body parameter', function () { - const req = buildRequest({spec, operationId: 'deleteMe', parameters: {'petId-body': 123}}) + const req = buildRequest({spec, operationId: 'deleteMe', parameters: {petId: 123}}) expect(req).toEqual({ url: 'http://swagger.io/v1/one', @@ -1512,7 +1512,7 @@ describe('execute', () => { } } - const req = buildRequest({spec, operationId: 'deleteMe', parameters: {'api_key-header': 123}}) + const req = buildRequest({spec, operationId: 'deleteMe', parameters: {api_key: 123}}) expect(req).toEqual({ url: 'http://swagger.io/v1/one', @@ -1633,7 +1633,7 @@ describe('execute', () => { } } - const req = buildRequest({spec, operationId: 'getMe', parameters: {'id-path': '123'}}) + const req = buildRequest({spec, operationId: 'getMe', parameters: {id: '123'}}) expect(req).toEqual({ url: 'http://swagger.io/v1/123', @@ -1672,7 +1672,7 @@ describe('execute', () => { } } - const req = buildRequest({spec, operationId: 'getPetsById', parameters: {'id-path': 123, 'test-query': 567}}) + const req = buildRequest({spec, operationId: 'getPetsById', parameters: {id: 123, test: 567}}) expect(req).toEqual({ url: 'http://swagger.io/v1/pet/123?test=567', @@ -1710,7 +1710,7 @@ describe('execute', () => { } } - const req = buildRequest({spec, operationId: 'getPetsById', parameters: {'id-path': 123, 'test-query': 567}}) + const req = buildRequest({spec, operationId: 'getPetsById', parameters: {id: 123, test: 567}}) expect(req).toEqual({ url: 'http://swagger.io/v1/pet/123?test=567', @@ -1739,7 +1739,7 @@ describe('execute', () => { } } - const req = buildRequest({spec, operationId: 'deleteMe', parameters: {'id-path': 'foo/bar'}}) + const req = buildRequest({spec, operationId: 'deleteMe', parameters: {id: 'foo/bar'}}) expect(req).toEqual({ url: 'http://swagger.io/v1/foo%2Fbar', @@ -1773,7 +1773,7 @@ describe('execute', () => { const req = buildRequest({spec, requestContentType: 'application/x-www-form-urlencoded', operationId: 'postMe', - parameters: {'petId-formData': 'id'}}) + parameters: {petId: 'id'}}) expect(req).toEqual({ url: 'http://swagger.io/v1/one', From 39e3ba624b5752d826b45e6ae18bb908ae38eadf Mon Sep 17 00:00:00 2001 From: Owen Conti Date: Thu, 3 Aug 2017 18:48:10 -0600 Subject: [PATCH 7/9] Remove updated signature in test/index.js tests --- test/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/index.js b/test/index.js index 38821769d..11cb7fc6b 100644 --- a/test/index.js +++ b/test/index.js @@ -467,7 +467,7 @@ describe('constructor', () => { req.url = 'http://petstore.swagger.io/v2/pet/4' } }).then((client) => { - client.apis.pet.getPetById({'petId-path': 3}).then((data) => { + client.apis.pet.getPetById({petId: 3}).then((data) => { expect(data.body.id).toEqual(4) cb() }) @@ -481,7 +481,7 @@ describe('constructor', () => { res.body.id = 4 } }).then((client) => { - client.apis.pet.getPetById({'petId-path': 3}).then((data) => { + client.apis.pet.getPetById({petId: 3}).then((data) => { expect(data.body.id).toEqual(4) cb() }) From 55b501c8a982baafd9bde027e37e3548e2e15ea6 Mon Sep 17 00:00:00 2001 From: Owen Conti Date: Thu, 3 Aug 2017 19:28:16 -0600 Subject: [PATCH 8/9] Update format to `in.name` as defined in OAS3. Add console.warn message for user when buildRequest is passed an ambiguous parameter. --- src/execute.js | 55 +++++++++++++++++++++++++++++-------------------- test/execute.js | 40 ++++++++++++++++++++++++++++++++++- 2 files changed, 72 insertions(+), 23 deletions(-) diff --git a/src/execute.js b/src/execute.js index 6338ebe29..15451a8da 100755 --- a/src/execute.js +++ b/src/execute.js @@ -17,6 +17,10 @@ const OperationNotFoundError = createError('OperationNotFoundError', function (m Object.assign(this, extra || {}) }) +const findParametersWithName = (name, parameters) => { + return parameters.filter(p => p.name === name) +} + // For stubbing in tests export const self = { buildRequest @@ -110,36 +114,43 @@ export function buildRequest({ req.headers.accept = responseContentType } - // Add values to request - arrayOrEmpty(operation.parameters) // operation parameters + const combinedParameters = [] + .concat(arrayOrEmpty(operation.parameters)) // operation parameters .concat(arrayOrEmpty(path.parameters)) // path parameters - .forEach((parameter) => { - const builder = parameterBuilders[parameter.in] - let value - if (parameter.in === 'body' && parameter.schema && parameter.schema.properties) { - value = parameters - } + // Add values to request + combinedParameters.forEach((parameter) => { + const builder = parameterBuilders[parameter.in] + let value - value = parameter && parameter.name && parameters[parameter.name] + if (parameter.in === 'body' && parameter.schema && parameter.schema.properties) { + value = parameters + } + + value = parameter && parameter.name && parameters[parameter.name] - if (typeof value === 'undefined') { + if (typeof value === 'undefined') { // check for `name-in` formatted key - value = parameter && parameter.name && parameters[`${parameter.name}-${parameter.in}`] - } + value = parameter && parameter.name && parameters[`${parameter.in}.${parameter.name}`] + } + else if (findParametersWithName(parameter.name, combinedParameters).length > 1) { + // value came from `parameters[parameter.name]` + // check to see if this is an ambiguous parameter + 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.`) + } - if (typeof parameter.default !== 'undefined' && typeof value === 'undefined') { - value = parameter.default - } + if (typeof parameter.default !== 'undefined' && typeof value === 'undefined') { + value = parameter.default + } - if (typeof value === 'undefined' && parameter.required && !parameter.allowEmptyValue) { - throw new Error(`Required parameter ${parameter.name} is not provided`) - } + if (typeof value === 'undefined' && parameter.required && !parameter.allowEmptyValue) { + throw new Error(`Required parameter ${parameter.name} is not provided`) + } - if (builder) { - builder({req, parameter, value, operation, spec}) - } - }) + if (builder) { + builder({req, parameter, value, operation, spec}) + } + }) // Add securities, which are applicable req = applySecurities({request: req, securities, operation, spec}) diff --git a/test/execute.js b/test/execute.js index 49e61549b..9a973cb8e 100644 --- a/test/execute.js +++ b/test/execute.js @@ -1335,7 +1335,7 @@ describe('execute', () => { } // When - const req = buildRequest({spec, operationId: 'getMe', parameters: {'name-query': 'john'}}) + const req = buildRequest({spec, operationId: 'getMe', parameters: {'query.name': 'john'}}) // Then expect(req).toEqual({ @@ -1345,6 +1345,44 @@ describe('execute', () => { headers: { } }) }) + + it('should set all parameter options when given an ambiguous parameter value', function () { + // Given + const spec = { + host: 'swagger.io', + basePath: '/v1', + paths: { + '/one': { + get: { + operationId: 'getMe', + parameters: [{ + name: 'name', + in: 'query', + type: 'string' + }, { + name: 'name', + in: 'formData', + type: 'string' + }] + } + } + } + } + + // When + const req = buildRequest({spec, operationId: 'getMe', parameters: {name: 'john'}}) + + // Then + expect(req).toEqual({ + url: 'http://swagger.io/v1/one?name=john', + method: 'GET', + credentials: 'same-origin', + headers: { + 'content-type': 'application/x-www-form-urlencoded' + }, + body: 'name=john' + }) + }) }) describe('body', function () { From aa904d4a04a39905080618630de7dc443bfb32b5 Mon Sep 17 00:00:00 2001 From: Owen Conti Date: Mon, 18 Sep 2017 19:52:31 -0600 Subject: [PATCH 9/9] Fix broken test after merge. --- test/execute.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/execute.js b/test/execute.js index 671cf545e..14dd2ac72 100644 --- a/test/execute.js +++ b/test/execute.js @@ -1412,7 +1412,7 @@ describe('execute', () => { method: 'GET', credentials: 'same-origin', headers: { - 'content-type': 'application/x-www-form-urlencoded' + 'Content-Type': 'application/x-www-form-urlencoded' }, body: 'name=john' })