Skip to content

Commit

Permalink
feat: better handling of enum changes based on direction
Browse files Browse the repository at this point in the history
| Enum Change   | In Request (path/query/body) | In Response (body) | In Both  |
|---------------|------------------------------|--------------------|----------|
| Value Added   | OK                           | Breaking           | Breaking |
| Value Removed | Breaking                     | OK                 | Breaking |
  • Loading branch information
NextFire committed Jul 9, 2024
1 parent 09439c9 commit 399e62f
Show file tree
Hide file tree
Showing 14 changed files with 736 additions and 36 deletions.
82 changes: 82 additions & 0 deletions src/Criteo.OpenApi.Comparator.UTest/OpenApiEnumDirectionTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using Criteo.OpenApi.Comparator.Logging;
using NUnit.Framework;

namespace Criteo.OpenApi.Comparator.UTest;

[TestFixture]
public class OpenApiEnumDirectionTests
{
[TestCase("path_add", "#/paths/~1order~1{path}/post/parameters/0/schema/enum")]
[TestCase("query_add", "#/paths/~1order~1{path}/post/parameters/1/schema/enum")]
[TestCase("body_add", "#/paths/~1order~1{path}/post/requestBody/content/application~1json/schema/properties/foo/enum")]
public void CompareOAS_ShouldReturn_NonBreakingEnumChange_InRequest(string oasName, string jsonRef)
{
var differences = CompareSpecifications(oasName);
differences.AssertContains(new ExpectedDifference
{
Rule = ComparisonRules.AddedEnumValue,
Severity = Severity.Warning,
NewJsonRef = jsonRef
}, 1);
}

[TestCase("response_remove", "#/paths/~1order~1{path}/post/responses/200/content/application~1json/schema/properties/bar/enum")]
public void CompareOAS_ShouldReturn_NonBreakingEnumChange_InResponse(string oasName, string jsonRef)
{
var differences = CompareSpecifications(oasName);
differences.AssertContains(new ExpectedDifference
{
Rule = ComparisonRules.RemovedEnumValue,
Severity = Severity.Warning,
NewJsonRef = jsonRef
}, 1);
}

[TestCase("path_remove", "#/paths/~1order~1{path}/post/parameters/0/schema/enum")]
[TestCase("query_remove", "#/paths/~1order~1{path}/post/parameters/1/schema/enum")]
[TestCase("body_remove", "#/paths/~1order~1{path}/post/requestBody/content/application~1json/schema/properties/foo/enum")]
public void CompareOAS_ShouldReturn_BreakingEnumChange_InRequest(string oasName, string jsonRef)
{
var differences = CompareSpecifications(oasName);
differences.AssertContains(new ExpectedDifference
{
Rule = ComparisonRules.RemovedEnumValue,
Severity = Severity.Error,
NewJsonRef = jsonRef,
}, 1);
}

[TestCase("response_add", "#/paths/~1order~1{path}/post/responses/200/content/application~1json/schema/properties/bar/enum")]
public void CompareOAS_ShouldReturn_BreakingEnumChange_InResponse(string oasName, string jsonRef)
{
var differences = CompareSpecifications(oasName);
differences.AssertContains(new ExpectedDifference
{
Rule = ComparisonRules.AddedEnumValue,
Severity = Severity.Error,
NewJsonRef = jsonRef
}, 1);
}

private static IList<ComparisonMessage> CompareSpecifications(string oasName)
{
var baseDirectory = Directory
.GetParent(typeof(OpenApiSpecificationsCompareTests).GetTypeInfo().Assembly.Location)
.ToString();

var referenceFileName = Path.Combine(baseDirectory, "Resource", "enum_direction", "reference.json");
var newFileName = Path.Combine(baseDirectory, "Resource", "enum_direction", oasName + ".yaml");

var differences = OpenApiComparator
.Compare(File.ReadAllText(referenceFileName), File.ReadAllText(newFileName), strict: true)
.ToList();

OpenApiSpecificationsCompareTests.ValidateDifferences(differences);

return differences;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -859,7 +859,7 @@ private static void ValidateMessage(ComparisonMessage message)
}
}

private static void ValidateDifferences(IEnumerable<ComparisonMessage> differences)
internal static void ValidateDifferences(IEnumerable<ComparisonMessage> differences)
{
foreach (var message in differences)
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
openapi: 3.0.0
info:
title: My API
version: 0.2.0
paths:
/order/{path}:
post:
summary: New Order
operationId: new_order_order__path__post
parameters:
- name: path
in: path
required: true
schema:
enum:
- abc
- def
type: string
title: Path
- name: query
in: query
required: true
schema:
enum:
- ghi
- jkl
type: string
title: Query
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/RequestModel"
responses:
"200":
description: Successful Response
content:
application/json:
schema:
$ref: "#/components/schemas/ResponseModel"
components:
schemas:
RequestModel:
properties:
foo:
type: string
enum:
- 123
- mno
- pqr
title: Foo
type: object
required:
- foo
title: RequestModel
ResponseModel:
properties:
bar:
type: string
enum:
- stu
- vwx
title: Bar
type: object
required:
- bar
title: ResponseModel
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
openapi: 3.0.0
info:
title: My API
version: 0.2.0
paths:
/order/{path}:
post:
summary: New Order
operationId: new_order_order__path__post
parameters:
- name: path
in: path
required: true
schema:
enum:
- abc
- def
type: string
title: Path
- name: query
in: query
required: true
schema:
enum:
- ghi
- jkl
type: string
title: Query
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/RequestModel"
responses:
"200":
description: Successful Response
content:
application/json:
schema:
$ref: "#/components/schemas/ResponseModel"
components:
schemas:
RequestModel:
properties:
foo:
type: string
enum:
- pqr
title: Foo
type: object
required:
- foo
title: RequestModel
ResponseModel:
properties:
bar:
type: string
enum:
- stu
- vwx
title: Bar
type: object
required:
- bar
title: ResponseModel
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
openapi: 3.0.0
info:
title: My API
version: 0.2.0
paths:
/order/{path}:
post:
summary: New Order
operationId: new_order_order__path__post
parameters:
- name: path
in: path
required: true
schema:
enum:
- abc
- 123
- def
type: string
title: Path
- name: query
in: query
required: true
schema:
enum:
- ghi
- jkl
type: string
title: Query
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/RequestModel"
responses:
"200":
description: Successful Response
content:
application/json:
schema:
$ref: "#/components/schemas/ResponseModel"
components:
schemas:
RequestModel:
properties:
foo:
type: string
enum:
- mno
- pqr
title: Foo
type: object
required:
- foo
title: RequestModel
ResponseModel:
properties:
bar:
type: string
enum:
- stu
- vwx
title: Bar
type: object
required:
- bar
title: ResponseModel
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
openapi: 3.0.0
info:
title: My API
version: 0.2.0
paths:
/order/{path}:
post:
summary: New Order
operationId: new_order_order__path__post
parameters:
- name: path
in: path
required: true
schema:
enum:
- abc
type: string
title: Path
- name: query
in: query
required: true
schema:
enum:
- ghi
- jkl
type: string
title: Query
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/RequestModel"
responses:
"200":
description: Successful Response
content:
application/json:
schema:
$ref: "#/components/schemas/ResponseModel"
components:
schemas:
RequestModel:
properties:
foo:
type: string
enum:
- mno
- pqr
title: Foo
type: object
required:
- foo
title: RequestModel
ResponseModel:
properties:
bar:
type: string
enum:
- stu
- vwx
title: Bar
type: object
required:
- bar
title: ResponseModel
Loading

0 comments on commit 399e62f

Please sign in to comment.