From 9de3b87f54595eab05b612589e49f1391ce61c6e Mon Sep 17 00:00:00 2001 From: Kyle Shockey Date: Fri, 20 Apr 2018 17:20:03 -0700 Subject: [PATCH 1/2] tests: add failing case for bug --- test/subtree-resolver.js | 129 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) diff --git a/test/subtree-resolver.js b/test/subtree-resolver.js index a70f48a9b..567e44e95 100644 --- a/test/subtree-resolver.js +++ b/test/subtree-resolver.js @@ -317,6 +317,135 @@ describe('subtree $ref resolver', function () { } }) }) + it('should normalize Swagger 2.0 that use multiple $refs', async () => { + const input = { + swagger: '2.0', + paths: { + '/': { + parameters: [ + { + $ref: '#/parameters/One' + }, + { + $ref: '#/parameters/Two' + } + ], + get: { + summary: 'has no operation parameters' + }, + delete: { + summary: 'has own operation parameters', + parameters: [ + { + name: 'Three', + in: 'query' + }, + { + name: 'Four', + in: 'query' + } + ] + } + } + }, + parameters: { + One: { + type: 'string', + name: 'One', + in: 'query' + }, + Two: { + type: 'string', + name: 'Two', + in: 'query' + } + } + } + + const res = await resolve(input, ['paths', '/'], { + returnEntireTree: true + }) + + expect(res).toEqual({ + errors: [], + spec: { + $$normalized: true, + swagger: '2.0', + paths: { + '/': { + parameters: [ + { + type: 'string', + name: 'One', + in: 'query', + $$ref: '#/parameters/One' + }, + { + type: 'string', + name: 'Two', + in: 'query', + $$ref: '#/parameters/Two' + } + ], + get: { + summary: 'has no operation parameters', + parameters: [ + { + type: 'string', + name: 'One', + in: 'query', + $$ref: '#/parameters/One' + }, + { + type: 'string', + name: 'Two', + in: 'query', + $$ref: '#/parameters/Two' + } + ] + }, + delete: { + summary: 'has own operation parameters', + parameters: [ + { + name: 'Three', + in: 'query' + }, + { + name: 'Four', + in: 'query' + }, + { + type: 'string', + name: 'One', + in: 'query', + $$ref: '#/parameters/One' + }, + { + type: 'string', + name: 'Two', + in: 'query', + $$ref: '#/parameters/Two' + } + ] + } + } + }, + parameters: { + One: { + type: 'string', + name: 'One', + in: 'query' + }, + Two: { + type: 'string', + name: 'Two', + in: 'query' + } + } + } + }) + }) it('should normalize idempotently', async () => { const input = { swagger: '2.0', From 14b730f81c9cf6d9d1a6d502aede2a182d8e2191 Mon Sep 17 00:00:00 2001 From: Kyle Shockey Date: Fri, 20 Apr 2018 17:20:31 -0700 Subject: [PATCH 2/2] check for parameter name before refusing to merge values --- src/helpers.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/helpers.js b/src/helpers.js index ba594fbf4..ad46f3d99 100755 --- a/src/helpers.js +++ b/src/helpers.js @@ -202,7 +202,9 @@ export function normalizeSwagger(parsedSpec) { else if (inheritName === 'parameters') { for (const param of inherits[inheritName]) { const exists = operation[inheritName].some((opParam) => { - return opParam.name === param.name + // check for `opParam.name` in case the parameter has + // no name, which is important for $ref'd parameters + return opParam.name && opParam.name === param.name }) if (!exists) {