diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/BackwardIncompatibleProp.java b/core/src/main/java/org/openapitools/openapidiff/core/model/BackwardIncompatibleProp.java index f05a72f75..0772eacef 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/BackwardIncompatibleProp.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/BackwardIncompatibleProp.java @@ -53,6 +53,7 @@ public enum BackwardIncompatibleProp { SECURITY_SCHEME_SCOPES_INCREASED("incompatible.security.scheme.scopes.increased", true), SCHEMA_DISCRIMINATOR_CHANGED("incompatible.schema.discriminator.changed", true), SCHEMA_TYPE_CHANGED("incompatible.schema.type.changed", true), + SCHEMA_PATTERN_CHANGED("incompatible.schema.pattern.changed", true), ; private final String propertyName; diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedPattern.java b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedPattern.java index 06907cd2e..c61046580 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedPattern.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedPattern.java @@ -1,5 +1,7 @@ package org.openapitools.openapidiff.core.model.schema; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.SCHEMA_PATTERN_CHANGED; + import java.util.Objects; import org.openapitools.openapidiff.core.model.Changed; import org.openapitools.openapidiff.core.model.DiffContext; @@ -18,7 +20,13 @@ public ChangedPattern(String oldPattern, String newPattern, DiffContext context) @Override public DiffResult isChanged() { - return Objects.equals(oldPattern, newPattern) ? DiffResult.NO_CHANGES : DiffResult.INCOMPATIBLE; + if (Objects.equals(oldPattern, newPattern)) { + return DiffResult.NO_CHANGES; + } else if (SCHEMA_PATTERN_CHANGED.enabled(context)) { + return DiffResult.INCOMPATIBLE; + } else { + return DiffResult.COMPATIBLE; + } } @Override diff --git a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SchemaBCTest.java b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SchemaBCTest.java index 781b48f2a..28d6d398f 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SchemaBCTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/backcompat/SchemaBCTest.java @@ -6,6 +6,7 @@ import static org.openapitools.openapidiff.core.TestUtils.assertSpecUnchanged; import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_REQUIRED_DECREASED; import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.SCHEMA_DISCRIMINATOR_CHANGED; +import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.SCHEMA_PATTERN_CHANGED; import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.SCHEMA_TYPE_CHANGED; import org.junit.jupiter.api.Test; @@ -69,4 +70,10 @@ public void typeChanged() { BackwardIncompatibleProp prop = SCHEMA_TYPE_CHANGED; assertSpecIncompatible(BASE, "bc_schema_type_changed.yaml", prop); } + + @Test + public void patternChanged() { + BackwardIncompatibleProp prop = SCHEMA_PATTERN_CHANGED; + assertSpecIncompatible(BASE, "bc_schema_pattern_changed.yaml", prop); + } } diff --git a/core/src/test/resources/bc_schema_pattern_changed.yaml b/core/src/test/resources/bc_schema_pattern_changed.yaml new file mode 100644 index 000000000..3af05b7e1 --- /dev/null +++ b/core/src/test/resources/bc_schema_pattern_changed.yaml @@ -0,0 +1,116 @@ +openapi: 3.0.0 +info: + description: myDesc + title: myTitle + version: 1.0.0 +paths: + /widgets: + post: + operationId: widgetCreate + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateRequest' + responses: + '200': + description: successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/WidgetCreateResponse' + put: + operationId: widgetUpdate + requestBody: + content: + application/json: + schema: + type: object + properties: + put_prop1: + type: string + put_prop2: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: string +components: + schemas: + WidgetCreateRequest: + type: object + properties: + to_create: + $ref: '#/components/schemas/Widget_Polymorphic' + request_prop1: + type: integer + format: int32 + request_prop2: + type: integer + format: int64 + required: + - to_create + - request_prop1 + WidgetCreateResponse: + type: object + properties: + created: + $ref: '#/components/schemas/Widget_Polymorphic' + response_prop1: + type: integer + format: int32 + response_prop2: + type: integer + format: int64 + required: + - created + - response_prop1 + Widget_Polymorphic: + type: object + oneOf: + - $ref: '#/components/schemas/Doodad' + - $ref: '#/components/schemas/Gadget' + discriminator: + propertyName: '@type' + Widget: + type: object + properties: + '@type': + type: string + prop1: + type: string + pattern: '[A-Za-z0-9#$]$' + prop2: + type: integer + format: int32 + deprecated: true + required: + - '@type' + - prop1 + Doodad: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + doodad_prop1: + type: string + Gadget: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + gadget_prop1: + type: string + Gizmo: + type: object + allOf: + - $ref: '#/components/schemas/Widget' + - type: object + properties: + gizmo_prop1: + type: string