Skip to content

Commit 40650c8

Browse files
response-media-type-changed (#695)
1 parent 1d508f5 commit 40650c8

18 files changed

+774
-121
lines changed
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package checker
2+
3+
import (
4+
"github.com/oasdiff/oasdiff/diff"
5+
)
6+
7+
const (
8+
ResponseMediaTypeNameChangedId = "response-media-type-name-changed"
9+
ResponseMediaTypeNameGeneralizedId = "response-media-type-name-generalized"
10+
ResponseMediaTypeNameSpecializedId = "response-media-type-name-specialized"
11+
)
12+
13+
func ResponseMediaTypeNameUpdatedCheck(diffReport *diff.Diff, operationsSources *diff.OperationsSourcesMap, config *Config) Changes {
14+
result := make(Changes, 0)
15+
if diffReport.PathsDiff == nil {
16+
return result
17+
}
18+
for path, pathItem := range diffReport.PathsDiff.Modified {
19+
if pathItem.OperationsDiff == nil {
20+
continue
21+
}
22+
for operation, operationItem := range pathItem.OperationsDiff.Modified {
23+
if operationItem.ResponsesDiff == nil {
24+
continue
25+
}
26+
if operationItem.ResponsesDiff.Modified == nil {
27+
continue
28+
}
29+
for responseStatus, responsesDiff := range operationItem.ResponsesDiff.Modified {
30+
if responsesDiff.ContentDiff == nil {
31+
continue
32+
}
33+
for _, mediaType := range responsesDiff.ContentDiff.MediaTypeModified {
34+
if mediaType.NameDiff == nil {
35+
continue
36+
}
37+
38+
// If parameters changed, this is a changed media type
39+
if !mediaType.NameDiff.ParametersDiff.Empty() {
40+
result = append(result, NewApiChange(
41+
ResponseMediaTypeNameChangedId,
42+
config,
43+
[]any{mediaType.NameDiff.NameDiff.From, mediaType.NameDiff.NameDiff.To, responseStatus},
44+
"",
45+
operationsSources,
46+
operationItem.Revision,
47+
operation,
48+
path,
49+
))
50+
continue
51+
}
52+
53+
// If params didn't change, check if the media type is a generalization or specialization
54+
id := ResponseMediaTypeNameGeneralizedId
55+
if mediaType.NameDiff.IsContained() {
56+
id = ResponseMediaTypeNameSpecializedId
57+
}
58+
59+
result = append(result, NewApiChange(
60+
id,
61+
config,
62+
[]any{mediaType.NameDiff.NameDiff.From, mediaType.NameDiff.NameDiff.To, responseStatus},
63+
"",
64+
operationsSources,
65+
operationItem.Revision,
66+
operation,
67+
path,
68+
))
69+
}
70+
}
71+
}
72+
}
73+
return result
74+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package checker_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/oasdiff/oasdiff/checker"
7+
"github.com/oasdiff/oasdiff/diff"
8+
"github.com/stretchr/testify/require"
9+
)
10+
11+
// BC: changing parameters of a media type is not breaking
12+
func TestChangeMediaTypeParameters(t *testing.T) {
13+
s1, err := open("../data/checker/add_new_media_type_revision.yaml")
14+
require.NoError(t, err)
15+
s2, err := open("../data/checker/add_new_media_type_params_modified.yaml")
16+
require.NoError(t, err)
17+
18+
d, osm, err := diff.GetWithOperationsSourcesMap(diff.NewConfig(), s1, s2)
19+
require.NoError(t, err)
20+
errs := checker.CheckBackwardCompatibilityUntilLevel(singleCheckConfig(checker.ResponseMediaTypeNameUpdatedCheck), d, osm, checker.INFO)
21+
require.Len(t, errs, 1)
22+
require.Equal(t, checker.INFO, errs[0].GetLevel())
23+
require.Equal(t, "media type 'application/json' was changed to 'application/problem+json;q=1' for the response status '200'", errs[0].GetUncolorizedText(checker.NewDefaultLocalizer()))
24+
}
25+
26+
// BC: modifying a media type name in response to make it more specific is not breaking
27+
func TestSpecializeMediaTypeName(t *testing.T) {
28+
s1, err := open("../data/checker/add_new_media_type_revision.yaml")
29+
require.NoError(t, err)
30+
s2, err := open("../data/checker/add_new_media_type_name_modified.yaml")
31+
require.NoError(t, err)
32+
33+
d, osm, err := diff.GetWithOperationsSourcesMap(diff.NewConfig(), s1, s2)
34+
require.NoError(t, err)
35+
errs := checker.CheckBackwardCompatibilityUntilLevel(singleCheckConfig(checker.ResponseMediaTypeNameUpdatedCheck), d, osm, checker.INFO)
36+
require.Len(t, errs, 1)
37+
require.Equal(t, checker.INFO, errs[0].GetLevel())
38+
require.Equal(t, "media type 'application/json' was changed to a more specific media type 'application/problem+json' for the response status '200'", errs[0].GetUncolorizedText(checker.NewDefaultLocalizer()))
39+
}
40+
41+
// BC: modifying a media type name in response to make it more general is breaking
42+
func TestGeneralizeMediaTypeName(t *testing.T) {
43+
s1, err := open("../data/checker/add_new_media_type_name_modified.yaml")
44+
require.NoError(t, err)
45+
s2, err := open("../data/checker/add_new_media_type_revision.yaml")
46+
require.NoError(t, err)
47+
48+
d, osm, err := diff.GetWithOperationsSourcesMap(diff.NewConfig(), s1, s2)
49+
require.NoError(t, err)
50+
errs := checker.CheckBackwardCompatibilityUntilLevel(singleCheckConfig(checker.ResponseMediaTypeNameUpdatedCheck), d, osm, checker.INFO)
51+
require.Len(t, errs, 1)
52+
require.Equal(t, checker.ERR, errs[0].GetLevel())
53+
require.Equal(t, "media type 'application/problem+json' was changed to a more general media type 'application/json' for the response status '200'", errs[0].GetUncolorizedText(checker.NewDefaultLocalizer()))
54+
}

checker/check_response_mediatype_updated.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,6 @@ func ResponseMediaTypeUpdatedCheck(diffReport *diff.Diff, operationsSources *dif
2929
if responsesDiff.ContentDiff == nil {
3030
continue
3131
}
32-
if responsesDiff.ContentDiff.MediaTypeDeleted == nil {
33-
continue
34-
}
3532
for _, mediaType := range responsesDiff.ContentDiff.MediaTypeDeleted {
3633
result = append(result, NewApiChange(
3734
ResponseMediaTypeRemovedId,

checker/check_response_mediatype_updated_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func TestAddNewMediaType(t *testing.T) {
3131
}, errs[0])
3232
}
3333

34-
// CL: removing a new media type to response
34+
// CL: removing a media type from response
3535
func TestDeleteNewMediaType(t *testing.T) {
3636
s1, err := open("../data/checker/add_new_media_type_revision.yaml")
3737
require.NoError(t, err)

checker/config_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import (
88
)
99

1010
const (
11-
numOfChecks = 94
12-
numOfIds = 274
11+
numOfChecks = 95
12+
numOfIds = 277
1313
)
1414

1515
func TestNewConfig(t *testing.T) {

0 commit comments

Comments
 (0)