Skip to content

Commit ee3f14c

Browse files
authored
CLOUDP-262109: Fix response removal (#89)
1 parent 929a13a commit ee3f14c

File tree

3 files changed

+73
-50
lines changed

3 files changed

+73
-50
lines changed

tools/cli/internal/openapi/filter/path.go

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -40,19 +40,15 @@ type OperationConfig struct {
4040
operation *openapi3.Operation
4141
latestMatchedVersion *apiversion.APIVersion
4242
deprecatedVersions []*apiversion.APIVersion
43-
removeResponseCodes []string
4443
hasMinValidResponse bool
45-
shouldApply bool
4644
}
4745

4846
func newOperationConfig(op *openapi3.Operation) *OperationConfig {
4947
return &OperationConfig{
5048
operation: op,
5149
latestMatchedVersion: nil,
5250
deprecatedVersions: make([]*apiversion.APIVersion, 0),
53-
removeResponseCodes: make([]string, 0),
5451
hasMinValidResponse: false,
55-
shouldApply: false,
5652
}
5753
}
5854

@@ -96,7 +92,7 @@ func (f *PathFilter) apply(path *openapi3.PathItem) error {
9692
return err
9793
}
9894

99-
err = updateResponses(op, config, opConfig)
95+
err = updateResponses(op, config)
10096
if err != nil {
10197
return err
10298
}
@@ -118,7 +114,7 @@ func (f *PathFilter) apply(path *openapi3.PathItem) error {
118114
}
119115

120116
// updateResponses filters the response and removes the deprecated responses from the operation and add the to the operation config
121-
func updateResponses(op *openapi3.Operation, config *VersionConfig, opConfig *OperationConfig) error {
117+
func updateResponses(op *openapi3.Operation, config *VersionConfig) error {
122118
for responseCode, response := range op.Responses.Map() {
123119
if response.Value == nil {
124120
log.Printf("Ignoring response: %s for operationID: %s", responseCode, op.OperationID)
@@ -132,9 +128,7 @@ func updateResponses(op *openapi3.Operation, config *VersionConfig, opConfig *Op
132128

133129
if filteredResponse == nil && isVersionedContent(response.Value.Content) {
134130
log.Printf("Marking response for removal: %s", responseCode)
135-
opConfig.removeResponseCodes = append(opConfig.removeResponseCodes, responseCode)
136-
response.Value = nil
137-
response.Ref = ""
131+
op.Responses.Delete(responseCode)
138132
}
139133
response.Value.Content = filteredResponse
140134
}
@@ -225,12 +219,6 @@ func filterResponse(response *openapi3.ResponseRef, op *openapi3.Operation, rCon
225219
opConfig.deprecatedVersions = append(opConfig.deprecatedVersions, deprecatedVersionsPerContent...)
226220
}
227221

228-
// remove entirely the response code (e.g. "200") if the filtered content is empty
229-
if filteredContent == nil && isVersionedContent(response.Value.Content) {
230-
opConfig.removeResponseCodes = append(opConfig.removeResponseCodes, response.Ref)
231-
}
232-
233-
response.Value.Content = filteredContent
234222
return filteredContent, nil
235223
}
236224

tools/cli/internal/openapi/filter/path_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,60 @@ func getOasWithEmptyPaths() *openapi3.T {
182182
return oas
183183
}
184184

185+
func TestPathFilter_removeResponses(t *testing.T) {
186+
oas := &openapi3.T{}
187+
oas.Paths = &openapi3.Paths{}
188+
189+
operation := &openapi3.Operation{
190+
Responses: &openapi3.Responses{},
191+
}
192+
193+
operation.Responses.Set("200", &openapi3.ResponseRef{
194+
Value: &openapi3.Response{
195+
Content: map[string]*openapi3.MediaType{
196+
"application/vnd.atlas.2023-01-01+json": {
197+
Schema: &openapi3.SchemaRef{
198+
Value: &openapi3.Schema{
199+
Description: "description",
200+
},
201+
},
202+
},
203+
},
204+
},
205+
})
206+
207+
operation.Responses.Set("201", &openapi3.ResponseRef{
208+
Value: &openapi3.Response{
209+
Content: map[string]*openapi3.MediaType{
210+
"application/vnd.atlas.2024-05-30+json": {
211+
Schema: &openapi3.SchemaRef{
212+
Value: &openapi3.Schema{
213+
Description: "description",
214+
},
215+
},
216+
},
217+
},
218+
},
219+
})
220+
221+
oas.Paths.Set("/path", &openapi3.PathItem{Get: operation})
222+
223+
version, err := apiversion.New(apiversion.WithVersion("2023-01-01"))
224+
require.NoError(t, err)
225+
226+
filter := &PathFilter{
227+
oas: oas,
228+
metadata: &Metadata{targetVersion: version},
229+
}
230+
231+
require.NoError(t, filter.Apply())
232+
assert.NotNil(t, oas.Paths.Find("/path").Get)
233+
assert.NotNil(t, oas.Paths.Find("/path").Get.Responses)
234+
assert.NotNil(t, oas.Paths.Find("/path").Get.Responses.Map()["200"])
235+
assert.Nil(t, oas.Paths.Find("/path").Get.Responses.Map()["201"])
236+
assert.Equal(t, 1, oas.Paths.Find("/path").Get.Responses.Len())
237+
}
238+
185239
func getOasWithPaths() *openapi3.T {
186240
oas := &openapi3.T{}
187241
oas.Paths = &openapi3.Paths{

tools/cli/test/e2e/cli/split_test.go

Lines changed: 16 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package cli
22

33
import (
44
"bytes"
5+
"fmt"
56
"os"
67
"os/exec"
78
"path/filepath"
@@ -72,7 +73,7 @@ func TestSplitEnvironments(t *testing.T) {
7273
"-o",
7374
getOutputFolder(t, prodFolder)+"/output.json",
7475
"--env",
75-
"prod",
76+
"dev",
7677
)
7778

7879
var o, e bytes.Buffer
@@ -117,40 +118,20 @@ func ValidateVersionedSpec(t *testing.T, correctSpecPath, generatedSpecPath stri
117118
message := "Generated spec is not equal to the correct spec for path: " + correctSpecPath + "\n\n" +
118119
"oasdiff diff --max-circular-dep 15 " + correctSpecPath + " " + generatedSpecPath + " > diff.yaml"
119120

120-
require.Empty(t, d.ExtensionsDiff, message)
121-
require.Empty(t, d.OpenAPIDiff, message)
122-
require.Empty(t, d.InfoDiff, message)
121+
if d.Empty() {
122+
return
123+
}
124+
125+
fmt.Println(message)
126+
require.Empty(t, d.ExtensionsDiff)
127+
require.Empty(t, d.OpenAPIDiff)
128+
require.Empty(t, d.InfoDiff)
123129
// require.Empty(t, d.EndpointsDiff) TODO: add in next PR
124-
require.Empty(t, d.PathsDiff.Added, message)
125-
require.Empty(t, d.PathsDiff.Deleted, message)
126-
require.Empty(t, d.SecurityDiff, message)
127-
require.Empty(t, d.ServersDiff, message)
128-
// require.Empty(t, d.TagsDiff, message) TODO: add in next PR
129-
require.Empty(t, d.ExternalDocsDiff, message)
130-
require.Empty(t, d.ExamplesDiff, message)
130+
// require.Empty(t, d.PathsDiff) TODO: add in next PR
131+
require.Empty(t, d.SecurityDiff)
132+
require.Empty(t, d.ServersDiff)
133+
// require.Empty(t, d.TagsDiff) TODO: adds in next PR
134+
require.Empty(t, d.ExternalDocsDiff)
135+
require.Empty(t, d.ExamplesDiff)
131136
require.Empty(t, d.ComponentsDiff)
132-
133-
for _, v := range d.PathsDiff.Modified {
134-
require.Empty(t, v.ExtensionsDiff)
135-
require.Empty(t, v.SummaryDiff)
136-
require.Empty(t, v.DescriptionDiff)
137-
require.Empty(t, v.ServersDiff)
138-
require.Empty(t, v.ParametersDiff)
139-
require.Empty(t, v.RefDiff)
140-
require.Empty(t, v.OperationsDiff.Added)
141-
require.Empty(t, v.OperationsDiff.Deleted)
142-
for _, op := range v.OperationsDiff.Modified {
143-
require.Empty(t, op.ExtensionsDiff)
144-
require.Empty(t, op.SummaryDiff)
145-
require.Empty(t, op.DescriptionDiff)
146-
require.Empty(t, op.ServersDiff)
147-
require.Empty(t, op.ParametersDiff, message)
148-
require.Empty(t, op.RequestBodyDiff)
149-
if op.ResponsesDiff != nil {
150-
require.Empty(t, op.ResponsesDiff.Deleted)
151-
require.Empty(t, op.ResponsesDiff.Modified)
152-
// require.Empty(t, op.ResponsesDiff.Added, message) TODO: add in next PR
153-
}
154-
}
155-
}
156137
}

0 commit comments

Comments
 (0)