Skip to content

Commit b06eab0

Browse files
authored
fix: missing multiple referenced inherited parameters (#1295)
* tests: add failing case for bug * check for parameter name before refusing to merge values
1 parent 46238f6 commit b06eab0

File tree

2 files changed

+132
-1
lines changed

2 files changed

+132
-1
lines changed

src/helpers.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,9 @@ export function normalizeSwagger(parsedSpec) {
202202
else if (inheritName === 'parameters') {
203203
for (const param of inherits[inheritName]) {
204204
const exists = operation[inheritName].some((opParam) => {
205-
return opParam.name === param.name
205+
// check for `opParam.name` in case the parameter has
206+
// no name, which is important for $ref'd parameters
207+
return opParam.name && opParam.name === param.name
206208
})
207209

208210
if (!exists) {

test/subtree-resolver.js

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,135 @@ describe('subtree $ref resolver', function () {
317317
}
318318
})
319319
})
320+
it('should normalize Swagger 2.0 that use multiple $refs', async () => {
321+
const input = {
322+
swagger: '2.0',
323+
paths: {
324+
'/': {
325+
parameters: [
326+
{
327+
$ref: '#/parameters/One'
328+
},
329+
{
330+
$ref: '#/parameters/Two'
331+
}
332+
],
333+
get: {
334+
summary: 'has no operation parameters'
335+
},
336+
delete: {
337+
summary: 'has own operation parameters',
338+
parameters: [
339+
{
340+
name: 'Three',
341+
in: 'query'
342+
},
343+
{
344+
name: 'Four',
345+
in: 'query'
346+
}
347+
]
348+
}
349+
}
350+
},
351+
parameters: {
352+
One: {
353+
type: 'string',
354+
name: 'One',
355+
in: 'query'
356+
},
357+
Two: {
358+
type: 'string',
359+
name: 'Two',
360+
in: 'query'
361+
}
362+
}
363+
}
364+
365+
const res = await resolve(input, ['paths', '/'], {
366+
returnEntireTree: true
367+
})
368+
369+
expect(res).toEqual({
370+
errors: [],
371+
spec: {
372+
$$normalized: true,
373+
swagger: '2.0',
374+
paths: {
375+
'/': {
376+
parameters: [
377+
{
378+
type: 'string',
379+
name: 'One',
380+
in: 'query',
381+
$$ref: '#/parameters/One'
382+
},
383+
{
384+
type: 'string',
385+
name: 'Two',
386+
in: 'query',
387+
$$ref: '#/parameters/Two'
388+
}
389+
],
390+
get: {
391+
summary: 'has no operation parameters',
392+
parameters: [
393+
{
394+
type: 'string',
395+
name: 'One',
396+
in: 'query',
397+
$$ref: '#/parameters/One'
398+
},
399+
{
400+
type: 'string',
401+
name: 'Two',
402+
in: 'query',
403+
$$ref: '#/parameters/Two'
404+
}
405+
]
406+
},
407+
delete: {
408+
summary: 'has own operation parameters',
409+
parameters: [
410+
{
411+
name: 'Three',
412+
in: 'query'
413+
},
414+
{
415+
name: 'Four',
416+
in: 'query'
417+
},
418+
{
419+
type: 'string',
420+
name: 'One',
421+
in: 'query',
422+
$$ref: '#/parameters/One'
423+
},
424+
{
425+
type: 'string',
426+
name: 'Two',
427+
in: 'query',
428+
$$ref: '#/parameters/Two'
429+
}
430+
]
431+
}
432+
}
433+
},
434+
parameters: {
435+
One: {
436+
type: 'string',
437+
name: 'One',
438+
in: 'query'
439+
},
440+
Two: {
441+
type: 'string',
442+
name: 'Two',
443+
in: 'query'
444+
}
445+
}
446+
}
447+
})
448+
})
320449
it('should normalize idempotently', async () => {
321450
const input = {
322451
swagger: '2.0',

0 commit comments

Comments
 (0)