-
Notifications
You must be signed in to change notification settings - Fork 68
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* replicate issue * fixing type change checks * finish response checks * fixed request
- Loading branch information
Reuven Harrison
authored
Jun 6, 2023
1 parent
ae60d52
commit 6629e0d
Showing
9 changed files
with
397 additions
and
23 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
package checker_test | ||
|
||
import ( | ||
"testing" | ||
|
||
"github.com/stretchr/testify/require" | ||
"github.com/tufin/oasdiff/checker" | ||
"github.com/tufin/oasdiff/diff" | ||
) | ||
|
||
// BC: changing request's body schema type from string to number is breaking | ||
func TestBreaking_ReqTypeStringToNumber(t *testing.T) { | ||
file := "../data/type-change/simple-request.yaml" | ||
|
||
s1, err := open(file) | ||
require.NoError(t, err) | ||
s1.Spec.Paths["/test"].Post.RequestBody.Value.Content["application/json"].Schema.Value.Type = "string" | ||
|
||
s2, err := open(file) | ||
require.NoError(t, err) | ||
s2.Spec.Paths["/test"].Post.RequestBody.Value.Content["application/json"].Schema.Value.Type = "number" | ||
|
||
d, osm, err := diff.GetWithOperationsSourcesMap(getConfig(), s1, s2) | ||
require.NoError(t, err) | ||
errs := checker.CheckBackwardCompatibility(checker.GetDefaultChecks(), d, osm) | ||
require.Len(t, errs, 1) | ||
require.Equal(t, "request-body-type-changed", errs[0].Id) | ||
require.Equal(t, "the request's body type/format changed from 'string'/'none' to 'number'/'none'", errs[0].Text) | ||
} | ||
|
||
// BC: changing request's body schema type from number to string is breaking | ||
func TestBreaking_ReqTypeNumberToString(t *testing.T) { | ||
file := "../data/type-change/simple-request.yaml" | ||
|
||
s1, err := open(file) | ||
require.NoError(t, err) | ||
s1.Spec.Paths["/test"].Post.RequestBody.Value.Content["application/json"].Schema.Value.Type = "number" | ||
|
||
s2, err := open(file) | ||
require.NoError(t, err) | ||
s2.Spec.Paths["/test"].Post.RequestBody.Value.Content["application/json"].Schema.Value.Type = "string" | ||
|
||
d, osm, err := diff.GetWithOperationsSourcesMap(getConfig(), s1, s2) | ||
require.NoError(t, err) | ||
errs := checker.CheckBackwardCompatibility(checker.GetDefaultChecks(), d, osm) | ||
require.Len(t, errs, 1) | ||
require.Equal(t, "request-body-type-changed", errs[0].Id) | ||
require.Equal(t, "the request's body type/format changed from 'number'/'none' to 'string'/'none'", errs[0].Text) | ||
} | ||
|
||
// BC: changing request's body schema type from number to integer is breaking | ||
func TestBreaking_ReqTypeNumberToInteger(t *testing.T) { | ||
file := "../data/type-change/simple-request.yaml" | ||
|
||
s1, err := open(file) | ||
require.NoError(t, err) | ||
s1.Spec.Paths["/test"].Post.RequestBody.Value.Content["application/json"].Schema.Value.Type = "number" | ||
|
||
s2, err := open(file) | ||
require.NoError(t, err) | ||
s2.Spec.Paths["/test"].Post.RequestBody.Value.Content["application/json"].Schema.Value.Type = "integer" | ||
|
||
d, osm, err := diff.GetWithOperationsSourcesMap(getConfig(), s1, s2) | ||
require.NoError(t, err) | ||
errs := checker.CheckBackwardCompatibility(checker.GetDefaultChecks(), d, osm) | ||
require.Len(t, errs, 1) | ||
require.Equal(t, "request-body-type-changed", errs[0].Id) | ||
require.Equal(t, "the request's body type/format changed from 'number'/'none' to 'integer'/'none'", errs[0].Text) | ||
} | ||
|
||
// BC: changing request's body schema type from integer to number is not breaking | ||
func TestBreaking_ReqTypeIntegerToNumber(t *testing.T) { | ||
file := "../data/type-change/simple-request.yaml" | ||
|
||
s1, err := open(file) | ||
require.NoError(t, err) | ||
s1.Spec.Paths["/test"].Post.RequestBody.Value.Content["application/json"].Schema.Value.Type = "integer" | ||
|
||
s2, err := open(file) | ||
require.NoError(t, err) | ||
s2.Spec.Paths["/test"].Post.RequestBody.Value.Content["application/json"].Schema.Value.Type = "number" | ||
|
||
d, osm, err := diff.GetWithOperationsSourcesMap(getConfig(), s1, s2) | ||
require.NoError(t, err) | ||
errs := checker.CheckBackwardCompatibility(checker.GetDefaultChecks(), d, osm) | ||
require.Empty(t, errs) | ||
} | ||
|
||
// BC: changing request's body schema type from number/none to integer/int32 is breaking | ||
func TestBreaking_ReqTypeNumberToInt32(t *testing.T) { | ||
file := "../data/type-change/simple-request.yaml" | ||
|
||
s1, err := open(file) | ||
require.NoError(t, err) | ||
s1.Spec.Paths["/test"].Post.RequestBody.Value.Content["application/json"].Schema.Value.Type = "number" | ||
|
||
s2, err := open(file) | ||
require.NoError(t, err) | ||
s2.Spec.Paths["/test"].Post.RequestBody.Value.Content["application/json"].Schema.Value.Type = "integer" | ||
s2.Spec.Paths["/test"].Post.RequestBody.Value.Content["application/json"].Schema.Value.Format = "int32" | ||
|
||
d, osm, err := diff.GetWithOperationsSourcesMap(getConfig(), s1, s2) | ||
require.NoError(t, err) | ||
errs := checker.CheckBackwardCompatibility(checker.GetDefaultChecks(), d, osm) | ||
require.Len(t, errs, 1) | ||
require.Equal(t, "request-body-type-changed", errs[0].Id) | ||
require.Equal(t, "the request's body type/format changed from 'number'/'none' to 'integer'/'int32'", errs[0].Text) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,122 @@ | ||
package checker_test | ||
|
||
import ( | ||
"testing" | ||
|
||
"github.com/stretchr/testify/require" | ||
"github.com/tufin/oasdiff/checker" | ||
"github.com/tufin/oasdiff/diff" | ||
) | ||
|
||
// BC: changing response's body schema type from string to number is breaking | ||
func TestBreaking_RespTypeStringToNumber(t *testing.T) { | ||
file := "../data/type-change/simple-response.yaml" | ||
|
||
s1, err := open(file) | ||
require.NoError(t, err) | ||
s1.Spec.Paths["/test"].Get.Responses["200"].Value.Content["application/json"].Schema.Value.Type = "string" | ||
|
||
s2, err := open(file) | ||
require.NoError(t, err) | ||
s2.Spec.Paths["/test"].Get.Responses["200"].Value.Content["application/json"].Schema.Value.Type = "number" | ||
|
||
d, osm, err := diff.GetWithOperationsSourcesMap(getConfig(), s1, s2) | ||
require.NoError(t, err) | ||
errs := checker.CheckBackwardCompatibility(checker.GetDefaultChecks(), d, osm) | ||
require.Len(t, errs, 1) | ||
require.Equal(t, "response-body-type-changed", errs[0].Id) | ||
require.Equal(t, "the response's body type/format changed from 'string'/'none' to 'number'/'none' for status '200'", errs[0].Text) | ||
} | ||
|
||
// BC: changing response's body schema type from number to string is breaking | ||
func TestBreaking_RespTypeNumberToString(t *testing.T) { | ||
file := "../data/type-change/simple-response.yaml" | ||
|
||
s1, err := open(file) | ||
require.NoError(t, err) | ||
s1.Spec.Paths["/test"].Get.Responses["200"].Value.Content["application/json"].Schema.Value.Type = "number" | ||
|
||
s2, err := open(file) | ||
require.NoError(t, err) | ||
s2.Spec.Paths["/test"].Get.Responses["200"].Value.Content["application/json"].Schema.Value.Type = "string" | ||
|
||
d, osm, err := diff.GetWithOperationsSourcesMap(getConfig(), s1, s2) | ||
require.NoError(t, err) | ||
errs := checker.CheckBackwardCompatibility(checker.GetDefaultChecks(), d, osm) | ||
require.Len(t, errs, 1) | ||
require.Equal(t, "response-body-type-changed", errs[0].Id) | ||
require.Equal(t, "the response's body type/format changed from 'number'/'none' to 'string'/'none' for status '200'", errs[0].Text) | ||
} | ||
|
||
// BC: changing response's body schema type from number to integer is not breaking | ||
func TestBreaking_RespTypeNumberToInteger(t *testing.T) { | ||
file := "../data/type-change/simple-response.yaml" | ||
|
||
s1, err := open(file) | ||
require.NoError(t, err) | ||
s1.Spec.Paths["/test"].Get.Responses["200"].Value.Content["application/json"].Schema.Value.Type = "number" | ||
|
||
s2, err := open(file) | ||
require.NoError(t, err) | ||
s2.Spec.Paths["/test"].Get.Responses["200"].Value.Content["application/json"].Schema.Value.Type = "integer" | ||
|
||
d, osm, err := diff.GetWithOperationsSourcesMap(getConfig(), s1, s2) | ||
require.NoError(t, err) | ||
errs := checker.CheckBackwardCompatibility(checker.GetDefaultChecks(), d, osm) | ||
require.Empty(t, errs) | ||
} | ||
|
||
// BC: changing response's body schema type from integer to number is breaking | ||
func TestBreaking_RespTypeIntegerToNumber(t *testing.T) { | ||
file := "../data/type-change/simple-response.yaml" | ||
|
||
s1, err := open(file) | ||
require.NoError(t, err) | ||
s1.Spec.Paths["/test"].Get.Responses["200"].Value.Content["application/json"].Schema.Value.Type = "integer" | ||
|
||
s2, err := open(file) | ||
require.NoError(t, err) | ||
s2.Spec.Paths["/test"].Get.Responses["200"].Value.Content["application/json"].Schema.Value.Type = "number" | ||
|
||
d, osm, err := diff.GetWithOperationsSourcesMap(getConfig(), s1, s2) | ||
require.NoError(t, err) | ||
errs := checker.CheckBackwardCompatibility(checker.GetDefaultChecks(), d, osm) | ||
require.Len(t, errs, 1) | ||
require.Equal(t, "response-body-type-changed", errs[0].Id) | ||
require.Equal(t, "the response's body type/format changed from 'integer'/'none' to 'number'/'none' for status '200'", errs[0].Text) | ||
} | ||
|
||
// BC: changing response's body schema type from number/none to integer/int32 is not breaking | ||
func TestBreaking_RespTypeNumberToInt32(t *testing.T) { | ||
file := "../data/type-change/simple-response.yaml" | ||
|
||
s1, err := open(file) | ||
require.NoError(t, err) | ||
s1.Spec.Paths["/test"].Get.Responses["200"].Value.Content["application/json"].Schema.Value.Type = "number" | ||
|
||
s2, err := open(file) | ||
require.NoError(t, err) | ||
s2.Spec.Paths["/test"].Get.Responses["200"].Value.Content["application/json"].Schema.Value.Type = "integer" | ||
s2.Spec.Paths["/test"].Get.Responses["200"].Value.Content["application/json"].Schema.Value.Format = "int32" | ||
|
||
d, osm, err := diff.GetWithOperationsSourcesMap(getConfig(), s1, s2) | ||
require.NoError(t, err) | ||
errs := checker.CheckBackwardCompatibility(checker.GetDefaultChecks(), d, osm) | ||
require.Empty(t, errs) | ||
} | ||
|
||
// BC: changing response's embedded property schema type from string/none to integer/int32 is breaking | ||
func TestBreaking_RespTypeChanged(t *testing.T) { | ||
s1, err := open("../data/type-change/base-response.yaml") | ||
require.NoError(t, err) | ||
|
||
s2, err := open("../data/type-change/revision-response.yaml") | ||
require.NoError(t, err) | ||
|
||
d, osm, err := diff.GetWithOperationsSourcesMap(getConfig(), s1, s2) | ||
require.NoError(t, err) | ||
errs := checker.CheckBackwardCompatibility(checker.GetDefaultChecks(), d, osm) | ||
require.Len(t, errs, 1) | ||
require.Equal(t, "response-property-type-changed", errs[0].Id) | ||
require.Equal(t, "the response's property type/format changed from 'string'/'none' to 'integer'/'int32' for status '200'", errs[0].Text) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
openapi: 3.0.1 | ||
info: | ||
title: Test | ||
version: "2.0" | ||
servers: | ||
- url: http://localhost:8080 | ||
tags: | ||
- name: Tests | ||
description: Test tag. | ||
paths: | ||
/api/atlas/v2/changeOfResponseArrayFieldTest: | ||
get: | ||
tags: | ||
- Tests | ||
summary: This is a test | ||
description: Test description. | ||
operationId: getTest | ||
parameters: | ||
- name: new | ||
in: query | ||
description: Test param | ||
schema: | ||
type: string | ||
responses: | ||
"200": | ||
description: OK | ||
content: | ||
application/vnd.atlas.2023-01-01+json: | ||
schema: | ||
type: array | ||
items: | ||
$ref: '#/components/schemas/ChangeOfResponseArrayFieldTestView' | ||
components: | ||
schemas: | ||
ChangeOfResponseArrayFieldTestView: | ||
type: object | ||
properties: | ||
testField: | ||
type: string | ||
description: A nested view |
Oops, something went wrong.