Skip to content

Commit 4e3a38d

Browse files
committed
bugfix: walk on parameter references
The walker doesn't walk on parameter references (#/parameters/<id>) which may contain definition references (#/definitions/<id>) that we want to keep. This happens often with DeleteOptions and the DeleteOptions definition ends up being filtered out when looking at a OpenAPI V2 document.
1 parent c8a335a commit 4e3a38d

File tree

2 files changed

+73
-14
lines changed

2 files changed

+73
-14
lines changed

pkg/aggregator/aggregator_test.go

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ func (d DebugSpec) String() string {
4545
}
4646
func TestFilterSpecs(t *testing.T) {
4747
var spec1, spec1_filtered *spec.Swagger
48-
yaml.Unmarshal([]byte(`
48+
ast := assert.New(t)
49+
50+
err := yaml.Unmarshal([]byte(`
4951
swagger: "2.0"
5052
paths:
5153
/test:
@@ -65,6 +67,11 @@ paths:
6567
405:
6668
description: "Invalid input"
6769
$ref: "#/definitions/InvalidInput"
70+
delete:
71+
summary: "Test API Delete"
72+
operationId: "deleteTest"
73+
parameters:
74+
- $ref: "#/parameters/body-deleteoptions"
6875
/othertest:
6976
post:
7077
tags:
@@ -82,6 +89,12 @@ paths:
8289
required: true
8390
schema:
8491
$ref: "#/definitions/Test2"
92+
delete:
93+
summary: "Test2 API Delete"
94+
operationId: "deleteTest2"
95+
parameters:
96+
- schema:
97+
$ref: "#/definitions/DeleteOptions"
8598
definitions:
8699
Test:
87100
type: "object"
@@ -102,9 +115,24 @@ definitions:
102115
$ref: "#/definitions/Other"
103116
Other:
104117
type: "string"
118+
DeleteOptions:
119+
type: "object"
120+
properties:
121+
preconditions:
122+
$ref: "#/definitions/Preconditions"
123+
Preconditions:
124+
type: "string"
125+
parameters:
126+
body-deleteoptions:
127+
name: body
128+
in: body
129+
schema:
130+
$ref: "#/definitions/DeleteOptions"
105131
`), &spec1)
106132

107-
yaml.Unmarshal([]byte(`
133+
ast.NoError(err)
134+
135+
err = yaml.Unmarshal([]byte(`
108136
swagger: "2.0"
109137
paths:
110138
/test:
@@ -124,6 +152,11 @@ paths:
124152
405:
125153
description: "Invalid input"
126154
$ref: "#/definitions/InvalidInput"
155+
delete:
156+
summary: "Test API Delete"
157+
operationId: "deleteTest"
158+
parameters:
159+
- $ref: "#/parameters/body-deleteoptions"
127160
definitions:
128161
Test:
129162
type: "object"
@@ -137,9 +170,22 @@ definitions:
137170
InvalidInput:
138171
type: "string"
139172
format: "string"
173+
DeleteOptions:
174+
type: "object"
175+
properties:
176+
preconditions:
177+
$ref: "#/definitions/Preconditions"
178+
Preconditions:
179+
type: "string"
180+
parameters:
181+
body-deleteoptions:
182+
name: body
183+
in: body
184+
schema:
185+
$ref: "#/definitions/DeleteOptions"
140186
`), &spec1_filtered)
187+
ast.NoError(err)
141188

142-
ast := assert.New(t)
143189
orig_spec1, _ := cloneSpec(spec1)
144190
new_spec1 := FilterSpecByPathsWithoutSideEffects(spec1, []string{"/test"})
145191
ast.Equal(DebugSpec{spec1_filtered}, DebugSpec{new_spec1})

pkg/aggregator/walker.go

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,25 @@ func walkOnAllReferences(walkRef func(ref *spec.Ref), root *spec.Swagger) {
4848
walkRef(ref)
4949

5050
refStr := ref.String()
51-
if refStr == "" || !strings.HasPrefix(refStr, definitionPrefix) {
51+
if refStr == "" {
5252
return
5353
}
54-
defName := refStr[len(definitionPrefix):]
5554

56-
if _, found := root.Definitions[defName]; found && !alreadyVisited[refStr] {
57-
alreadyVisited[refStr] = true
58-
def := root.Definitions[defName]
59-
walker.walkSchema(&def)
55+
if strings.HasPrefix(refStr, parameterPrefix) {
56+
paramName := refStr[len(parameterPrefix):]
57+
if param, found := root.Parameters[paramName]; found {
58+
walker.walkParam(param)
59+
}
60+
} else if strings.HasPrefix(refStr, definitionPrefix) {
61+
defName := refStr[len(definitionPrefix):]
62+
63+
if _, found := root.Definitions[defName]; found && !alreadyVisited[refStr] {
64+
alreadyVisited[refStr] = true
65+
def := root.Definitions[defName]
66+
walker.walkSchema(&def)
67+
}
6068
}
69+
6170
}
6271
walker.Start()
6372
}
@@ -116,11 +125,15 @@ func (s *readonlyReferenceWalker) walkParams(params []spec.Parameter) {
116125
return
117126
}
118127
for _, param := range params {
119-
s.walkRefCallback(&param.Ref)
120-
s.walkSchema(param.Schema)
121-
if param.Items != nil {
122-
s.walkRefCallback(&param.Items.Ref)
123-
}
128+
s.walkParam(param)
129+
}
130+
}
131+
132+
func (s *readonlyReferenceWalker) walkParam(param spec.Parameter) {
133+
s.walkRefCallback(&param.Ref)
134+
s.walkSchema(param.Schema)
135+
if param.Items != nil {
136+
s.walkRefCallback(&param.Items.Ref)
124137
}
125138
}
126139

0 commit comments

Comments
 (0)