diff --git a/.circleci/config.yml b/.circleci/config.yml index e683fd70d..e58107c83 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -5,7 +5,7 @@ jobs: working_directory: ~/openapi-diff docker: - - image: circleci/openjdk:8-jdk-browsers + - image: circleci/openjdk:8-jdk-node-browsers steps: @@ -21,7 +21,7 @@ jobs: - ~/.m2 key: openapi-diff-{{ checksum "pom.xml" }} - - run: mvn package + - run: mvn package -X - store_test_results: path: target/surefire-reports diff --git a/pom.xml b/pom.xml index f369cfd05..658d3d8a2 100644 --- a/pom.xml +++ b/pom.xml @@ -53,13 +53,17 @@ UTF-8 github + 2.19.1 + 5.1.0 + 1.1.0 + 3.10.0 io.swagger.parser.v3 swagger-parser-v3 - 2.0.4 + 2.0.5 com.j2html @@ -67,9 +71,33 @@ 1.2.0 - junit - junit - 4.8.2 + org.junit.jupiter + junit-jupiter-engine + ${junit.jupiter.version} + test + + + org.junit.jupiter + junit-jupiter-api + ${junit.jupiter.version} + test + + + org.junit.platform + junit-platform-runner + ${junit.platform.version} + test + + + org.junit.platform + junit-platform-launcher + ${junit.platform.version} + test + + + org.assertj + assertj-core + ${assertj-core.version} test @@ -221,6 +249,32 @@ + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + **/Test*.java + **/*Test.java + **/*Tests.java + **/*TestCase.java + + false + + + + org.junit.platform + junit-platform-surefire-provider + ${junit.platform.version} + + + org.junit.jupiter + junit-jupiter-engine + ${junit.jupiter.version} + + + com.coveo fmt-maven-plugin diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/ApiResponseDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/ApiResponseDiff.java index 7bfe55d51..03b0216ae 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/ApiResponseDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/ApiResponseDiff.java @@ -23,9 +23,6 @@ public ApiResponseDiff(OpenApiDiff openApiDiff) { public Optional diff( ApiResponses left, ApiResponses right, DiffContext context) { MapKeyDiff responseMapKeyDiff = MapKeyDiff.diff(left, right); - ChangedApiResponse changedApiResponse = new ChangedApiResponse(left, right, context); - changedApiResponse.setAddResponses(responseMapKeyDiff.getIncreased()); - changedApiResponse.setMissingResponses(responseMapKeyDiff.getMissing()); List sharedResponseCodes = responseMapKeyDiff.getSharedKey(); Map resps = new LinkedHashMap<>(); for (String responseCode : sharedResponseCodes) { @@ -34,11 +31,15 @@ public Optional diff( .diff(left.get(responseCode), right.get(responseCode), context) .ifPresent(changedResponse -> resps.put(responseCode, changedResponse)); } - changedApiResponse.setChangedResponses(resps); + ChangedApiResponse changedApiResponse = + new ChangedApiResponse(left, right, context) + .setIncreased(responseMapKeyDiff.getIncreased()) + .setMissing(responseMapKeyDiff.getMissing()) + .setChanged(resps); openApiDiff .getExtensionsDiff() .diff(left.getExtensions(), right.getExtensions(), context) - .ifPresent(changedApiResponse::setChangedExtensions); + .ifPresent(changedApiResponse::setExtensions); return isChanged(changedApiResponse); } } diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/ContentDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/ContentDiff.java index f45eefbe2..67eeda204 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/ContentDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/ContentDiff.java @@ -24,11 +24,8 @@ public boolean compare(Content left, Content right) { } public Optional diff(Content left, Content right, DiffContext context) { - ChangedContent changedContent = new ChangedContent(left, right, context); MapKeyDiff mediaTypeDiff = MapKeyDiff.diff(left, right); - changedContent.setIncreased(mediaTypeDiff.getIncreased()); - changedContent.setMissing(mediaTypeDiff.getMissing()); List sharedMediaTypes = mediaTypeDiff.getSharedKey(); Map changedMediaTypes = new LinkedHashMap<>(); for (String mediaTypeKey : sharedMediaTypes) { @@ -43,12 +40,15 @@ public Optional diff(Content left, Content right, DiffContext co oldMediaType.getSchema(), newMediaType.getSchema(), context.copyWithRequired(true)) - .ifPresent(changedMediaType::setChangedSchema); + .ifPresent(changedMediaType::setSchema); if (!isUnchanged(changedMediaType)) { changedMediaTypes.put(mediaTypeKey, changedMediaType); } } - changedContent.setChanged(changedMediaTypes); - return isChanged(changedContent); + return isChanged( + new ChangedContent(left, right, context) + .setIncreased(mediaTypeDiff.getIncreased()) + .setMissing(mediaTypeDiff.getMissing()) + .setChanged(changedMediaTypes)); } } diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/HeaderDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/HeaderDiff.java index 2804695ef..fc37f8f38 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/HeaderDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/HeaderDiff.java @@ -14,10 +14,10 @@ /** Created by adarsh.sharma on 28/12/17. */ public class HeaderDiff extends ReferenceDiffCache { + private static RefPointer
refPointer = new RefPointer<>(RefType.HEADERS); private OpenApiDiff openApiDiff; private Components leftComponents; private Components rightComponents; - private static RefPointer
refPointer = new RefPointer<>(RefType.HEADERS); public HeaderDiff(OpenApiDiff openApiDiff) { this.openApiDiff = openApiDiff; @@ -41,27 +41,30 @@ protected Optional computeDiff( left = refPointer.resolveRef(leftComponents, left, left.get$ref()); right = refPointer.resolveRef(rightComponents, right, right.get$ref()); - ChangedHeader changedHeader = new ChangedHeader(left, right, context); - - changedHeader.setChangeDescription( - !Objects.equals(left.getDescription(), right.getDescription())); - changedHeader.setChangeRequired(getBooleanDiff(left.getRequired(), right.getRequired())); - changedHeader.setChangeDeprecated( - !Boolean.TRUE.equals(left.getDeprecated()) && Boolean.TRUE.equals(right.getDeprecated())); - changedHeader.setChangeStyle(!Objects.equals(left.getStyle(), right.getStyle())); - changedHeader.setChangeExplode(getBooleanDiff(left.getExplode(), right.getExplode())); + ChangedHeader changedHeader = + new ChangedHeader(left, right, context) + .setRequired(getBooleanDiff(left.getRequired(), right.getRequired())) + .setDeprecated( + !Boolean.TRUE.equals(left.getDeprecated()) + && Boolean.TRUE.equals(right.getDeprecated())) + .setStyle(!Objects.equals(left.getStyle(), right.getStyle())) + .setExplode(getBooleanDiff(left.getExplode(), right.getExplode())); + openApiDiff + .getMetadataDiff() + .diff(left.getDescription(), right.getDescription(), context) + .ifPresent(changedHeader::setDescription); openApiDiff .getSchemaDiff() .diff(new HashSet<>(), left.getSchema(), right.getSchema(), context.copyWithRequired(true)) - .ifPresent(changedHeader::setChangedSchema); + .ifPresent(changedHeader::setSchema); openApiDiff .getContentDiff() .diff(left.getContent(), right.getContent(), context) - .ifPresent(changedHeader::setChangedContent); + .ifPresent(changedHeader::setContent); openApiDiff .getExtensionsDiff() .diff(left.getExtensions(), right.getExtensions(), context) - .ifPresent(changedHeader::setChangedExtensions); + .ifPresent(changedHeader::setExtensions); return isChanged(changedHeader); } diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/HeadersDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/HeadersDiff.java index 587bff116..6bc6ede80 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/HeadersDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/HeadersDiff.java @@ -21,10 +21,7 @@ public HeadersDiff(OpenApiDiff openApiDiff) { public Optional diff( Map left, Map right, DiffContext context) { - ChangedHeaders changedHeaders = new ChangedHeaders(left, right, context); MapKeyDiff headerMapDiff = MapKeyDiff.diff(left, right); - changedHeaders.setIncreased(headerMapDiff.getIncreased()); - changedHeaders.setMissing(headerMapDiff.getMissing()); List sharedHeaderKeys = headerMapDiff.getSharedKey(); Map changed = new LinkedHashMap<>(); @@ -36,8 +33,10 @@ public Optional diff( .diff(oldHeader, newHeader, context) .ifPresent(changedHeader -> changed.put(headerKey, changedHeader)); } - changedHeaders.setChanged(changed); - - return isChanged(changedHeaders); + return isChanged( + new ChangedHeaders(left, right, context) + .setIncreased(headerMapDiff.getIncreased()) + .setMissing(headerMapDiff.getMissing()) + .setChanged(changed)); } } diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/MetadataDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/MetadataDiff.java new file mode 100644 index 000000000..d8d418135 --- /dev/null +++ b/src/main/java/com/qdesrame/openapi/diff/compare/MetadataDiff.java @@ -0,0 +1,31 @@ +package com.qdesrame.openapi.diff.compare; + +import static com.qdesrame.openapi.diff.utils.ChangedUtils.isChanged; + +import com.qdesrame.openapi.diff.model.ChangedMetadata; +import com.qdesrame.openapi.diff.model.DiffContext; +import io.swagger.v3.oas.models.Components; +import java.util.Optional; + +public class MetadataDiff { + + private Components leftComponents; + private Components rightComponents; + private OpenApiDiff openApiDiff; + + public MetadataDiff(OpenApiDiff openApiDiff) { + this.openApiDiff = openApiDiff; + this.leftComponents = + openApiDiff.getOldSpecOpenApi() != null + ? openApiDiff.getOldSpecOpenApi().getComponents() + : null; + this.rightComponents = + openApiDiff.getNewSpecOpenApi() != null + ? openApiDiff.getNewSpecOpenApi().getComponents() + : null; + } + + public Optional diff(String left, String right, DiffContext context) { + return isChanged(new ChangedMetadata().setLeft(left).setRight(right)); + } +} diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/OAuthFlowDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/OAuthFlowDiff.java index da60d2971..d3d5b8f71 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/OAuthFlowDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/OAuthFlowDiff.java @@ -24,16 +24,16 @@ private static Map getExtensions(OAuthFlow oAuthFlow) { public Optional diff(OAuthFlow left, OAuthFlow right) { ChangedOAuthFlow changedOAuthFlow = new ChangedOAuthFlow(left, right); if (left != null && right != null) { - changedOAuthFlow.setChangedAuthorizationUrl( - !Objects.equals(left.getAuthorizationUrl(), right.getAuthorizationUrl())); - changedOAuthFlow.setChangedTokenUrl(!Objects.equals(left.getTokenUrl(), right.getTokenUrl())); - changedOAuthFlow.setChangedRefreshUrl( - !Objects.equals(left.getRefreshUrl(), right.getRefreshUrl())); + changedOAuthFlow + .setAuthorizationUrl( + !Objects.equals(left.getAuthorizationUrl(), right.getAuthorizationUrl())) + .setTokenUrl(!Objects.equals(left.getTokenUrl(), right.getTokenUrl())) + .setRefreshUrl(!Objects.equals(left.getRefreshUrl(), right.getRefreshUrl())); } openApiDiff .getExtensionsDiff() .diff(getExtensions(left), getExtensions(right)) - .ifPresent(changedOAuthFlow::setChangedExtensions); + .ifPresent(changedOAuthFlow::setExtensions); return isChanged(changedOAuthFlow); } } diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/OAuthFlowsDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/OAuthFlowsDiff.java index df7caaee4..ae2f84fc7 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/OAuthFlowsDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/OAuthFlowsDiff.java @@ -26,24 +26,24 @@ public Optional diff(OAuthFlows left, OAuthFlows right) { openApiDiff .getOAuthFlowDiff() .diff(left.getImplicit(), right.getImplicit()) - .ifPresent(changedOAuthFlows::setChangedImplicitOAuthFlow); + .ifPresent(changedOAuthFlows::setImplicitOAuthFlow); openApiDiff .getOAuthFlowDiff() .diff(left.getPassword(), right.getPassword()) - .ifPresent(changedOAuthFlows::setChangedPasswordOAuthFlow); + .ifPresent(changedOAuthFlows::setPasswordOAuthFlow); openApiDiff .getOAuthFlowDiff() .diff(left.getClientCredentials(), right.getClientCredentials()) - .ifPresent(changedOAuthFlows::setChangedClientCredentialOAuthFlow); + .ifPresent(changedOAuthFlows::setClientCredentialOAuthFlow); openApiDiff .getOAuthFlowDiff() .diff(left.getAuthorizationCode(), right.getAuthorizationCode()) - .ifPresent(changedOAuthFlows::setChangedAuthorizationCodeOAuthFlow); + .ifPresent(changedOAuthFlows::setAuthorizationCodeOAuthFlow); } openApiDiff .getExtensionsDiff() .diff(getExtensions(left), getExtensions(right)) - .ifPresent(changedOAuthFlows::setChangedExtensions); + .ifPresent(changedOAuthFlows::setExtensions); return isChanged(changedOAuthFlows); } } diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/OpenApiDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/OpenApiDiff.java index 945391fc8..cec341993 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/OpenApiDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/OpenApiDiff.java @@ -24,7 +24,6 @@ public class OpenApiDiff { private static Logger logger = LoggerFactory.getLogger(OpenApiDiff.class); - private ChangedOpenApi changedOpenApi; private PathsDiff pathsDiff; private PathDiff pathDiff; private SchemaDiff schemaDiff; @@ -43,6 +42,7 @@ public class OpenApiDiff { private OAuthFlowsDiff oAuthFlowsDiff; private OAuthFlowDiff oAuthFlowDiff; private ExtensionsDiff extensionsDiff; + private MetadataDiff metadataDiff; private OpenAPI oldSpecOpenApi; private OpenAPI newSpecOpenApi; @@ -56,7 +56,6 @@ public class OpenApiDiff { * @param newSpecOpenApi */ private OpenApiDiff(OpenAPI oldSpecOpenApi, OpenAPI newSpecOpenApi) { - this.changedOpenApi = new ChangedOpenApi(); this.oldSpecOpenApi = oldSpecOpenApi; this.newSpecOpenApi = newSpecOpenApi; if (null == oldSpecOpenApi || null == newSpecOpenApi) { @@ -88,6 +87,7 @@ private void initializeFields() { this.oAuthFlowsDiff = new OAuthFlowsDiff(this); this.oAuthFlowDiff = new OAuthFlowDiff(this); this.extensionsDiff = new ExtensionsDiff(this); + this.metadataDiff = new MetadataDiff(this); } private ChangedOpenApi compare() { @@ -167,12 +167,12 @@ private void preProcess(OpenAPI openApi) { } private ChangedOpenApi getChangedOpenApi() { - changedOpenApi.setMissingEndpoints(missingEndpoints); - changedOpenApi.setNewEndpoints(newEndpoints); - changedOpenApi.setNewSpecOpenApi(newSpecOpenApi); - changedOpenApi.setOldSpecOpenApi(oldSpecOpenApi); - changedOpenApi.setChangedOperations(changedOperations); - changedOpenApi.setChangedExtensions(changedExtensions); - return changedOpenApi; + return new ChangedOpenApi() + .setMissingEndpoints(missingEndpoints) + .setNewEndpoints(newEndpoints) + .setNewSpecOpenApi(newSpecOpenApi) + .setOldSpecOpenApi(oldSpecOpenApi) + .setChangedOperations(changedOperations) + .setChangedExtensions(changedExtensions); } } diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/OperationDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/OperationDiff.java index a7ac3f199..4c3de2cf8 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/OperationDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/OperationDiff.java @@ -24,7 +24,14 @@ public Optional diff( ChangedOperation changedOperation = new ChangedOperation(context.getUrl(), context.getMethod(), oldOperation, newOperation); - changedOperation.setSummary(newOperation.getSummary()); + openApiDiff + .getMetadataDiff() + .diff(oldOperation.getSummary(), newOperation.getSummary(), context) + .ifPresent(changedOperation::setSummary); + openApiDiff + .getMetadataDiff() + .diff(oldOperation.getDescription(), newOperation.getDescription(), context) + .ifPresent(changedOperation::setDescription); changedOperation.setDeprecated( !Boolean.TRUE.equals(oldOperation.getDeprecated()) && Boolean.TRUE.equals(newOperation.getDeprecated())); @@ -34,7 +41,7 @@ public Optional diff( .getRequestBodyDiff() .diff( oldOperation.getRequestBody(), newOperation.getRequestBody(), context.copyAsRequest()) - .ifPresent(changedOperation::setChangedRequestBody); + .ifPresent(changedOperation::setRequestBody); } openApiDiff @@ -43,27 +50,27 @@ public Optional diff( .ifPresent( params -> { removePathParameters(context.getParameters(), params); - changedOperation.setChangedParameters(params); + changedOperation.setParameters(params); }); if (oldOperation.getResponses() != null || newOperation.getResponses() != null) { openApiDiff .getApiResponseDiff() .diff(oldOperation.getResponses(), newOperation.getResponses(), context.copyAsResponse()) - .ifPresent(changedOperation::setChangedApiResponse); + .ifPresent(changedOperation::setApiResponses); } if (oldOperation.getSecurity() != null || newOperation.getSecurity() != null) { openApiDiff .getSecurityRequirementsDiff() .diff(oldOperation.getSecurity(), newOperation.getSecurity(), context) - .ifPresent(changedOperation::setChangedSecurityRequirements); + .ifPresent(changedOperation::setSecurityRequirements); } openApiDiff .getExtensionsDiff() .diff(oldOperation.getExtensions(), newOperation.getExtensions(), context) - .ifPresent(changedOperation::setChangedExtensions); + .ifPresent(extensions -> changedOperation.setExtensions(extensions)); return isChanged(changedOperation); } diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/ParameterDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/ParameterDiff.java index 8e3845b60..7a9d9b970 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/ParameterDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/ParameterDiff.java @@ -3,7 +3,6 @@ import static com.qdesrame.openapi.diff.utils.ChangedUtils.isChanged; import com.qdesrame.openapi.diff.model.ChangedParameter; -import com.qdesrame.openapi.diff.model.ChangedSchema; import com.qdesrame.openapi.diff.model.DiffContext; import com.qdesrame.openapi.diff.utils.RefPointer; import com.qdesrame.openapi.diff.utils.RefType; @@ -15,10 +14,10 @@ public class ParameterDiff extends ReferenceDiffCache { + private static RefPointer refPointer = new RefPointer<>(RefType.PARAMETERS); private Components leftComponents; private Components rightComponents; private OpenApiDiff openApiDiff; - private static RefPointer refPointer = new RefPointer<>(RefType.PARAMETERS); public ParameterDiff(OpenApiDiff openApiDiff) { this.openApiDiff = openApiDiff; @@ -39,38 +38,37 @@ public Optional diff(Parameter left, Parameter right, DiffCont @Override protected Optional computeDiff( HashSet refSet, Parameter left, Parameter right, DiffContext context) { - ChangedParameter changedParameter = - new ChangedParameter(right.getName(), right.getIn(), context); left = refPointer.resolveRef(this.leftComponents, left, left.get$ref()); right = refPointer.resolveRef(this.rightComponents, right, right.get$ref()); - changedParameter.setOldParameter(left); - changedParameter.setNewParameter(right); - - changedParameter.setChangeDescription( - !Objects.equals(left.getDescription(), right.getDescription())); - changedParameter.setChangeRequired(getBooleanDiff(left.getRequired(), right.getRequired())); - changedParameter.setDeprecated( - !Boolean.TRUE.equals(left.getDeprecated()) && Boolean.TRUE.equals(right.getDeprecated())); - changedParameter.setChangeAllowEmptyValue( - getBooleanDiff(left.getAllowEmptyValue(), right.getAllowEmptyValue())); - changedParameter.setChangeStyle(!Objects.equals(left.getStyle(), right.getStyle())); - changedParameter.setChangeExplode(getBooleanDiff(left.getExplode(), right.getExplode())); - Optional changedSchema = - openApiDiff - .getSchemaDiff() - .diff(refSet, left.getSchema(), right.getSchema(), context.copyWithRequired(true)); - if (changedSchema.isPresent()) { - changedParameter.setChangedSchema(changedSchema.get()); - } + ChangedParameter changedParameter = + new ChangedParameter(right.getName(), right.getIn(), context) + .setOldParameter(left) + .setNewParameter(right) + .setChangeRequired(getBooleanDiff(left.getRequired(), right.getRequired())) + .setDeprecated( + !Boolean.TRUE.equals(left.getDeprecated()) + && Boolean.TRUE.equals(right.getDeprecated())) + .setChangeAllowEmptyValue( + getBooleanDiff(left.getAllowEmptyValue(), right.getAllowEmptyValue())) + .setChangeStyle(!Objects.equals(left.getStyle(), right.getStyle())) + .setChangeExplode(getBooleanDiff(left.getExplode(), right.getExplode())); + openApiDiff + .getSchemaDiff() + .diff(refSet, left.getSchema(), right.getSchema(), context.copyWithRequired(true)) + .ifPresent(changedParameter::setSchema); + openApiDiff + .getMetadataDiff() + .diff(left.getDescription(), right.getDescription(), context) + .ifPresent(changedParameter::setDescription); openApiDiff .getContentDiff() .diff(left.getContent(), right.getContent(), context) - .ifPresent(changedParameter::setChangedContent); + .ifPresent(changedParameter::setContent); openApiDiff .getExtensionsDiff() .diff(left.getExtensions(), right.getExtensions(), context) - .ifPresent(changedParameter::setChangedExtensions); + .ifPresent(changedParameter::setExtensions); return isChanged(changedParameter); } diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/PathDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/PathDiff.java index 31b5c08fe..ef0e0e60a 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/PathDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/PathDiff.java @@ -18,15 +18,15 @@ public PathDiff(OpenApiDiff openApiDiff) { } public Optional diff(PathItem left, PathItem right, DiffContext context) { - ChangedPath changedPath = new ChangedPath(context.getUrl(), left, right, context); - Map oldOperationMap = left.readOperationsMap(); Map newOperationMap = right.readOperationsMap(); MapKeyDiff operationsDiff = MapKeyDiff.diff(oldOperationMap, newOperationMap); - changedPath.setIncreased(operationsDiff.getIncreased()); - changedPath.setMissing(operationsDiff.getMissing()); List sharedMethods = operationsDiff.getSharedKey(); + ChangedPath changedPath = + new ChangedPath(context.getUrl(), left, right, context) + .setIncreased(operationsDiff.getIncreased()) + .setMissing(operationsDiff.getMissing()); for (PathItem.HttpMethod method : sharedMethods) { Operation oldOperation = oldOperationMap.get(method); Operation newOperation = newOperationMap.get(method); @@ -38,7 +38,7 @@ public Optional diff(PathItem left, PathItem right, DiffContext con openApiDiff .getExtensionsDiff() .diff(left.getExtensions(), right.getExtensions(), context) - .ifPresent(changedPath::setChangedExtensions); + .ifPresent(changedPath::setExtensions); return isChanged(changedPath); } } diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/RequestBodyDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/RequestBodyDiff.java index 8338885bb..731873947 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/RequestBodyDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/RequestBodyDiff.java @@ -11,18 +11,21 @@ import io.swagger.v3.oas.models.parameters.RequestBody; import java.util.HashSet; import java.util.Map; -import java.util.Objects; import java.util.Optional; /** Created by adarsh.sharma on 28/12/17. */ public class RequestBodyDiff extends ReferenceDiffCache { - private OpenApiDiff openApiDiff; private static RefPointer refPointer = new RefPointer<>(RefType.REQUEST_BODIES); + private OpenApiDiff openApiDiff; public RequestBodyDiff(OpenApiDiff openApiDiff) { this.openApiDiff = openApiDiff; } + private static Map getExtensions(RequestBody body) { + return ofNullable(body).map(RequestBody::getExtensions).orElse(null); + } + public Optional diff( RequestBody left, RequestBody right, DiffContext context) { String leftRef = left != null ? left.get$ref() : null, @@ -30,10 +33,6 @@ public Optional diff( return cachedDiff(new HashSet<>(), left, right, leftRef, rightRef, context); } - private static Map getExtensions(RequestBody body) { - return ofNullable(body).map(RequestBody::getExtensions).orElse(null); - } - @Override protected Optional computeDiff( HashSet refSet, RequestBody left, RequestBody right, DiffContext context) { @@ -57,27 +56,29 @@ protected Optional computeDiff( newRequestContent = newRequestBody.getContent(); } } - ChangedRequestBody changedRequestBody = - new ChangedRequestBody(oldRequestBody, newRequestBody, context); - boolean leftRequired = oldRequestBody != null && Boolean.TRUE.equals(oldRequestBody.getRequired()); boolean rightRequired = newRequestBody != null && Boolean.TRUE.equals(newRequestBody.getRequired()); - changedRequestBody.setChangeRequired(leftRequired != rightRequired); - - String leftDescription = oldRequestBody != null ? oldRequestBody.getDescription() : null; - String rightDescription = newRequestBody != null ? newRequestBody.getDescription() : null; - changedRequestBody.setChangeDescription(!Objects.equals(leftDescription, rightDescription)); + ChangedRequestBody changedRequestBody = + new ChangedRequestBody(oldRequestBody, newRequestBody, context) + .setChangeRequired(leftRequired != rightRequired); + openApiDiff + .getMetadataDiff() + .diff( + oldRequestBody != null ? oldRequestBody.getDescription() : null, + newRequestBody != null ? newRequestBody.getDescription() : null, + context) + .ifPresent(changedRequestBody::setDescription); openApiDiff .getContentDiff() .diff(oldRequestContent, newRequestContent, context) - .ifPresent(changedRequestBody::setChangedContent); + .ifPresent(changedRequestBody::setContent); openApiDiff .getExtensionsDiff() .diff(getExtensions(left), getExtensions(right), context) - .ifPresent(changedRequestBody::setChangedExtensions); + .ifPresent(changedRequestBody::setExtensions); return isChanged(changedRequestBody); } diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/ResponseDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/ResponseDiff.java index 1d009e1b2..a6ded3578 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/ResponseDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/ResponseDiff.java @@ -9,15 +9,14 @@ import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.responses.ApiResponse; import java.util.HashSet; -import java.util.Objects; import java.util.Optional; /** Created by adarsh.sharma on 28/12/17. */ public class ResponseDiff extends ReferenceDiffCache { + private static RefPointer refPointer = new RefPointer<>(RefType.RESPONSES); private OpenApiDiff openApiDiff; private Components leftComponents; private Components rightComponents; - private static RefPointer refPointer = new RefPointer<>(RefType.RESPONSES); public ResponseDiff(OpenApiDiff openApiDiff) { this.openApiDiff = openApiDiff; @@ -42,21 +41,22 @@ protected Optional computeDiff( right = refPointer.resolveRef(rightComponents, right, right.get$ref()); ChangedResponse changedResponse = new ChangedResponse(left, right, context); - + openApiDiff + .getMetadataDiff() + .diff(left.getDescription(), right.getDescription(), context) + .ifPresent(changedResponse::setDescription); openApiDiff .getContentDiff() .diff(left.getContent(), right.getContent(), context) - .ifPresent(changedResponse::setChangedContent); + .ifPresent(changedResponse::setContent); openApiDiff .getHeadersDiff() .diff(left.getHeaders(), right.getHeaders(), context) - .ifPresent(changedResponse::setChangedHeaders); - changedResponse.setChangeDescription( - !Objects.equals(left.getDescription(), right.getDescription())); + .ifPresent(changedResponse::setHeaders); openApiDiff .getExtensionsDiff() .diff(left.getExtensions(), right.getExtensions(), context) - .ifPresent(changedResponse::setChangedExtensions); + .ifPresent(changedResponse::setExtensions); return isChanged(changedResponse); } } diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/SchemaDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/SchemaDiff.java index f1c983ca9..e50754dd7 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/SchemaDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/SchemaDiff.java @@ -118,12 +118,13 @@ public Optional diff( public Optional getTypeChangedSchema( Schema left, Schema right, DiffContext context) { - ChangedSchema changedSchema = SchemaDiff.getSchemaDiffResult(openApiDiff).getChangedSchema(); - changedSchema.setOldSchema(left); - changedSchema.setNewSchema(right); - changedSchema.setChangedType(true); - changedSchema.setContext(context); - return Optional.of(changedSchema); + return Optional.of( + SchemaDiff.getSchemaDiffResult(openApiDiff) + .getChangedSchema() + .setOldSchema(left) + .setNewSchema(right) + .setChangedType(true) + .setContext(context)); } @Override diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/SecurityRequirementDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/SecurityRequirementDiff.java index f4c466896..6b9e3a806 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/SecurityRequirementDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/SecurityRequirementDiff.java @@ -28,6 +28,15 @@ public SecurityRequirementDiff(OpenApiDiff openApiDiff) { : null; } + public static SecurityRequirement getCopy(LinkedHashMap> right) { + SecurityRequirement newSecurityRequirement = new SecurityRequirement(); + right + .entrySet() + .stream() + .forEach(e -> newSecurityRequirement.put(e.getKey(), new ArrayList<>(e.getValue()))); + return newSecurityRequirement; + } + private LinkedHashMap> contains( SecurityRequirement right, String schemeRef) { SecurityScheme leftSecurityScheme = leftComponents.getSecuritySchemes().get(schemeRef); @@ -83,20 +92,8 @@ public Optional diff( diff.ifPresent(changedSecurityRequirement::addChanged); } } - right - .entrySet() - .stream() - .forEach(x -> changedSecurityRequirement.addIncreased(x.getKey(), x.getValue())); + right.forEach(changedSecurityRequirement::addIncreased); return isChanged(changedSecurityRequirement); } - - public static SecurityRequirement getCopy(LinkedHashMap> right) { - SecurityRequirement newSecurityRequirement = new SecurityRequirement(); - right - .entrySet() - .stream() - .forEach(e -> newSecurityRequirement.put(e.getKey(), new ArrayList<>(e.getValue()))); - return newSecurityRequirement; - } } diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/SecurityRequirementsDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/SecurityRequirementsDiff.java index b094195f5..0472cea92 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/SecurityRequirementsDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/SecurityRequirementsDiff.java @@ -111,45 +111,4 @@ protected Optional diff( private List getCopy(List right) { return right.stream().map(SecurityRequirementDiff::getCopy).collect(Collectors.toList()); } - - // public static void main(String[] args) { - // List types1 = new - // ArrayList<>(Arrays.asList(SecurityScheme.Type.APIKEY, SecurityScheme.Type.APIKEY)); - // List types2 = new - // ArrayList<>(Arrays.asList(SecurityScheme.Type.APIKEY, SecurityScheme.Type.APIKEY)); - // List types3 = new - // ArrayList<>(Arrays.asList(SecurityScheme.Type.OAUTH2)); - // List types4 = new - // ArrayList<>(Arrays.asList(SecurityScheme.Type.OAUTH2, SecurityScheme.Type.APIKEY)); - // List types5 = new - // ArrayList<>(Arrays.asList(SecurityScheme.Type.APIKEY, SecurityScheme.Type.OAUTH2)); - // - // List> one = new ArrayList<>(); - // one.add(new ImmutablePair<>(SecurityScheme.Type.OAUTH2, null)); - // one.add(new ImmutablePair<>(SecurityScheme.Type.APIKEY, SecurityScheme.In.HEADER)); - // - // List> two = new ArrayList<>(); - // two.add(new ImmutablePair<>(SecurityScheme.Type.APIKEY, SecurityScheme.In.HEADER)); - // two.add(new ImmutablePair<>(SecurityScheme.Type.OAUTH2, null)); - // - // System.out.println(CollectionUtils.isEqualCollection(types1, types2)); - // System.out.println(CollectionUtils.isEqualCollection(types1, types3)); - // System.out.println(CollectionUtils.isEqualCollection(types4, types5)); - // System.out.println(CollectionUtils.isEqualCollection(one, two)); - // } - - // private List> getSecurityInfo(Components components, - // List securityRequirements) { - // List> securityInfoList = new ArrayList<>(); - // - // for (LinkedHashMap> securityRequirement : securityRequirements) { - // securityInfoList.add(securityRequirement.entrySet().stream() - // .map(e -> new SecurityDiffInfo(e.getKey(), refPointer.resolveRef(components, - // new SecurityScheme(), e.getKey()), e.getValue())) - // .collect(Collectors.toList())); - // } - // - // return securityInfoList; - // } - } diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/SecuritySchemeDiff.java b/src/main/java/com/qdesrame/openapi/diff/compare/SecuritySchemeDiff.java index b55118065..d5aeb3128 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/SecuritySchemeDiff.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/SecuritySchemeDiff.java @@ -71,8 +71,10 @@ protected Optional computeDiff( ChangedSecurityScheme changedSecurityScheme = new ChangedSecurityScheme(leftSecurityScheme, rightSecurityScheme); - changedSecurityScheme.setChangedDescription( - !Objects.equals(leftSecurityScheme.getDescription(), rightSecurityScheme.getDescription())); + openApiDiff + .getMetadataDiff() + .diff(leftSecurityScheme.getDescription(), rightSecurityScheme.getDescription(), context) + .ifPresent(changedSecurityScheme::setDescription); switch (leftSecurityScheme.getType()) { case APIKEY: @@ -84,7 +86,7 @@ protected Optional computeDiff( openApiDiff .getOAuthFlowsDiff() .diff(leftSecurityScheme.getFlows(), rightSecurityScheme.getFlows()) - .ifPresent(changedSecurityScheme::setChangedOAuthFlows); + .ifPresent(changedSecurityScheme::setOAuthFlows); break; case HTTP: @@ -105,21 +107,20 @@ protected Optional computeDiff( openApiDiff .getExtensionsDiff() .diff(leftSecurityScheme.getExtensions(), rightSecurityScheme.getExtensions(), context) - .ifPresent(changedSecurityScheme::setChangedExtensions); + .ifPresent(changedSecurityScheme::setExtensions); return Optional.of(changedSecurityScheme); } private ChangedSecurityScheme getCopyWithoutScopes(ChangedSecurityScheme original) { - ChangedSecurityScheme changedSecurityScheme = - new ChangedSecurityScheme(original.getOldSecurityScheme(), original.getNewSecurityScheme()); - changedSecurityScheme.setChangedType(original.isChangedType()); - changedSecurityScheme.setChangedDescription(original.isChangedDescription()); - changedSecurityScheme.setChangedIn(original.isChangedIn()); - changedSecurityScheme.setChangedScheme(original.isChangedScheme()); - changedSecurityScheme.setChangedBearerFormat(original.isChangedBearerFormat()); - changedSecurityScheme.setChangedOAuthFlows(original.getChangedOAuthFlows()); - changedSecurityScheme.setChangedOpenIdConnectUrl(original.isChangedOpenIdConnectUrl()); - return changedSecurityScheme; + return new ChangedSecurityScheme( + original.getOldSecurityScheme(), original.getNewSecurityScheme()) + .setChangedType(original.isChangedType()) + .setChangedIn(original.isChangedIn()) + .setChangedScheme(original.isChangedScheme()) + .setChangedBearerFormat(original.isChangedBearerFormat()) + .setDescription(original.getDescription()) + .setOAuthFlows(original.getOAuthFlows()) + .setChangedOpenIdConnectUrl(original.isChangedOpenIdConnectUrl()); } } diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/schemadiffresult/ArraySchemaDiffResult.java b/src/main/java/com/qdesrame/openapi/diff/compare/schemadiffresult/ArraySchemaDiffResult.java index 73d880d81..63cbfb54a 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/schemadiffresult/ArraySchemaDiffResult.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/schemadiffresult/ArraySchemaDiffResult.java @@ -16,12 +16,12 @@ public ArraySchemaDiffResult(OpenApiDiff openApiDiff) { } @Override - public Optional diff( + public , X> Optional diff( HashSet refSet, Components leftComponents, Components rightComponents, - Schema left, - Schema right, + T left, + T right, DiffContext context) { ArraySchema leftArraySchema = (ArraySchema) left; ArraySchema rightArraySchema = (ArraySchema) right; @@ -33,7 +33,7 @@ public Optional diff( leftArraySchema.getItems(), rightArraySchema.getItems(), context.copyWithRequired(true)) - .ifPresent(changedSchema::setChangedItems); + .ifPresent(changedSchema::setItems); return isApplicable(context); } } diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/schemadiffresult/ComposedSchemaDiffResult.java b/src/main/java/com/qdesrame/openapi/diff/compare/schemadiffresult/ComposedSchemaDiffResult.java index e879b4681..5121072ca 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/schemadiffresult/ComposedSchemaDiffResult.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/schemadiffresult/ComposedSchemaDiffResult.java @@ -27,12 +27,12 @@ public ComposedSchemaDiffResult(OpenApiDiff openApiDiff) { } @Override - public Optional diff( + public , X> Optional diff( HashSet refSet, Components leftComponents, Components rightComponents, - Schema left, - Schema right, + T left, + T right, DiffContext context) { if (left instanceof ComposedSchema) { ComposedSchema leftComposedSchema = (ComposedSchema) left; @@ -61,17 +61,10 @@ public Optional diff( Map leftMapping = getMapping(leftComposedSchema); Map rightMapping = getMapping(rightComposedSchema); - ChangedOneOfSchema changedOneOfSchema = - new ChangedOneOfSchema(leftMapping, rightMapping, context); MapKeyDiff mappingDiff = MapKeyDiff.diff( getSchema(leftComponents, leftMapping), getSchema(rightComponents, rightMapping)); - changedOneOfSchema.setIncreasedMapping(mappingDiff.getIncreased()); - changedOneOfSchema.setMissingMapping(mappingDiff.getMissing()); - Map changedMapping = new LinkedHashMap<>(); - changedOneOfSchema.setChangedMapping(changedMapping); - for (String key : mappingDiff.getSharedKey()) { Schema leftSchema = new Schema(); leftSchema.set$ref(leftMapping.get(key)); @@ -83,7 +76,11 @@ public Optional diff( .diff(refSet, leftSchema, rightSchema, context.copyWithRequired(true)); changedSchema.ifPresent(schema -> changedMapping.put(key, schema)); } - changedSchema.setChangedOneOfSchema(changedOneOfSchema); + changedSchema.setOneOfSchema( + new ChangedOneOfSchema(leftMapping, rightMapping, context) + .setIncreased(mappingDiff.getIncreased()) + .setMissing(mappingDiff.getMissing()) + .setChanged(changedMapping)); } return super.diff(refSet, leftComponents, rightComponents, left, right, context); } else { diff --git a/src/main/java/com/qdesrame/openapi/diff/compare/schemadiffresult/SchemaDiffResult.java b/src/main/java/com/qdesrame/openapi/diff/compare/schemadiffresult/SchemaDiffResult.java index 2eb56fafd..1dcf8ffba 100644 --- a/src/main/java/com/qdesrame/openapi/diff/compare/schemadiffresult/SchemaDiffResult.java +++ b/src/main/java/com/qdesrame/openapi/diff/compare/schemadiffresult/SchemaDiffResult.java @@ -9,7 +9,6 @@ import com.qdesrame.openapi.diff.model.ChangedSchema; import com.qdesrame.openapi.diff.model.DiffContext; import com.qdesrame.openapi.diff.model.ListDiff; -import com.qdesrame.openapi.diff.model.schema.ChangedExtensions; import com.qdesrame.openapi.diff.model.schema.ChangedReadOnly; import com.qdesrame.openapi.diff.model.schema.ChangedWriteOnly; import io.swagger.v3.oas.models.Components; @@ -32,12 +31,12 @@ public SchemaDiffResult(String type, OpenApiDiff openApiDiff) { this.changedSchema.setType(type); } - public Optional diff( + public , X> Optional diff( HashSet refSet, Components leftComponents, Components rightComponents, - Schema left, - Schema right, + T left, + T right, DiffContext context) { changedSchema .setContext(context) @@ -46,35 +45,38 @@ public Optional diff( .setChangeDeprecated( !Boolean.TRUE.equals(left.getDeprecated()) && Boolean.TRUE.equals(right.getDeprecated())) - .setChangeDescription(!Objects.equals(left.getDescription(), right.getDescription())) .setChangeTitle(!Objects.equals(left.getTitle(), right.getTitle())) .setChangeRequired(ListDiff.diff(left.getRequired(), right.getRequired())) .setChangeDefault(!Objects.equals(left.getDefault(), right.getDefault())) .setChangeEnum(ListDiff.diff(left.getEnum(), right.getEnum())) .setChangeFormat(!Objects.equals(left.getFormat(), right.getFormat())) - .setChangedReadOnly(new ChangedReadOnly(context, left.getReadOnly(), right.getReadOnly())) - .setChangedWriteOnly( - new ChangedWriteOnly(context, left.getWriteOnly(), right.getWriteOnly())) + .setReadOnly(new ChangedReadOnly(context, left.getReadOnly(), right.getReadOnly())) + .setWriteOnly(new ChangedWriteOnly(context, left.getWriteOnly(), right.getWriteOnly())) .setChangedMaxLength(!Objects.equals(left.getMaxLength(), right.getMaxLength())); - Optional changedExtensions = - openApiDiff.getExtensionsDiff().diff(left.getExtensions(), right.getExtensions(), context); - changedExtensions.ifPresent(changedSchema::setChangedExtensions); + + openApiDiff + .getExtensionsDiff() + .diff(left.getExtensions(), right.getExtensions()) + .ifPresent(changedSchema::setExtensions); + openApiDiff + .getMetadataDiff() + .diff(left.getDescription(), right.getDescription(), context) + .ifPresent(changedSchema::setDescription); Map leftProperties = null == left ? null : left.getProperties(); Map rightProperties = null == right ? null : right.getProperties(); MapKeyDiff propertyDiff = MapKeyDiff.diff(leftProperties, rightProperties); for (String key : propertyDiff.getSharedKey()) { - Optional resultSchema = - openApiDiff - .getSchemaDiff() - .diff( - refSet, - leftProperties.get(key), - rightProperties.get(key), - required(context, key, right.getRequired())); - resultSchema.ifPresent( - changedSchema1 -> changedSchema.getChangedProperties().put(key, changedSchema1)); + openApiDiff + .getSchemaDiff() + .diff( + refSet, + leftProperties.get(key), + rightProperties.get(key), + required(context, key, right.getRequired())) + .ifPresent( + changedSchema1 -> changedSchema.getChangedProperties().put(key, changedSchema1)); } compareAdditionalProperties(refSet, left, right, context); @@ -89,8 +91,8 @@ public Optional diff( } protected Optional isApplicable(DiffContext context) { - if (changedSchema.getChangedReadOnly().isUnchanged() - && changedSchema.getChangedWriteOnly().isUnchanged() + if (changedSchema.getReadOnly().isUnchanged() + && changedSchema.getWriteOnly().isUnchanged() && !isPropertyApplicable(changedSchema.getNewSchema(), context)) { return Optional.empty(); } @@ -150,7 +152,7 @@ private void compareAdditionalProperties( context.copyWithRequired(false)); apChangedSchema = addPropChangedSchemaOP.orElse(apChangedSchema); } - isChanged(apChangedSchema).ifPresent(changedSchema::setAddPropChangedSchema); + isChanged(apChangedSchema).ifPresent(changedSchema::setAddProp); } } } diff --git a/src/main/java/com/qdesrame/openapi/diff/model/Changed.java b/src/main/java/com/qdesrame/openapi/diff/model/Changed.java index 7bf7f4263..543a0ab79 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/Changed.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/Changed.java @@ -1,6 +1,12 @@ package com.qdesrame.openapi.diff.model; +import java.util.Optional; + public interface Changed { + static DiffResult result(Changed changed) { + return Optional.ofNullable(changed).map(Changed::isChanged).orElse(DiffResult.NO_CHANGES); + } + DiffResult isChanged(); default boolean isCompatible() { diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedApiResponse.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedApiResponse.java index 8d65e942f..4c06d2156 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedApiResponse.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedApiResponse.java @@ -1,47 +1,53 @@ package com.qdesrame.openapi.diff.model; import com.qdesrame.openapi.diff.model.schema.ChangedExtensions; -import com.qdesrame.openapi.diff.utils.ChangedUtils; import io.swagger.v3.oas.models.responses.ApiResponse; import io.swagger.v3.oas.models.responses.ApiResponses; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; import lombok.Getter; import lombok.Setter; +import lombok.experimental.Accessors; /** Created by adarsh.sharma on 22/12/17. */ @Getter @Setter -public class ChangedApiResponse implements Changed { +@Accessors(chain = true) +public class ChangedApiResponse implements ComposedChanged { private final ApiResponses oldApiResponses; private final ApiResponses newApiResponses; private final DiffContext context; - private Map missingResponses; - private Map addResponses; - private Map changedResponses; - private ChangedExtensions changedExtensions; + + private Map increased; + private Map missing; + private Map changed; + private ChangedExtensions extensions; public ChangedApiResponse( ApiResponses oldApiResponses, ApiResponses newApiResponses, DiffContext context) { this.oldApiResponses = oldApiResponses; this.newApiResponses = newApiResponses; this.context = context; - this.missingResponses = new LinkedHashMap<>(); - this.addResponses = new LinkedHashMap<>(); - this.changedResponses = new LinkedHashMap<>(); + this.missing = new LinkedHashMap<>(); + this.increased = new LinkedHashMap<>(); + this.changed = new LinkedHashMap<>(); + } + + @Override + public List getChangedElements() { + return Stream.concat(changed.values().stream(), Stream.of(extensions)) + .collect(Collectors.toList()); } @Override - public DiffResult isChanged() { - if (addResponses.size() == 0 - && missingResponses.size() == 0 - && changedResponses.size() == 0 - && ChangedUtils.isUnchanged(changedExtensions)) { + public DiffResult isCoreChanged() { + if (increased.isEmpty() && missing.isEmpty()) { return DiffResult.NO_CHANGES; } - if (missingResponses.size() == 0 - && changedResponses.values().stream().allMatch(Changed::isCompatible) - && ChangedUtils.isCompatible(changedExtensions)) { + if (!increased.isEmpty() && missing.isEmpty()) { return DiffResult.COMPATIBLE; } return DiffResult.INCOMPATIBLE; diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedContent.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedContent.java index 165b94cb4..2502ad27b 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedContent.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedContent.java @@ -2,15 +2,19 @@ import io.swagger.v3.oas.models.media.Content; import io.swagger.v3.oas.models.media.MediaType; +import java.util.ArrayList; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import lombok.Getter; import lombok.Setter; +import lombok.experimental.Accessors; /** Created by adarsh.sharma on 22/12/17. */ @Getter @Setter -public class ChangedContent implements Changed { +@Accessors(chain = true) +public class ChangedContent implements ComposedChanged { private final Content oldContent; private final Content newContent; private final DiffContext context; @@ -29,13 +33,16 @@ public ChangedContent(Content oldContent, Content newContent, DiffContext contex } @Override - public DiffResult isChanged() { - if (increased.isEmpty() && missing.isEmpty() && changed.isEmpty()) { + public List getChangedElements() { + return new ArrayList<>(changed.values()); + } + + @Override + public DiffResult isCoreChanged() { + if (increased.isEmpty() && missing.isEmpty()) { return DiffResult.NO_CHANGES; } - if (((context.isRequest() && missing.isEmpty()) - || (context.isResponse() && increased.isEmpty())) - && changed.values().stream().allMatch(Changed::isCompatible)) { + if (context.isRequest() && missing.isEmpty() || context.isResponse() && increased.isEmpty()) { return DiffResult.COMPATIBLE; } return DiffResult.INCOMPATIBLE; diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedHeader.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedHeader.java index 8566f3a69..f95c466d7 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedHeader.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedHeader.java @@ -1,27 +1,30 @@ package com.qdesrame.openapi.diff.model; import com.qdesrame.openapi.diff.model.schema.ChangedExtensions; -import com.qdesrame.openapi.diff.utils.ChangedUtils; import io.swagger.v3.oas.models.headers.Header; +import java.util.Arrays; +import java.util.List; import lombok.Getter; import lombok.Setter; +import lombok.experimental.Accessors; /** Created by adarsh.sharma on 28/12/17. */ @Getter @Setter -public class ChangedHeader implements Changed { +@Accessors(chain = true) +public class ChangedHeader implements ComposedChanged { private final Header oldHeader; private final Header newHeader; private final DiffContext context; - private boolean changeDescription; - private boolean changeRequired; - private boolean changeDeprecated; - private boolean changeStyle; - private boolean changeExplode; - private ChangedSchema changedSchema; - private ChangedContent changedContent; - private ChangedExtensions changedExtensions; + private boolean required; + private boolean deprecated; + private boolean style; + private boolean explode; + private ChangedMetadata description; + private ChangedSchema schema; + private ChangedContent content; + private ChangedExtensions extensions; public ChangedHeader(Header oldHeader, Header newHeader, DiffContext context) { this.oldHeader = oldHeader; @@ -30,23 +33,16 @@ public ChangedHeader(Header oldHeader, Header newHeader, DiffContext context) { } @Override - public DiffResult isChanged() { - if (!changeDescription - && !changeRequired - && !changeDeprecated - && !changeStyle - && !changeExplode - && ChangedUtils.isUnchanged(changedSchema) - && ChangedUtils.isUnchanged(changedContent) - && ChangedUtils.isUnchanged(changedExtensions)) { + public List getChangedElements() { + return Arrays.asList(description, schema, content, extensions); + } + + @Override + public DiffResult isCoreChanged() { + if (!required && !deprecated && !style && !explode) { return DiffResult.NO_CHANGES; } - if (!changeRequired - && !changeStyle - && !changeExplode - && ChangedUtils.isCompatible(changedSchema) - && ChangedUtils.isCompatible(changedContent) - && ChangedUtils.isCompatible(changedExtensions)) { + if (!required && !style && !explode) { return DiffResult.COMPATIBLE; } return DiffResult.INCOMPATIBLE; diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedHeaders.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedHeaders.java index 3fae03af7..e0790cddc 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedHeaders.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedHeaders.java @@ -1,14 +1,18 @@ package com.qdesrame.openapi.diff.model; import io.swagger.v3.oas.models.headers.Header; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import lombok.Getter; import lombok.Setter; +import lombok.experimental.Accessors; /** Created by adarsh.sharma on 28/12/17. */ @Getter @Setter -public class ChangedHeaders implements Changed { +@Accessors(chain = true) +public class ChangedHeaders implements ComposedChanged { private final Map oldHeaders; private final Map newHeaders; private final DiffContext context; @@ -25,12 +29,16 @@ public ChangedHeaders( } @Override - public DiffResult isChanged() { - if (increased.isEmpty() && missing.isEmpty() && (changed == null || changed.isEmpty())) { + public List getChangedElements() { + return new ArrayList<>(changed.values()); + } + + @Override + public DiffResult isCoreChanged() { + if (increased.isEmpty() && missing.isEmpty()) { return DiffResult.NO_CHANGES; } - if (missing.isEmpty() - && (changed == null || changed.values().stream().allMatch(Changed::isCompatible))) { + if (missing.isEmpty()) { return DiffResult.COMPATIBLE; } return DiffResult.INCOMPATIBLE; diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedMediaType.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedMediaType.java index cd20e541f..0181b6867 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedMediaType.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedMediaType.java @@ -1,16 +1,20 @@ package com.qdesrame.openapi.diff.model; import io.swagger.v3.oas.models.media.Schema; +import java.util.Collections; +import java.util.List; import lombok.Getter; import lombok.Setter; +import lombok.experimental.Accessors; @Getter @Setter -public class ChangedMediaType implements Changed { +@Accessors(chain = true) +public class ChangedMediaType implements ComposedChanged { private final Schema oldSchema; private final Schema newSchema; private final DiffContext context; - private ChangedSchema changedSchema; + private ChangedSchema schema; public ChangedMediaType(Schema oldSchema, Schema newSchema, DiffContext context) { this.oldSchema = oldSchema; @@ -19,13 +23,12 @@ public ChangedMediaType(Schema oldSchema, Schema newSchema, DiffContext context) } @Override - public DiffResult isChanged() { - if (this.changedSchema == null || this.changedSchema.isUnchanged()) { - return DiffResult.NO_CHANGES; - } - if (this.changedSchema.isCompatible()) { - return DiffResult.COMPATIBLE; - } - return DiffResult.INCOMPATIBLE; + public List getChangedElements() { + return Collections.singletonList(schema); + } + + @Override + public DiffResult isCoreChanged() { + return DiffResult.NO_CHANGES; } } diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedMetadata.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedMetadata.java new file mode 100644 index 000000000..424771d6e --- /dev/null +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedMetadata.java @@ -0,0 +1,23 @@ +package com.qdesrame.openapi.diff.model; + +import java.util.Objects; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +@Getter +@Setter +@Accessors(chain = true) +public class ChangedMetadata implements Changed { + + private String left; + private String right; + + @Override + public DiffResult isChanged() { + if (Objects.equals(left, right)) { + return DiffResult.NO_CHANGES; + } + return DiffResult.METADATA; + } +} diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedOAuthFlow.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedOAuthFlow.java index d8c65cf2e..2c834026e 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedOAuthFlow.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedOAuthFlow.java @@ -1,22 +1,25 @@ package com.qdesrame.openapi.diff.model; import com.qdesrame.openapi.diff.model.schema.ChangedExtensions; -import com.qdesrame.openapi.diff.utils.ChangedUtils; import io.swagger.v3.oas.models.security.OAuthFlow; +import java.util.Collections; +import java.util.List; import lombok.Getter; import lombok.Setter; +import lombok.experimental.Accessors; /** Created by adarsh.sharma on 12/01/18. */ @Getter @Setter -public class ChangedOAuthFlow implements Changed { +@Accessors(chain = true) +public class ChangedOAuthFlow implements ComposedChanged { private OAuthFlow oldOAuthFlow; private OAuthFlow newOAuthFlow; - private boolean changedAuthorizationUrl; - private boolean changedTokenUrl; - private boolean changedRefreshUrl; - private ChangedExtensions changedExtensions; + private boolean authorizationUrl; + private boolean tokenUrl; + private boolean refreshUrl; + private ChangedExtensions extensions; public ChangedOAuthFlow(OAuthFlow oldOAuthFlow, OAuthFlow newOAuthFlow) { this.oldOAuthFlow = oldOAuthFlow; @@ -24,14 +27,15 @@ public ChangedOAuthFlow(OAuthFlow oldOAuthFlow, OAuthFlow newOAuthFlow) { } @Override - public DiffResult isChanged() { - if (!changedAuthorizationUrl && !changedTokenUrl && !changedRefreshUrl) { - if (ChangedUtils.isUnchanged(changedExtensions)) { - return DiffResult.NO_CHANGES; - } else if (ChangedUtils.isCompatible(changedExtensions)) { - return DiffResult.COMPATIBLE; - } + public List getChangedElements() { + return Collections.singletonList(extensions); + } + + @Override + public DiffResult isCoreChanged() { + if (authorizationUrl || tokenUrl || refreshUrl) { + return DiffResult.INCOMPATIBLE; } - return DiffResult.INCOMPATIBLE; + return DiffResult.NO_CHANGES; } } diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedOAuthFlows.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedOAuthFlows.java index 126642171..ec075ba2f 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedOAuthFlows.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedOAuthFlows.java @@ -1,23 +1,26 @@ package com.qdesrame.openapi.diff.model; import com.qdesrame.openapi.diff.model.schema.ChangedExtensions; -import com.qdesrame.openapi.diff.utils.ChangedUtils; import io.swagger.v3.oas.models.security.OAuthFlows; +import java.util.Arrays; +import java.util.List; import lombok.Getter; import lombok.Setter; +import lombok.experimental.Accessors; /** Created by adarsh.sharma on 12/01/18. */ @Getter @Setter -public class ChangedOAuthFlows implements Changed { +@Accessors(chain = true) +public class ChangedOAuthFlows implements ComposedChanged { private final OAuthFlows oldOAuthFlows; private final OAuthFlows newOAuthFlows; - private ChangedOAuthFlow changedImplicitOAuthFlow; - private ChangedOAuthFlow changedPasswordOAuthFlow; - private ChangedOAuthFlow changedClientCredentialOAuthFlow; - private ChangedOAuthFlow changedAuthorizationCodeOAuthFlow; - private ChangedExtensions changedExtensions; + private ChangedOAuthFlow implicitOAuthFlow; + private ChangedOAuthFlow passwordOAuthFlow; + private ChangedOAuthFlow clientCredentialOAuthFlow; + private ChangedOAuthFlow authorizationCodeOAuthFlow; + private ChangedExtensions extensions; public ChangedOAuthFlows(OAuthFlows oldOAuthFlows, OAuthFlows newOAuthFlows) { this.oldOAuthFlows = oldOAuthFlows; @@ -25,21 +28,17 @@ public ChangedOAuthFlows(OAuthFlows oldOAuthFlows, OAuthFlows newOAuthFlows) { } @Override - public DiffResult isChanged() { - if ((changedImplicitOAuthFlow == null || changedImplicitOAuthFlow.isUnchanged()) - && ChangedUtils.isUnchanged(changedPasswordOAuthFlow) - && ChangedUtils.isUnchanged(changedClientCredentialOAuthFlow) - && ChangedUtils.isUnchanged(changedAuthorizationCodeOAuthFlow) - && ChangedUtils.isUnchanged(changedExtensions)) { - return DiffResult.NO_CHANGES; - } - if ((changedImplicitOAuthFlow == null || changedImplicitOAuthFlow.isCompatible()) - && ChangedUtils.isCompatible(changedPasswordOAuthFlow) - && ChangedUtils.isCompatible(changedClientCredentialOAuthFlow) - && ChangedUtils.isCompatible(changedAuthorizationCodeOAuthFlow) - && ChangedUtils.isCompatible(changedExtensions)) { - return DiffResult.COMPATIBLE; - } - return DiffResult.INCOMPATIBLE; + public List getChangedElements() { + return Arrays.asList( + implicitOAuthFlow, + passwordOAuthFlow, + clientCredentialOAuthFlow, + authorizationCodeOAuthFlow, + extensions); + } + + @Override + public DiffResult isCoreChanged() { + return DiffResult.NO_CHANGES; } } diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedOneOfSchema.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedOneOfSchema.java index ca3994854..57b4b9ca3 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedOneOfSchema.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedOneOfSchema.java @@ -1,21 +1,25 @@ package com.qdesrame.openapi.diff.model; import io.swagger.v3.oas.models.media.Schema; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import lombok.Getter; import lombok.Setter; +import lombok.experimental.Accessors; /** Created by adarsh.sharma on 22/12/17. */ @Getter @Setter -public class ChangedOneOfSchema implements Changed { +@Accessors(chain = true) +public class ChangedOneOfSchema implements ComposedChanged { private final Map oldMapping; private final Map newMapping; private final DiffContext context; - private Map increasedMapping; - private Map missingMapping; - private Map changedMapping; + private Map increased; + private Map missing; + private Map changed; public ChangedOneOfSchema( Map oldMapping, Map newMapping, DiffContext context) { @@ -25,13 +29,16 @@ public ChangedOneOfSchema( } @Override - public DiffResult isChanged() { - if (increasedMapping.size() == 0 && missingMapping.size() == 0 && changedMapping.size() == 0) { + public List getChangedElements() { + return new ArrayList<>(changed.values()); + } + + @Override + public DiffResult isCoreChanged() { + if (increased.isEmpty() && missing.isEmpty()) { return DiffResult.NO_CHANGES; } - if (((context.isRequest() && missingMapping.isEmpty()) - || (context.isResponse() && increasedMapping.isEmpty())) - && changedMapping.values().stream().allMatch(Changed::isCompatible)) { + if (context.isRequest() && missing.isEmpty() || context.isResponse() && increased.isEmpty()) { return DiffResult.COMPATIBLE; } return DiffResult.INCOMPATIBLE; diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedOpenApi.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedOpenApi.java index bb954502a..aabab1ea7 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedOpenApi.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedOpenApi.java @@ -1,18 +1,20 @@ package com.qdesrame.openapi.diff.model; import com.qdesrame.openapi.diff.model.schema.ChangedExtensions; -import com.qdesrame.openapi.diff.utils.ChangedUtils; import com.qdesrame.openapi.diff.utils.EndpointUtils; import io.swagger.v3.oas.models.OpenAPI; import java.util.List; import java.util.stream.Collectors; +import java.util.stream.Stream; import lombok.Getter; import lombok.Setter; +import lombok.experimental.Accessors; /** Created by adarsh.sharma on 22/12/17. */ @Getter @Setter -public class ChangedOpenApi implements Changed { +@Accessors(chain = true) +public class ChangedOpenApi implements ComposedChanged { private OpenAPI oldSpecOpenApi; private OpenAPI newSpecOpenApi; @@ -33,16 +35,17 @@ public List getDeprecatedEndpoints() { } @Override - public DiffResult isChanged() { - if (newEndpoints.size() == 0 - && missingEndpoints.size() == 0 - && changedOperations.size() == 0 - && ChangedUtils.isUnchanged(changedExtensions)) { + public List getChangedElements() { + return Stream.concat(changedOperations.stream(), Stream.of(changedExtensions)) + .collect(Collectors.toList()); + } + + @Override + public DiffResult isCoreChanged() { + if (newEndpoints.isEmpty() && missingEndpoints.isEmpty()) { return DiffResult.NO_CHANGES; } - if (missingEndpoints.size() == 0 - && changedOperations.stream().allMatch(Changed::isCompatible) - && ChangedUtils.isCompatible(changedExtensions)) { + if (missingEndpoints.isEmpty()) { return DiffResult.COMPATIBLE; } return DiffResult.INCOMPATIBLE; diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedOperation.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedOperation.java index 77e0b9080..ca8d3b00f 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedOperation.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedOperation.java @@ -1,26 +1,33 @@ package com.qdesrame.openapi.diff.model; +import static com.qdesrame.openapi.diff.model.Changed.result; + import com.qdesrame.openapi.diff.model.schema.ChangedExtensions; -import com.qdesrame.openapi.diff.utils.ChangedUtils; import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.PathItem; +import java.util.Arrays; +import java.util.List; import lombok.Getter; import lombok.Setter; +import lombok.experimental.Accessors; @Getter @Setter -public class ChangedOperation implements Changed { - private String pathUrl; - private PathItem.HttpMethod httpMethod; +@Accessors(chain = true) +public class ChangedOperation implements ComposedChanged { private Operation oldOperation; private Operation newOperation; - private String summary; + + private String pathUrl; + private PathItem.HttpMethod httpMethod; + private ChangedMetadata summary; + private ChangedMetadata description; private boolean deprecated; - private ChangedParameters changedParameters; - private ChangedRequestBody changedRequestBody; - private ChangedApiResponse changedApiResponse; - private ChangedSecurityRequirements changedSecurityRequirements; - private ChangedExtensions changedExtensions; + private ChangedParameters parameters; + private ChangedRequestBody requestBody; + private ChangedApiResponse apiResponses; + private ChangedSecurityRequirements securityRequirements; + private ChangedExtensions extensions; public ChangedOperation( String pathUrl, @@ -34,41 +41,31 @@ public ChangedOperation( } @Override - public DiffResult isChanged() { + public List getChangedElements() { + return Arrays.asList( + summary, + description, + parameters, + requestBody, + apiResponses, + securityRequirements, + extensions); + } + + @Override + public DiffResult isCoreChanged() { // TODO BETTER HANDLING FOR DEPRECIATION - if (!deprecated - && isChangedParam().isUnchanged() - && isChangedRequest().isUnchanged() - && isChangedResponse().isUnchanged() - && isChangedSecurity().isUnchanged() - && ChangedUtils.isUnchanged(changedExtensions)) { - return DiffResult.NO_CHANGES; - } - if (isChangedParam().isCompatible() - && isChangedRequest().isCompatible() - && isChangedResponse().isCompatible() - && isChangedSecurity().isCompatible() - && ChangedUtils.isCompatible(changedExtensions)) { + if (deprecated) { return DiffResult.COMPATIBLE; } - return DiffResult.INCOMPATIBLE; - } - - public DiffResult isChangedParam() { - return changedParameters == null ? DiffResult.NO_CHANGES : changedParameters.isChanged(); - } - - public DiffResult isChangedResponse() { - return changedApiResponse == null ? DiffResult.NO_CHANGES : changedApiResponse.isChanged(); + return DiffResult.NO_CHANGES; } - public DiffResult isChangedRequest() { - return changedRequestBody == null ? DiffResult.NO_CHANGES : changedRequestBody.isChanged(); + public DiffResult resultApiResponses() { + return result(apiResponses); } - public DiffResult isChangedSecurity() { - return changedSecurityRequirements == null - ? DiffResult.NO_CHANGES - : changedSecurityRequirements.isChanged(); + public DiffResult resultRequestBody() { + return requestBody == null ? DiffResult.NO_CHANGES : requestBody.isChanged(); } } diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedParameter.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedParameter.java index 002d3ba93..13dc75df2 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedParameter.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedParameter.java @@ -1,30 +1,31 @@ package com.qdesrame.openapi.diff.model; import com.qdesrame.openapi.diff.model.schema.ChangedExtensions; -import com.qdesrame.openapi.diff.utils.ChangedUtils; import io.swagger.v3.oas.models.parameters.Parameter; +import java.util.Arrays; +import java.util.List; import lombok.Getter; import lombok.Setter; +import lombok.experimental.Accessors; @Getter @Setter -public class ChangedParameter implements Changed { +@Accessors(chain = true) +public class ChangedParameter implements ComposedChanged { + private final DiffContext context; private Parameter oldParameter; private Parameter newParameter; - private String name; private String in; - private final DiffContext context; - - private boolean changeDescription; private boolean changeRequired; private boolean deprecated; private boolean changeStyle; private boolean changeExplode; private boolean changeAllowEmptyValue; - private ChangedSchema changedSchema; - private ChangedContent changedContent; - private ChangedExtensions changedExtensions; + private ChangedMetadata description; + private ChangedSchema schema; + private ChangedContent content; + private ChangedExtensions extensions; public ChangedParameter(String name, String in, DiffContext context) { this.name = name; @@ -33,25 +34,23 @@ public ChangedParameter(String name, String in, DiffContext context) { } @Override - public DiffResult isChanged() { - if (!changeDescription - && !changeRequired + public List getChangedElements() { + return Arrays.asList(description, schema, content, extensions); + } + + @Override + public DiffResult isCoreChanged() { + if (!changeRequired && !deprecated && !changeAllowEmptyValue && !changeStyle - && !changeExplode - && ChangedUtils.isUnchanged(changedSchema) - && ChangedUtils.isUnchanged(changedContent) - && ChangedUtils.isUnchanged(changedExtensions)) { + && !changeExplode) { return DiffResult.NO_CHANGES; } if ((!changeRequired || Boolean.TRUE.equals(oldParameter.getRequired())) && (!changeAllowEmptyValue || Boolean.TRUE.equals(newParameter.getAllowEmptyValue())) && !changeStyle - && !changeExplode - && ChangedUtils.isCompatible(changedSchema) - && ChangedUtils.isCompatible(changedContent) - && ChangedUtils.isCompatible(changedExtensions)) { + && !changeExplode) { return DiffResult.COMPATIBLE; } return DiffResult.INCOMPATIBLE; diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedParameters.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedParameters.java index cbe0d67c6..6d522e07e 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedParameters.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedParameters.java @@ -5,10 +5,12 @@ import java.util.List; import lombok.Getter; import lombok.Setter; +import lombok.experimental.Accessors; @Getter @Setter -public class ChangedParameters implements Changed { +@Accessors(chain = true) +public class ChangedParameters implements ComposedChanged { private final List oldParameterList; private final List newParameterList; private final DiffContext context; @@ -28,13 +30,16 @@ public ChangedParameters( } @Override - public DiffResult isChanged() { - if (increased.isEmpty() && missing.isEmpty() && changed.isEmpty()) { + public List getChangedElements() { + return new ArrayList<>(changed); + } + + @Override + public DiffResult isCoreChanged() { + if (increased.isEmpty() && missing.isEmpty()) { return DiffResult.NO_CHANGES; } - if (increased.stream().noneMatch(Parameter::getRequired) - && missing.isEmpty() - && changed.stream().allMatch(Changed::isCompatible)) { + if (increased.stream().noneMatch(Parameter::getRequired) && missing.isEmpty()) { return DiffResult.COMPATIBLE; } return DiffResult.INCOMPATIBLE; diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedPath.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedPath.java index 71c85dfad..e55b041d0 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedPath.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedPath.java @@ -1,19 +1,22 @@ package com.qdesrame.openapi.diff.model; import com.qdesrame.openapi.diff.model.schema.ChangedExtensions; -import com.qdesrame.openapi.diff.utils.ChangedUtils; import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.PathItem; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; import lombok.Getter; import lombok.Setter; +import lombok.experimental.Accessors; @Getter @Setter -public class ChangedPath implements Changed { +@Accessors(chain = true) +public class ChangedPath implements ComposedChanged { private final String pathUrl; private final PathItem oldPath; private final PathItem newPath; @@ -22,7 +25,7 @@ public class ChangedPath implements Changed { Map increased; Map missing; List changed; - private ChangedExtensions changedExtensions; + private ChangedExtensions extensions; public ChangedPath(String pathUrl, PathItem oldPath, PathItem newPath, DiffContext context) { this.pathUrl = pathUrl; @@ -35,16 +38,16 @@ public ChangedPath(String pathUrl, PathItem oldPath, PathItem newPath, DiffConte } @Override - public DiffResult isChanged() { - if (increased.isEmpty() - && missing.isEmpty() - && changed.isEmpty() - && ChangedUtils.isUnchanged(changedExtensions)) { + public List getChangedElements() { + return Stream.concat(changed.stream(), Stream.of(extensions)).collect(Collectors.toList()); + } + + @Override + public DiffResult isCoreChanged() { + if (increased.isEmpty() && missing.isEmpty()) { return DiffResult.NO_CHANGES; } - if (missing.isEmpty() - && changed.stream().allMatch(Changed::isCompatible) - && ChangedUtils.isCompatible(changedExtensions)) { + if (missing.isEmpty()) { return DiffResult.COMPATIBLE; } return DiffResult.INCOMPATIBLE; diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedPaths.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedPaths.java index a1a3dead9..c3991b5d8 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedPaths.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedPaths.java @@ -1,14 +1,16 @@ package com.qdesrame.openapi.diff.model; import io.swagger.v3.oas.models.PathItem; +import java.util.ArrayList; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import lombok.Getter; import lombok.Setter; @Getter @Setter -public class ChangedPaths implements Changed { +public class ChangedPaths implements ComposedChanged { private final Map oldPathMap; private final Map newPathMap; @@ -25,11 +27,16 @@ public ChangedPaths(Map oldPathMap, Map newP } @Override - public DiffResult isChanged() { - if (increased.isEmpty() && missing.isEmpty() && changed.isEmpty()) { + public List getChangedElements() { + return new ArrayList<>(changed.values()); + } + + @Override + public DiffResult isCoreChanged() { + if (increased.isEmpty() && missing.isEmpty()) { return DiffResult.NO_CHANGES; } - if (missing.isEmpty() && changed.values().stream().allMatch(Changed::isCompatible)) { + if (missing.isEmpty()) { return DiffResult.COMPATIBLE; } return DiffResult.INCOMPATIBLE; diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedRequestBody.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedRequestBody.java index 249082e91..d7df2b3d9 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedRequestBody.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedRequestBody.java @@ -1,23 +1,26 @@ package com.qdesrame.openapi.diff.model; import com.qdesrame.openapi.diff.model.schema.ChangedExtensions; -import com.qdesrame.openapi.diff.utils.ChangedUtils; import io.swagger.v3.oas.models.parameters.RequestBody; +import java.util.Arrays; +import java.util.List; import lombok.Getter; import lombok.Setter; +import lombok.experimental.Accessors; /** Created by adarsh.sharma on 27/12/17. */ @Getter @Setter -public class ChangedRequestBody implements Changed { +@Accessors(chain = true) +public class ChangedRequestBody implements ComposedChanged { private final RequestBody oldRequestBody; private final RequestBody newRequestBody; private final DiffContext context; - private boolean changeDescription; private boolean changeRequired; - private ChangedContent changedContent; - private ChangedExtensions changedExtensions; + private ChangedMetadata description; + private ChangedContent content; + private ChangedExtensions extensions; public ChangedRequestBody( RequestBody oldRequestBody, RequestBody newRequestBody, DiffContext context) { @@ -27,18 +30,15 @@ public ChangedRequestBody( } @Override - public DiffResult isChanged() { - if (!changeDescription - && !changeRequired - && ChangedUtils.isUnchanged(changedContent) - && ChangedUtils.isUnchanged(changedExtensions)) { + public List getChangedElements() { + return Arrays.asList(description, content, extensions); + } + + @Override + public DiffResult isCoreChanged() { + if (!changeRequired) { return DiffResult.NO_CHANGES; } - if (!changeRequired - && ChangedUtils.isCompatible(changedContent) - && ChangedUtils.isCompatible(changedExtensions)) { - return DiffResult.COMPATIBLE; - } return DiffResult.INCOMPATIBLE; } } diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedResponse.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedResponse.java index 134d6fd99..e1d923304 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedResponse.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedResponse.java @@ -1,22 +1,25 @@ package com.qdesrame.openapi.diff.model; import com.qdesrame.openapi.diff.model.schema.ChangedExtensions; -import com.qdesrame.openapi.diff.utils.ChangedUtils; import io.swagger.v3.oas.models.responses.ApiResponse; +import java.util.Arrays; +import java.util.List; import lombok.Getter; import lombok.Setter; +import lombok.experimental.Accessors; @Getter @Setter -public class ChangedResponse implements Changed { +@Accessors(chain = true) +public class ChangedResponse implements ComposedChanged { private final ApiResponse oldApiResponse; private final ApiResponse newApiResponse; private final DiffContext context; - private boolean changeDescription; - private ChangedHeaders changedHeaders; - private ChangedContent changedContent; - private ChangedExtensions changedExtensions; + private ChangedMetadata description; + private ChangedHeaders headers; + private ChangedContent content; + private ChangedExtensions extensions; public ChangedResponse( ApiResponse oldApiResponse, ApiResponse newApiResponse, DiffContext context) { @@ -26,18 +29,12 @@ public ChangedResponse( } @Override - public DiffResult isChanged() { - if (!changeDescription - && ChangedUtils.isUnchanged(changedContent) - && ChangedUtils.isUnchanged(changedHeaders) - && ChangedUtils.isUnchanged(changedExtensions)) { - return DiffResult.NO_CHANGES; - } - if (ChangedUtils.isCompatible(changedContent) - && ChangedUtils.isCompatible(changedHeaders) - && ChangedUtils.isCompatible(changedExtensions)) { - return DiffResult.COMPATIBLE; - } - return DiffResult.INCOMPATIBLE; + public List getChangedElements() { + return Arrays.asList(description, headers, content, extensions); + } + + @Override + public DiffResult isCoreChanged() { + return DiffResult.NO_CHANGES; } } diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedSchema.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedSchema.java index ad59a489f..542dc4262 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedSchema.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedSchema.java @@ -3,10 +3,12 @@ import com.qdesrame.openapi.diff.model.schema.ChangedExtensions; import com.qdesrame.openapi.diff.model.schema.ChangedReadOnly; import com.qdesrame.openapi.diff.model.schema.ChangedWriteOnly; -import com.qdesrame.openapi.diff.utils.ChangedUtils; import io.swagger.v3.oas.models.media.Schema; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; @@ -16,7 +18,7 @@ @Getter @Setter @Accessors(chain = true) -public class ChangedSchema implements Changed { +public class ChangedSchema implements ComposedChanged { protected DiffContext context; protected Schema oldSchema; protected Schema newSchema; @@ -25,21 +27,21 @@ public class ChangedSchema implements Changed { protected Map increasedProperties; protected Map missingProperties; protected boolean changeDeprecated; - protected boolean changeDescription; + protected ChangedMetadata description; protected boolean changeTitle; protected ListDiff changeRequired; protected boolean changeDefault; protected ListDiff changeEnum; protected boolean changeFormat; - protected ChangedReadOnly changedReadOnly; - protected ChangedWriteOnly changedWriteOnly; + protected ChangedReadOnly readOnly; + protected ChangedWriteOnly writeOnly; protected boolean changedType; protected boolean changedMaxLength; protected boolean discriminatorPropertyChanged; - protected ChangedSchema changedItems; - protected ChangedOneOfSchema changedOneOfSchema; - protected ChangedSchema addPropChangedSchema; - protected ChangedExtensions changedExtensions; + protected ChangedSchema items; + protected ChangedOneOfSchema oneOfSchema; + protected ChangedSchema addProp; + private ChangedExtensions extensions; public ChangedSchema() { increasedProperties = new LinkedHashMap<>(); @@ -48,11 +50,17 @@ public ChangedSchema() { } @Override - public DiffResult isChanged() { + public List getChangedElements() { + return Stream.concat( + changedProperties.values().stream(), + Stream.of(description, readOnly, writeOnly, items, oneOfSchema, addProp, extensions)) + .collect(Collectors.toList()); + } + + @Override + public DiffResult isCoreChanged() { if (!changedType && (oldSchema == null && newSchema == null || oldSchema != null && newSchema != null) - && ChangedUtils.isUnchanged(changedWriteOnly) - && ChangedUtils.isUnchanged(changedReadOnly) && !changedMaxLength && (changeEnum == null || changeEnum.isUnchanged()) && !changeFormat @@ -61,14 +69,10 @@ public DiffResult isChanged() { && changedProperties.values().size() == 0 && !changeDeprecated && (changeRequired == null || changeRequired.isUnchanged()) - && !discriminatorPropertyChanged - && ChangedUtils.isUnchanged(addPropChangedSchema) - && ChangedUtils.isUnchanged(changedOneOfSchema) - && ChangedUtils.isUnchanged(changedItems) - && ChangedUtils.isUnchanged(changedExtensions)) { + && !discriminatorPropertyChanged) { return DiffResult.NO_CHANGES; } - boolean backwardCompatibleForRequest = + boolean compatibleForRequest = (changeEnum == null || changeEnum.getMissing().isEmpty()) && (changeRequired == null || CollectionUtils.isEmpty(changeRequired.getIncreased())) && (oldSchema != null || newSchema == null) @@ -77,7 +81,7 @@ public DiffResult isChanged() { || (oldSchema.getMaxLength() != null && oldSchema.getMaxLength() <= newSchema.getMaxLength())); - boolean backwardCompatibleForResponse = + boolean compatibleForResponse = (changeEnum == null || changeEnum.getIncreased().isEmpty()) && (changeRequired == null || CollectionUtils.isEmpty(changeRequired.getMissing())) && missingProperties.isEmpty() @@ -86,19 +90,12 @@ public DiffResult isChanged() { || oldSchema.getMaxLength() == null || (newSchema.getMaxLength() != null && newSchema.getMaxLength() <= oldSchema.getMaxLength())); - - if ((context.isRequest() && backwardCompatibleForRequest - || context.isResponse() && backwardCompatibleForResponse) + if ((context.isRequest() && compatibleForRequest + || context.isResponse() && compatibleForResponse) && !changedType - && !discriminatorPropertyChanged - && ChangedUtils.isCompatible(changedOneOfSchema) - && ChangedUtils.isCompatible(addPropChangedSchema) - && changedProperties.values().stream().allMatch(Changed::isCompatible) - && ChangedUtils.isCompatible(changedItems) - && ChangedUtils.isCompatible(changedExtensions)) { + && !discriminatorPropertyChanged) { return DiffResult.COMPATIBLE; } - return DiffResult.INCOMPATIBLE; } } diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedSecurityRequirement.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedSecurityRequirement.java index bdc7c8b67..a1361db09 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedSecurityRequirement.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedSecurityRequirement.java @@ -5,12 +5,13 @@ import java.util.List; import lombok.Getter; import lombok.Setter; -import org.apache.commons.collections4.CollectionUtils; +import lombok.experimental.Accessors; /** Created by adarsh.sharma on 06/01/18. */ @Getter @Setter -public class ChangedSecurityRequirement implements Changed { +@Accessors(chain = true) +public class ChangedSecurityRequirement implements ComposedChanged { private SecurityRequirement oldSecurityRequirement; private SecurityRequirement newSecurityRequirement; @@ -22,15 +23,20 @@ public ChangedSecurityRequirement( SecurityRequirement oldSecurityRequirement, SecurityRequirement newSecurityRequirement) { this.oldSecurityRequirement = oldSecurityRequirement; this.newSecurityRequirement = newSecurityRequirement; + this.changed = new ArrayList<>(); } @Override - public DiffResult isChanged() { - if (missing == null && increased == null && CollectionUtils.isEmpty(changed)) { + public List getChangedElements() { + return new ArrayList<>(changed); + } + + @Override + public DiffResult isCoreChanged() { + if (increased == null && missing == null) { return DiffResult.NO_CHANGES; } - if (increased == null - && (changed == null || changed.stream().allMatch(Changed::isCompatible))) { + if (increased == null) { return DiffResult.COMPATIBLE; } return DiffResult.INCOMPATIBLE; @@ -51,9 +57,6 @@ public void addIncreased(String key, List scopes) { } public void addChanged(ChangedSecurityScheme changedSecurityScheme) { - if (changed == null) { - changed = new ArrayList<>(); - } changed.add(changedSecurityScheme); } } diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedSecurityRequirements.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedSecurityRequirements.java index b5e2438de..61e6d7f02 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedSecurityRequirements.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedSecurityRequirements.java @@ -5,12 +5,14 @@ import java.util.List; import lombok.Getter; import lombok.Setter; +import lombok.experimental.Accessors; import org.apache.commons.collections4.CollectionUtils; /** Created by adarsh.sharma on 06/01/18. */ @Getter @Setter -public class ChangedSecurityRequirements implements Changed { +@Accessors(chain = true) +public class ChangedSecurityRequirements implements ComposedChanged { private List oldSecurityRequirements; private List newSecurityRequirements; @@ -23,17 +25,20 @@ public ChangedSecurityRequirements( List newSecurityRequirements) { this.oldSecurityRequirements = oldSecurityRequirements; this.newSecurityRequirements = newSecurityRequirements; + this.changed = new ArrayList<>(); } @Override - public DiffResult isChanged() { - if (CollectionUtils.isEmpty(missing) - && CollectionUtils.isEmpty(increased) - && CollectionUtils.isEmpty(changed)) { + public List getChangedElements() { + return new ArrayList<>(changed); + } + + @Override + public DiffResult isCoreChanged() { + if (CollectionUtils.isEmpty(missing) && CollectionUtils.isEmpty(increased)) { return DiffResult.NO_CHANGES; } - if (CollectionUtils.isEmpty(missing) - && (changed == null || changed.stream().allMatch(Changed::isCompatible))) { + if (CollectionUtils.isEmpty(missing)) { return DiffResult.COMPATIBLE; } return DiffResult.INCOMPATIBLE; diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ChangedSecurityScheme.java b/src/main/java/com/qdesrame/openapi/diff/model/ChangedSecurityScheme.java index 03074e32e..2afcc2d03 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/ChangedSecurityScheme.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/ChangedSecurityScheme.java @@ -1,26 +1,30 @@ package com.qdesrame.openapi.diff.model; import com.qdesrame.openapi.diff.model.schema.ChangedExtensions; -import com.qdesrame.openapi.diff.utils.ChangedUtils; import io.swagger.v3.oas.models.security.SecurityScheme; +import java.util.Arrays; +import java.util.List; import lombok.Getter; import lombok.Setter; +import lombok.experimental.Accessors; /** Created by adarsh.sharma on 11/01/18. */ @Getter @Setter -public class ChangedSecurityScheme implements Changed { +@Accessors(chain = true) +public class ChangedSecurityScheme implements ComposedChanged { private SecurityScheme oldSecurityScheme; private SecurityScheme newSecurityScheme; + private boolean changedType; - private boolean changedDescription; private boolean changedIn; private boolean changedScheme; private boolean changedBearerFormat; - private ChangedOAuthFlows changedOAuthFlows; private boolean changedOpenIdConnectUrl; private ListDiff changedScopes; - private ChangedExtensions changedExtensions; + private ChangedMetadata description; + private ChangedOAuthFlows oAuthFlows; + private ChangedExtensions extensions; public ChangedSecurityScheme(SecurityScheme oldSecurityScheme, SecurityScheme newSecurityScheme) { this.oldSecurityScheme = oldSecurityScheme; @@ -28,26 +32,26 @@ public ChangedSecurityScheme(SecurityScheme oldSecurityScheme, SecurityScheme ne } @Override - public DiffResult isChanged() { + public List getChangedElements() { + return Arrays.asList(description, oAuthFlows, extensions); + } + + @Override + public DiffResult isCoreChanged() { if (!changedType - && !changedDescription && !changedIn && !changedScheme && !changedBearerFormat - && ChangedUtils.isUnchanged(changedOAuthFlows) && !changedOpenIdConnectUrl - && (changedScopes == null || changedScopes.isUnchanged()) - && ChangedUtils.isUnchanged(changedExtensions)) { + && (changedScopes == null || changedScopes.isUnchanged())) { return DiffResult.NO_CHANGES; } if (!changedType && !changedIn && !changedScheme && !changedBearerFormat - && ChangedUtils.isCompatible(changedOAuthFlows) && !changedOpenIdConnectUrl - && (changedScopes == null || changedScopes.getIncreased().isEmpty()) - && ChangedUtils.isCompatible(changedExtensions)) { + && (changedScopes == null || changedScopes.getIncreased().isEmpty())) { return DiffResult.COMPATIBLE; } return DiffResult.INCOMPATIBLE; diff --git a/src/main/java/com/qdesrame/openapi/diff/model/CompatibleChanged.java b/src/main/java/com/qdesrame/openapi/diff/model/CompatibleChanged.java deleted file mode 100644 index 38d942b10..000000000 --- a/src/main/java/com/qdesrame/openapi/diff/model/CompatibleChanged.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.qdesrame.openapi.diff.model; - -public class CompatibleChanged implements Changed { - private final Object value; - - private CompatibleChanged(Object value) { - this.value = value; - } - - public static CompatibleChanged compatible(Change change) { - return new CompatibleChanged(change); - } - - @Override - public DiffResult isChanged() { - return DiffResult.COMPATIBLE; - } - - public Object getValue() { - return value; - } -} diff --git a/src/main/java/com/qdesrame/openapi/diff/model/ComposedChanged.java b/src/main/java/com/qdesrame/openapi/diff/model/ComposedChanged.java new file mode 100644 index 000000000..faaf7ed61 --- /dev/null +++ b/src/main/java/com/qdesrame/openapi/diff/model/ComposedChanged.java @@ -0,0 +1,32 @@ +package com.qdesrame.openapi.diff.model; + +import java.util.List; +import java.util.Objects; +import javax.validation.constraints.NotNull; + +public interface ComposedChanged extends Changed { + + @NotNull + List getChangedElements(); + + @NotNull + DiffResult isCoreChanged(); + + @Override + default DiffResult isChanged() { + DiffResult elementsResult = + DiffResult.fromWeight( + getChangedElements() + .stream() + .filter(Objects::nonNull) + .map(Changed::isChanged) + .mapToInt(diffResult -> diffResult.getWeight()) + .max() + .orElseGet(() -> 0)); + if (isCoreChanged().getWeight() > elementsResult.getWeight()) { + return isCoreChanged(); + } else { + return elementsResult; + } + } +} diff --git a/src/main/java/com/qdesrame/openapi/diff/model/DiffResult.java b/src/main/java/com/qdesrame/openapi/diff/model/DiffResult.java index 680cb4347..7b7f66b55 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/DiffResult.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/DiffResult.java @@ -1,15 +1,33 @@ package com.qdesrame.openapi.diff.model; +import static java.lang.String.format; + public enum DiffResult { - NO_CHANGES("no_changes"), - COMPATIBLE("compatible"), - INCOMPATIBLE("incompatible"), - UNKNOWN("unknown"); + NO_CHANGES("no_changes", 0), + METADATA("metadata", 1), + COMPATIBLE("compatible", 2), + UNKNOWN("unknown", 3), + INCOMPATIBLE("incompatible", 4); private final String value; + private final int weight; - DiffResult(String value) { + DiffResult(String value, int weight) { this.value = value; + this.weight = weight; + } + + public static DiffResult fromWeight(int weight) { + for (DiffResult result : DiffResult.values()) { + if (weight == result.getWeight()) { + return result; + } + } + throw new IllegalArgumentException(format("Invalid weight from DiffResult: %d", weight)); + } + + public int getWeight() { + return this.weight; } public String getValue() { @@ -17,18 +35,22 @@ public String getValue() { } public boolean isUnchanged() { - return this.equals(NO_CHANGES); + return this.weight == 0; } public boolean isDifferent() { - return !this.equals(NO_CHANGES); + return this.weight > 0; } public boolean isIncompatible() { - return !this.equals(NO_CHANGES) && !this.equals(COMPATIBLE); + return this.weight > 2; } public boolean isCompatible() { - return this.equals(NO_CHANGES) || this.equals(COMPATIBLE); + return this.weight <= 2; + } + + public boolean isMetaChanged() { + return this.weight == 1; } } diff --git a/src/main/java/com/qdesrame/openapi/diff/model/schema/ChangedExtensions.java b/src/main/java/com/qdesrame/openapi/diff/model/schema/ChangedExtensions.java index 39e800202..3878babe6 100644 --- a/src/main/java/com/qdesrame/openapi/diff/model/schema/ChangedExtensions.java +++ b/src/main/java/com/qdesrame/openapi/diff/model/schema/ChangedExtensions.java @@ -1,16 +1,23 @@ package com.qdesrame.openapi.diff.model.schema; import com.qdesrame.openapi.diff.model.Changed; +import com.qdesrame.openapi.diff.model.ComposedChanged; import com.qdesrame.openapi.diff.model.DiffContext; import com.qdesrame.openapi.diff.model.DiffResult; +import java.util.Collection; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; import lombok.Getter; import lombok.Setter; +import lombok.experimental.Accessors; @Getter @Setter -public class ChangedExtensions implements Changed { +@Accessors +public class ChangedExtensions implements ComposedChanged { private final Map oldExtensions; private final Map newExtensions; private final DiffContext context; @@ -30,13 +37,15 @@ public ChangedExtensions( } @Override - public DiffResult isChanged() { - if (increased.isEmpty() && missing.isEmpty() && changed.isEmpty()) { - return DiffResult.NO_CHANGES; - } - if (changed.values().stream().allMatch(Changed::isCompatible)) { - return DiffResult.COMPATIBLE; - } - return DiffResult.INCOMPATIBLE; + public List getChangedElements() { + return Stream.of(increased, missing, changed) + .map(Map::values) + .flatMap(Collection::stream) + .collect(Collectors.toList()); + } + + @Override + public DiffResult isCoreChanged() { + return DiffResult.NO_CHANGES; } } diff --git a/src/main/java/com/qdesrame/openapi/diff/output/ConsoleRender.java b/src/main/java/com/qdesrame/openapi/diff/output/ConsoleRender.java index a74a68b67..6cbd9e6be 100644 --- a/src/main/java/com/qdesrame/openapi/diff/output/ConsoleRender.java +++ b/src/main/java/com/qdesrame/openapi/diff/output/ConsoleRender.java @@ -1,10 +1,13 @@ package com.qdesrame.openapi.diff.output; +import static com.qdesrame.openapi.diff.model.Changed.result; + import com.qdesrame.openapi.diff.model.*; import io.swagger.v3.oas.models.parameters.Parameter; import io.swagger.v3.oas.models.responses.ApiResponse; import java.util.List; import java.util.Map; +import java.util.Optional; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.lang3.StringUtils; @@ -58,29 +61,30 @@ private String ol_changed(List operations) { for (ChangedOperation operation : operations) { String pathUrl = operation.getPathUrl(); String method = operation.getHttpMethod().toString(); - String desc = operation.getSummary(); + String desc = + Optional.ofNullable(operation.getSummary()).map(ChangedMetadata::getRight).orElse(""); StringBuilder ul_detail = new StringBuilder(); - if (operation.isChangedParam().isDifferent()) { + if (result(operation.getParameters()).isDifferent()) { ul_detail .append(StringUtils.repeat(' ', 2)) .append("Parameter:") .append(System.lineSeparator()) - .append(ul_param(operation.getChangedParameters())); + .append(ul_param(operation.getParameters())); } - if (operation.isChangedRequest().isDifferent()) { + if (operation.resultRequestBody().isDifferent()) { ul_detail .append(StringUtils.repeat(' ', 2)) .append("Request:") .append(System.lineSeparator()) - .append(ul_content(operation.getChangedRequestBody().getChangedContent(), true)); + .append(ul_content(operation.getRequestBody().getContent(), true)); } - if (operation.isChangedResponse().isDifferent()) { + if (operation.resultApiResponses().isDifferent()) { ul_detail .append(StringUtils.repeat(' ', 2)) .append("Return Type:") .append(System.lineSeparator()) - .append(ul_response(operation.getChangedApiResponse())); + .append(ul_response(operation.getApiResponses())); } sb.append(itemEndpoint(method, pathUrl, desc)).append(ul_detail); } @@ -88,9 +92,9 @@ private String ol_changed(List operations) { } private String ul_response(ChangedApiResponse changedApiResponse) { - Map addResponses = changedApiResponse.getAddResponses(); - Map delResponses = changedApiResponse.getMissingResponses(); - Map changedResponses = changedApiResponse.getChangedResponses(); + Map addResponses = changedApiResponse.getIncreased(); + Map delResponses = changedApiResponse.getMissing(); + Map changedResponses = changedApiResponse.getChanged(); StringBuilder sb = new StringBuilder(); for (String propName : addResponses.keySet()) { sb.append(itemResponse("Add ", propName)); @@ -124,7 +128,7 @@ private String itemChangedResponse(String title, String contentType, ChangedResp StringBuilder sb = new StringBuilder(); sb.append(itemResponse(title, contentType)); sb.append(StringUtils.repeat(' ', 6)).append("Media types:").append(System.lineSeparator()); - sb.append(ul_content(response.getChangedContent(), false)); + sb.append(ul_content(response.getContent(), false)); return sb.toString(); } diff --git a/src/main/java/com/qdesrame/openapi/diff/output/HtmlRender.java b/src/main/java/com/qdesrame/openapi/diff/output/HtmlRender.java index bc4b19896..b2c0d3516 100644 --- a/src/main/java/com/qdesrame/openapi/diff/output/HtmlRender.java +++ b/src/main/java/com/qdesrame/openapi/diff/output/HtmlRender.java @@ -1,5 +1,6 @@ package com.qdesrame.openapi.diff.output; +import static com.qdesrame.openapi.diff.model.Changed.result; import static j2html.TagCreator.*; import com.qdesrame.openapi.diff.model.*; @@ -9,6 +10,7 @@ import j2html.tags.ContainerTag; import java.util.List; import java.util.Map; +import java.util.Optional; public class HtmlRender implements Render { @@ -116,22 +118,25 @@ private ContainerTag ol_changed(List changedOperations) { for (ChangedOperation changedOperation : changedOperations) { String pathUrl = changedOperation.getPathUrl(); String method = changedOperation.getHttpMethod().toString(); - String desc = changedOperation.getSummary(); + String desc = + Optional.ofNullable(changedOperation.getSummary()) + .map(ChangedMetadata::getRight) + .orElse(""); ContainerTag ul_detail = ul().withClass("detail"); - if (changedOperation.isChangedParam().isDifferent()) { + if (result(changedOperation.getParameters()).isDifferent()) { ul_detail.with( - li().with(h3("Parameters")).with(ul_param(changedOperation.getChangedParameters()))); + li().with(h3("Parameters")).with(ul_param(changedOperation.getParameters()))); } - if (changedOperation.isChangedRequest().isDifferent()) { + if (changedOperation.resultRequestBody().isDifferent()) { ul_detail.with( li().with(h3("Request")) - .with(ul_request(changedOperation.getChangedRequestBody().getChangedContent()))); + .with(ul_request(changedOperation.getRequestBody().getContent()))); } else { } - if (changedOperation.isChangedResponse().isDifferent()) { + if (changedOperation.resultApiResponses().isDifferent()) { ul_detail.with( - li().with(h3("Response")).with(ul_response(changedOperation.getChangedApiResponse()))); + li().with(h3("Response")).with(ul_response(changedOperation.getApiResponses()))); } ol.with( li().with(span(method).withClass(method)) @@ -143,9 +148,9 @@ private ContainerTag ol_changed(List changedOperations) { } private ContainerTag ul_response(ChangedApiResponse changedApiResponse) { - Map addResponses = changedApiResponse.getAddResponses(); - Map delResponses = changedApiResponse.getMissingResponses(); - Map changedResponses = changedApiResponse.getChangedResponses(); + Map addResponses = changedApiResponse.getIncreased(); + Map delResponses = changedApiResponse.getMissing(); + Map changedResponses = changedApiResponse.getChanged(); ContainerTag ul = ul().withClass("change response"); for (String propName : addResponses.keySet()) { ul.with(li_addResponse(propName, addResponses.get(propName))); @@ -181,7 +186,7 @@ private ContainerTag li_changedResponse(String name, ChangedResponse response) { ? "" : ("//" + response.getNewApiResponse().getDescription())) .withClass("comment")) - .with(ul_request(response.getChangedContent())); + .with(ul_request(response.getContent())); } private ContainerTag ul_request(ChangedContent changedContent) { @@ -210,7 +215,7 @@ private ContainerTag li_missingRequest(String name, MediaType request) { private ContainerTag li_changedRequest(String name, ChangedMediaType request) { return li().withText(String.format("Changed body: '%s'", name)) - .with(div_changedSchema(request.getChangedSchema())); + .with(div_changedSchema(request.getSchema())); } private ContainerTag div_changedSchema(ChangedSchema schema) { @@ -270,7 +275,7 @@ private ContainerTag li_changedParam(ChangedParameter changeParam) { return li_deprecatedParam(changeParam); } boolean changeRequired = changeParam.isChangeRequired(); - boolean changeDescription = changeParam.isChangeDescription(); + boolean changeDescription = changeParam.getDescription().isDifferent(); Parameter rightParam = changeParam.getNewParameter(); Parameter leftParam = changeParam.getNewParameter(); ContainerTag li = li().withText(changeParam.getName() + " in " + changeParam.getIn()); diff --git a/src/main/java/com/qdesrame/openapi/diff/output/MarkdownRender.java b/src/main/java/com/qdesrame/openapi/diff/output/MarkdownRender.java index ddc9b9d5a..5a599abdc 100644 --- a/src/main/java/com/qdesrame/openapi/diff/output/MarkdownRender.java +++ b/src/main/java/com/qdesrame/openapi/diff/output/MarkdownRender.java @@ -1,5 +1,7 @@ package com.qdesrame.openapi.diff.output; +import static com.qdesrame.openapi.diff.model.Changed.result; +import static com.qdesrame.openapi.diff.utils.ChangedUtils.isUnchanged; import static java.lang.String.format; import com.qdesrame.openapi.diff.model.*; @@ -14,6 +16,8 @@ import io.swagger.v3.oas.models.responses.ApiResponse; import java.util.List; import java.util.Map; +import lombok.Getter; +import lombok.Setter; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -36,6 +40,12 @@ public class MarkdownRender implements Render { protected final String HR = "---\n"; protected ChangedOpenApi diff; + /** + * A paramater which indicates whether or not metadata (summary and metadata) changes should be + * logged in the changelog file. + */ + @Getter @Setter protected boolean showChangedMetadata; + public MarkdownRender() {} public String render(ChangedOpenApi diff) { @@ -61,7 +71,11 @@ protected String listEndpoints(String title, List endpoints) { } protected String itemEndpoint(String method, String path, String summary) { - return H5 + CODE + method + CODE + " " + path + "\n\n" + description(summary) + "\n"; + return H5 + CODE + method + CODE + " " + path + "\n\n" + metadata(summary) + "\n"; + } + + protected String itemEndpoint(String method, String path, ChangedMetadata summary) { + return H5 + CODE + method + CODE + " " + path + "\n\n" + metadata("summary", summary) + "\n"; } protected String titleH5(String title) { @@ -82,20 +96,20 @@ protected String listEndpoints(List changedOperations) { operation.getHttpMethod().toString(), operation.getPathUrl(), operation.getSummary())); - if (operation.isChangedParam().isDifferent()) { + if (result(operation.getParameters()).isDifferent()) { details .append(titleH5("Parameters:")) - .append(parameters(operation.getChangedParameters())); + .append(parameters(operation.getParameters())); } - if (operation.isChangedRequest().isDifferent()) { + if (operation.resultRequestBody().isDifferent()) { details .append(titleH5("Request:")) - .append(bodyContent(operation.getChangedRequestBody().getChangedContent())); + .append(bodyContent(operation.getRequestBody().getContent())); } - if (operation.isChangedResponse().isDifferent()) { + if (operation.resultApiResponses().isDifferent()) { details .append(titleH5("Return Type:")) - .append(responses(operation.getChangedApiResponse())); + .append(responses(operation.getApiResponses())); } return details.toString(); }) @@ -105,10 +119,10 @@ protected String listEndpoints(List changedOperations) { protected String responses(ChangedApiResponse changedApiResponse) { StringBuilder sb = new StringBuilder("\n"); - sb.append(listResponse("New response", changedApiResponse.getAddResponses())); - sb.append(listResponse("Deleted response", changedApiResponse.getMissingResponses())); + sb.append(listResponse("New response", changedApiResponse.getIncreased())); + sb.append(listResponse("Deleted response", changedApiResponse.getMissing())); changedApiResponse - .getChangedResponses() + .getChanged() .entrySet() .stream() .map(e -> this.itemResponse(e.getKey(), e.getValue())) @@ -139,9 +153,9 @@ protected String itemResponse(String code, ChangedResponse response) { null == response.getNewApiResponse() ? "" : response.getNewApiResponse().getDescription())); - sb.append(headers(response.getChangedHeaders())); - if (response.getChangedContent() != null) { - sb.append(this.bodyContent(LI, response.getChangedContent())); + sb.append(headers(response.getHeaders())); + if (response.getContent() != null) { + sb.append(this.bodyContent(LI, response.getContent())); } return sb.toString(); } @@ -153,7 +167,7 @@ protected String itemResponse(String title, String code, String description) { status = HttpStatus.getStatusText(Integer.parseInt(code)); } sb.append(format("%s : **%s %s**\n", title, code, status)); - sb.append(description(description)); + sb.append(metadata(description)); return sb.toString(); } @@ -194,7 +208,7 @@ protected String itemHeader(String code, ChangedHeader header) { } protected String itemHeader(String title, String mediaType, String description) { - return format("%s : `%s`\n\n", title, mediaType) + description(description) + '\n'; + return format("%s : `%s`\n\n", title, mediaType) + metadata(description) + '\n'; } protected String bodyContent(String prefix, ChangedContent changedContent) { @@ -239,8 +253,7 @@ protected String itemContent(String title, String mediaType, MediaType content) } protected String itemContent(int deepness, String mediaType, ChangedMediaType content) { - return itemContent("Changed content type", mediaType) - + schema(deepness, content.getChangedSchema()); + return itemContent("Changed content type", mediaType) + schema(deepness, content.getSchema()); } protected String schema(ChangedSchema schema) { @@ -250,18 +263,18 @@ protected String schema(ChangedSchema schema) { protected String oneOfSchema(int deepness, ChangedOneOfSchema schema, String discriminator) { StringBuilder sb = new StringBuilder(); schema - .getMissingMapping() + .getMissing() .keySet() .forEach( key -> sb.append(format("%sDeleted '%s' %s\n", indent(deepness), key, discriminator))); schema - .getIncreasedMapping() + .getIncreased() .forEach( (key, sub) -> sb.append(format("%sAdded '%s' %s:\n", indent(deepness), key, discriminator)) .append(schema(deepness, sub, schema.getContext()))); schema - .getChangedMapping() + .getChanged() .forEach( (key, sub) -> sb.append(format("%sUpdated `%s` %s:\n", indent(deepness), key, discriminator)) @@ -284,12 +297,12 @@ protected String schema(int deepness, ChangedSchema schema) { if (schema.isDiscriminatorPropertyChanged()) { LOGGER.debug("Discriminator property changed"); } - if (schema.getChangedOneOfSchema() != null) { + if (schema.getOneOfSchema() != null) { String discriminator = schema.getNewSchema().getDiscriminator() != null ? schema.getNewSchema().getDiscriminator().getPropertyName() : ""; - sb.append(oneOfSchema(deepness, schema.getChangedOneOfSchema(), discriminator)); + sb.append(oneOfSchema(deepness, schema.getOneOfSchema(), discriminator)); } if (schema.getChangeRequired() != null) { sb.append( @@ -297,8 +310,8 @@ protected String schema(int deepness, ChangedSchema schema) { sb.append( required(deepness, "New optional properties", schema.getChangeRequired().getMissing())); } - if (schema.getChangedItems() != null) { - sb.append(items(deepness, schema.getChangedItems())); + if (schema.getItems() != null) { + sb.append(items(deepness, schema.getItems())); } sb.append(listDiff(deepness, "enum", schema.getChangeEnum())); sb.append( @@ -374,7 +387,7 @@ protected String items(int deepness, Schema schema, DiffContext context) { protected String items(int deepness, String title, String type, String description) { return format( "%s%s (%s):" + "\n%s\n", - indent(deepness), title, type, description(indent(deepness + 1), description)); + indent(deepness), title, type, metadata(indent(deepness + 1), description)); } protected String properties( @@ -416,7 +429,7 @@ protected String property( int deepness, String title, String name, String type, String description) { return format( "%s* %s `%s` (%s)\n%s\n", - indent(deepness), title, name, type, description(indent(deepness + 1), description)); + indent(deepness), title, name, type, metadata(indent(deepness + 1), description)); } protected String listDiff(int deepness, String name, ListDiff listDiff) { @@ -462,7 +475,7 @@ protected String itemParameter(String title, String name, String in, String desc + " in " + code(in) + '\n' - + description(description) + + metadata(description) + '\n'; } @@ -480,20 +493,50 @@ protected String code(String string) { return CODE + string + CODE; } - protected String description(String description) { - return description("", description); + protected String metadata(String name, ChangedMetadata changedMetadata) { + return metadata("", name, changedMetadata); } - protected String description(String beginning, String description) { - String result = ""; - if (StringUtils.isBlank(description)) { - description = ""; + protected String metadata(String beginning, String name, ChangedMetadata changedMetadata) { + if (changedMetadata == null) { + return ""; } - String blockquote = beginning + BLOCKQUOTE; - if (!description.equals("")) { - result = blockquote + description.trim().replaceAll("\n", "\n" + blockquote) + '\n'; + if (isUnchanged(changedMetadata) && showChangedMetadata) { + return format( + "Changed %s:\n%s\nto:\n%s\n\n", + name, + metadata(beginning, changedMetadata.getLeft()), + metadata(beginning, changedMetadata.getRight())); + } else { + return metadata(beginning, name, changedMetadata.getRight()); } - return result; + } + + protected String metadata(String metadata) { + return metadata("", metadata); + } + + protected String metadata(String beginning, String name, String metadata) { + if (StringUtils.isBlank(metadata)) { + return ""; + } + return blockquote(beginning, metadata); + } + + protected String metadata(String beginning, String metadata) { + if (StringUtils.isBlank(metadata)) { + return ""; + } + return blockquote(beginning, metadata); + } + + protected String blockquote(String beginning) { + return beginning + BLOCKQUOTE; + } + + protected String blockquote(String beginning, String text) { + String blockquote = blockquote(beginning); + return blockquote + text.trim().replaceAll("\n", "\n" + blockquote) + '\n'; } protected String type(Schema schema) { diff --git a/src/test/java/com/qdesrame/openapi/test/AddPropDiffTest.java b/src/test/java/com/qdesrame/openapi/test/AddPropDiffTest.java index f827c60db..68d939664 100644 --- a/src/test/java/com/qdesrame/openapi/test/AddPropDiffTest.java +++ b/src/test/java/com/qdesrame/openapi/test/AddPropDiffTest.java @@ -3,7 +3,7 @@ import static com.qdesrame.openapi.test.TestUtils.assertOpenApiAreEquals; import static com.qdesrame.openapi.test.TestUtils.assertOpenApiBackwardIncompatible; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** Created by adarsh.sharma on 26/02/18. */ public class AddPropDiffTest { diff --git a/src/test/java/com/qdesrame/openapi/test/AllOfDiffTest.java b/src/test/java/com/qdesrame/openapi/test/AllOfDiffTest.java index 122a8a823..b72e60dd2 100644 --- a/src/test/java/com/qdesrame/openapi/test/AllOfDiffTest.java +++ b/src/test/java/com/qdesrame/openapi/test/AllOfDiffTest.java @@ -3,7 +3,7 @@ import static com.qdesrame.openapi.test.TestUtils.assertOpenApiAreEquals; import static com.qdesrame.openapi.test.TestUtils.assertOpenApiChangedEndpoints; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** Created by adarsh.sharma on 19/12/17. */ public class AllOfDiffTest { diff --git a/src/test/java/com/qdesrame/openapi/test/ArrayDiffTest.java b/src/test/java/com/qdesrame/openapi/test/ArrayDiffTest.java index b5fe7b824..56a64cd24 100644 --- a/src/test/java/com/qdesrame/openapi/test/ArrayDiffTest.java +++ b/src/test/java/com/qdesrame/openapi/test/ArrayDiffTest.java @@ -3,7 +3,7 @@ import static com.qdesrame.openapi.test.TestUtils.assertOpenApiAreEquals; import static com.qdesrame.openapi.test.TestUtils.assertOpenApiChangedEndpoints; -import org.junit.Test; +import org.junit.jupiter.api.Test; public class ArrayDiffTest { diff --git a/src/test/java/com/qdesrame/openapi/test/BackwardCompatibilityTest.java b/src/test/java/com/qdesrame/openapi/test/BackwardCompatibilityTest.java index c1fc41c3d..cb0ca2e1c 100644 --- a/src/test/java/com/qdesrame/openapi/test/BackwardCompatibilityTest.java +++ b/src/test/java/com/qdesrame/openapi/test/BackwardCompatibilityTest.java @@ -3,7 +3,7 @@ import static com.qdesrame.openapi.test.TestUtils.assertOpenApiBackwardCompatible; import static com.qdesrame.openapi.test.TestUtils.assertOpenApiBackwardIncompatible; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** Created by adarsh.sharma on 24/12/17. */ public class BackwardCompatibilityTest { diff --git a/src/test/java/com/qdesrame/openapi/test/ContentDiffTest.java b/src/test/java/com/qdesrame/openapi/test/ContentDiffTest.java index 9023a640f..f075124f8 100644 --- a/src/test/java/com/qdesrame/openapi/test/ContentDiffTest.java +++ b/src/test/java/com/qdesrame/openapi/test/ContentDiffTest.java @@ -1,9 +1,10 @@ package com.qdesrame.openapi.test; +import static org.assertj.core.api.Assertions.assertThat; + import com.qdesrame.openapi.diff.OpenApiCompare; import com.qdesrame.openapi.diff.model.ChangedOpenApi; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; public class ContentDiffTest { @@ -13,18 +14,18 @@ public class ContentDiffTest { @Test public void testContentDiffWithOneEmptyMediaType() { ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); - Assert.assertTrue(changedOpenApi.isIncompatible()); + assertThat(changedOpenApi.isIncompatible()).isTrue(); } @Test public void testContentDiffWithEmptyMediaTypes() { ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC1); - Assert.assertTrue(changedOpenApi.isUnchanged()); + assertThat(changedOpenApi.isUnchanged()).isTrue(); } @Test public void testSameContentDiff() { ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC2, OPENAPI_DOC2); - Assert.assertTrue(changedOpenApi.isUnchanged()); + assertThat(changedOpenApi.isUnchanged()).isTrue(); } } diff --git a/src/test/java/com/qdesrame/openapi/test/OneOfDiffTest.java b/src/test/java/com/qdesrame/openapi/test/OneOfDiffTest.java index fc12d10ba..5f6779454 100644 --- a/src/test/java/com/qdesrame/openapi/test/OneOfDiffTest.java +++ b/src/test/java/com/qdesrame/openapi/test/OneOfDiffTest.java @@ -4,7 +4,7 @@ import static com.qdesrame.openapi.test.TestUtils.assertOpenApiBackwardIncompatible; import static com.qdesrame.openapi.test.TestUtils.assertOpenApiChangedEndpoints; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** Created by adarsh.sharma on 19/12/17. */ public class OneOfDiffTest { diff --git a/src/test/java/com/qdesrame/openapi/test/OpenApiDiffTest.java b/src/test/java/com/qdesrame/openapi/test/OpenApiDiffTest.java index 6a4f2a339..379737bc3 100644 --- a/src/test/java/com/qdesrame/openapi/test/OpenApiDiffTest.java +++ b/src/test/java/com/qdesrame/openapi/test/OpenApiDiffTest.java @@ -1,6 +1,7 @@ package com.qdesrame.openapi.test; import static com.qdesrame.openapi.test.TestUtils.assertOpenApiAreEquals; +import static org.assertj.core.api.Assertions.assertThat; import com.qdesrame.openapi.diff.OpenApiCompare; import com.qdesrame.openapi.diff.model.ChangedOpenApi; @@ -11,15 +12,14 @@ import java.io.FileWriter; import java.io.IOException; import java.util.List; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; public class OpenApiDiffTest { + final String SWAGGER_V2_HTTP = "http://petstore.swagger.io/v2/swagger.json"; private final String OPENAPI_DOC1 = "petstore_v2_1.yaml"; private final String OPENAPI_DOC2 = "petstore_v2_2.yaml"; private final String OPENAPI_EMPTY_DOC = "petstore_v2_empty.yaml"; - final String SWAGGER_V2_HTTP = "http://petstore.swagger.io/v2/swagger.json"; @Test public void testEqual() { @@ -44,9 +44,9 @@ public void testNewApi() { } catch (IOException e) { e.printStackTrace(); } - Assert.assertTrue(newEndpoints.size() > 0); - Assert.assertTrue(missingEndpoints.isEmpty()); - Assert.assertTrue(changedEndPoints.isEmpty()); + assertThat(newEndpoints).isNotEmpty(); + assertThat(missingEndpoints).isEmpty(); + assertThat(changedEndPoints).isEmpty(); } @Test @@ -67,9 +67,9 @@ public void testDeprecatedApi() { } catch (IOException e) { e.printStackTrace(); } - Assert.assertTrue(newEndpoints.isEmpty()); - Assert.assertTrue(missingEndpoints.size() > 0); - Assert.assertTrue(changedEndPoints.isEmpty()); + assertThat(newEndpoints).isEmpty(); + assertThat(missingEndpoints).isNotEmpty(); + assertThat(changedEndPoints).isEmpty(); } @Test @@ -87,7 +87,7 @@ public void testDiff() { } catch (IOException e) { e.printStackTrace(); } - Assert.assertFalse(changedEndPoints.isEmpty()); + assertThat(changedEndPoints).isNotEmpty(); } @Test diff --git a/src/test/java/com/qdesrame/openapi/test/ParameterDiffTest.java b/src/test/java/com/qdesrame/openapi/test/ParameterDiffTest.java index f79a40898..cc054b542 100644 --- a/src/test/java/com/qdesrame/openapi/test/ParameterDiffTest.java +++ b/src/test/java/com/qdesrame/openapi/test/ParameterDiffTest.java @@ -2,7 +2,7 @@ import static com.qdesrame.openapi.test.TestUtils.assertOpenApiChangedEndpoints; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** Created by adarsh.sharma on 03/01/18. */ public class ParameterDiffTest { diff --git a/src/test/java/com/qdesrame/openapi/test/PathDiffTest.java b/src/test/java/com/qdesrame/openapi/test/PathDiffTest.java index 66d653a64..5422f2057 100644 --- a/src/test/java/com/qdesrame/openapi/test/PathDiffTest.java +++ b/src/test/java/com/qdesrame/openapi/test/PathDiffTest.java @@ -1,8 +1,9 @@ package com.qdesrame.openapi.test; import static com.qdesrame.openapi.test.TestUtils.assertOpenApiAreEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; -import org.junit.Test; +import org.junit.jupiter.api.Test; public class PathDiffTest { @@ -15,8 +16,9 @@ public void testEqual() { assertOpenApiAreEquals(OPENAPI_PATH1, OPENAPI_PATH2); } - @Test(expected = IllegalArgumentException.class) + @Test public void testMultiplePathWithSameSignature() { - assertOpenApiAreEquals(OPENAPI_PATH3, OPENAPI_PATH3); + assertThrows( + IllegalArgumentException.class, () -> assertOpenApiAreEquals(OPENAPI_PATH3, OPENAPI_PATH3)); } } diff --git a/src/test/java/com/qdesrame/openapi/test/RecursiveSchemaTest.java b/src/test/java/com/qdesrame/openapi/test/RecursiveSchemaTest.java index c9c6f1a3d..9e70469af 100644 --- a/src/test/java/com/qdesrame/openapi/test/RecursiveSchemaTest.java +++ b/src/test/java/com/qdesrame/openapi/test/RecursiveSchemaTest.java @@ -3,7 +3,7 @@ import static com.qdesrame.openapi.test.TestUtils.assertOpenApiAreEquals; import static com.qdesrame.openapi.test.TestUtils.assertOpenApiBackwardIncompatible; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** Created by adarsh.sharma on 13/02/18. */ public class RecursiveSchemaTest { diff --git a/src/test/java/com/qdesrame/openapi/test/ReferenceDiffCacheTest.java b/src/test/java/com/qdesrame/openapi/test/ReferenceDiffCacheTest.java index bfa09e005..93fe063df 100644 --- a/src/test/java/com/qdesrame/openapi/test/ReferenceDiffCacheTest.java +++ b/src/test/java/com/qdesrame/openapi/test/ReferenceDiffCacheTest.java @@ -2,7 +2,7 @@ import static com.qdesrame.openapi.test.TestUtils.assertOpenApiAreEquals; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** Created by adarsh.sharma on 25/12/17. */ public class ReferenceDiffCacheTest { diff --git a/src/test/java/com/qdesrame/openapi/test/RequestDiffTest.java b/src/test/java/com/qdesrame/openapi/test/RequestDiffTest.java index 0e6ee442a..53de142fb 100644 --- a/src/test/java/com/qdesrame/openapi/test/RequestDiffTest.java +++ b/src/test/java/com/qdesrame/openapi/test/RequestDiffTest.java @@ -2,7 +2,7 @@ import static com.qdesrame.openapi.test.TestUtils.assertOpenApiChangedEndpoints; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** Created by adarsh.sharma on 03/01/18. */ public class RequestDiffTest { diff --git a/src/test/java/com/qdesrame/openapi/test/ResponseHeaderDiffTest.java b/src/test/java/com/qdesrame/openapi/test/ResponseHeaderDiffTest.java index 0b6fdf74f..7a1462a46 100644 --- a/src/test/java/com/qdesrame/openapi/test/ResponseHeaderDiffTest.java +++ b/src/test/java/com/qdesrame/openapi/test/ResponseHeaderDiffTest.java @@ -1,12 +1,13 @@ package com.qdesrame.openapi.test; +import static org.assertj.core.api.Assertions.assertThat; + import com.qdesrame.openapi.diff.OpenApiCompare; import com.qdesrame.openapi.diff.model.ChangedHeaders; import com.qdesrame.openapi.diff.model.ChangedOpenApi; import com.qdesrame.openapi.diff.model.ChangedResponse; import java.util.Map; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** Created by adarsh.sharma on 28/12/17. */ public class ResponseHeaderDiffTest { @@ -18,18 +19,18 @@ public class ResponseHeaderDiffTest { public void testDiffDifferent() { ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); - Assert.assertTrue(changedOpenApi.getNewEndpoints().isEmpty()); - Assert.assertTrue(changedOpenApi.getMissingEndpoints().isEmpty()); - Assert.assertTrue(changedOpenApi.getChangedOperations().size() > 0); + assertThat(changedOpenApi.getNewEndpoints()).isEmpty(); + assertThat(changedOpenApi.getMissingEndpoints()).isEmpty(); + assertThat(changedOpenApi.getChangedOperations()).isNotEmpty(); Map changedResponses = - changedOpenApi.getChangedOperations().get(0).getChangedApiResponse().getChangedResponses(); - Assert.assertTrue(changedResponses.size() > 0); - Assert.assertTrue(changedResponses.containsKey("200")); - ChangedHeaders changedHeaders = changedResponses.get("200").getChangedHeaders(); - Assert.assertTrue(changedHeaders.isDifferent()); - Assert.assertTrue(changedHeaders.getChanged().size() == 1); - Assert.assertTrue(changedHeaders.getIncreased().size() == 1); - Assert.assertTrue(changedHeaders.getMissing().size() == 1); + changedOpenApi.getChangedOperations().get(0).getApiResponses().getChanged(); + assertThat(changedResponses).isNotEmpty(); + assertThat(changedResponses).containsKey("200"); + ChangedHeaders changedHeaders = changedResponses.get("200").getHeaders(); + assertThat(changedHeaders.isDifferent()).isTrue(); + assertThat(changedHeaders.getChanged()).hasSize(1); + assertThat(changedHeaders.getIncreased()).hasSize(1); + assertThat(changedHeaders.getMissing()).hasSize(1); } } diff --git a/src/test/java/com/qdesrame/openapi/test/SecurityDiffTest.java b/src/test/java/com/qdesrame/openapi/test/SecurityDiffTest.java index ac7c002a5..22cf91fee 100644 --- a/src/test/java/com/qdesrame/openapi/test/SecurityDiffTest.java +++ b/src/test/java/com/qdesrame/openapi/test/SecurityDiffTest.java @@ -1,11 +1,12 @@ package com.qdesrame.openapi.test; -import static org.junit.Assert.*; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; import com.qdesrame.openapi.diff.OpenApiCompare; import com.qdesrame.openapi.diff.model.*; import io.swagger.v3.oas.models.security.SecurityRequirement; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** Created by adarsh.sharma on 06/01/18. */ public class SecurityDiffTest { @@ -17,7 +18,7 @@ public class SecurityDiffTest { public void testDiffDifferent() { ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); - assertTrue(changedOpenApi.getChangedOperations().size() == 3); + assertThat(changedOpenApi.getChangedOperations().size() == 3); ChangedOperation changedOperation1 = changedOpenApi @@ -26,22 +27,28 @@ public void testDiffDifferent() { .filter(x -> x.getPathUrl().equals("/pet/{petId}")) .findFirst() .get(); - assertNotNull(changedOperation1); - assertFalse(changedOperation1.isCompatible()); + assertThat(changedOperation1).isNotNull(); + assertThat(changedOperation1.isCompatible()).isFalse(); ChangedSecurityRequirements changedSecurityRequirements1 = - changedOperation1.getChangedSecurityRequirements(); - assertNotNull(changedSecurityRequirements1); - assertFalse(changedSecurityRequirements1.isCompatible()); - assertTrue(changedSecurityRequirements1.getIncreased().size() == 1); - assertTrue(changedSecurityRequirements1.getChanged().size() == 1); + changedOperation1.getSecurityRequirements(); + assertThat(changedSecurityRequirements1).isNotNull(); + assertThat(changedSecurityRequirements1.isCompatible()).isFalse(); + assertThat(changedSecurityRequirements1.getIncreased()).hasSize(1); + assertThat(changedSecurityRequirements1.getChanged()).hasSize(1); ChangedSecurityRequirement changedSecurityRequirement1 = changedSecurityRequirements1.getChanged().get(0); - assertTrue(changedSecurityRequirement1.getChanged().size() == 1); + assertThat(changedSecurityRequirement1.getChanged()).hasSize(1); ListDiff changedScopes1 = changedSecurityRequirement1.getChanged().get(0).getChangedScopes(); - assertNotNull(changedScopes1); - assertTrue(changedScopes1.getIncreased().size() == 1); - assertTrue(changedScopes1.getIncreased().get(0).equals("read:pets")); + assertThat(changedScopes1) + .isNotNull() + .satisfies( + stringListDiff -> + assertThat(stringListDiff.getIncreased()) + .hasSize(1) + .first() + .asString() + .isEqualTo("read:pets")); ChangedOperation changedOperation2 = changedOpenApi @@ -50,24 +57,20 @@ public void testDiffDifferent() { .filter(x -> x.getPathUrl().equals("/pet3")) .findFirst() .get(); - assertNotNull(changedOperation2); - assertFalse(changedOperation2.isCompatible()); + assertThat(changedOperation2).isNotNull(); + assertThat(changedOperation2.isCompatible()).isFalse(); ChangedSecurityRequirements changedSecurityRequirements2 = - changedOperation2.getChangedSecurityRequirements(); - assertNotNull(changedSecurityRequirements2); - assertFalse(changedSecurityRequirements2.isCompatible()); - assertTrue(changedSecurityRequirements2.getChanged().size() == 1); + changedOperation2.getSecurityRequirements(); + assertThat(changedSecurityRequirements2).isNotNull(); + assertThat(changedSecurityRequirements2.isCompatible()).isFalse(); + assertThat(changedSecurityRequirements2.getChanged()).hasSize(1); ChangedSecurityRequirement changedSecurityRequirement2 = changedSecurityRequirements2.getChanged().get(0); - assertTrue(changedSecurityRequirement2.getChanged().size() == 1); + assertThat(changedSecurityRequirement2.getChanged()).hasSize(1); ChangedOAuthFlow changedImplicitOAuthFlow2 = - changedSecurityRequirement2 - .getChanged() - .get(0) - .getChangedOAuthFlows() - .getChangedImplicitOAuthFlow(); - assertNotNull(changedImplicitOAuthFlow2); - assertTrue(changedImplicitOAuthFlow2.isChangedAuthorizationUrl()); + changedSecurityRequirement2.getChanged().get(0).getOAuthFlows().getImplicitOAuthFlow(); + assertThat(changedImplicitOAuthFlow2).isNotNull(); + assertThat(changedImplicitOAuthFlow2.isAuthorizationUrl()).isTrue(); ChangedOperation changedOperation3 = changedOpenApi @@ -76,19 +79,22 @@ public void testDiffDifferent() { .filter(x -> x.getPathUrl().equals("/pet/findByStatus2")) .findFirst() .get(); - assertNotNull(changedOperation3); - assertTrue(changedOperation3.isCompatible()); + assertThat(changedOperation3).isNotNull(); + assertThat(changedOperation3.isCompatible()).isTrue(); ChangedSecurityRequirements changedSecurityRequirements3 = - changedOperation3.getChangedSecurityRequirements(); - assertNotNull(changedSecurityRequirements3); - assertTrue(changedSecurityRequirements3.getIncreased().size() == 1); + changedOperation3.getSecurityRequirements(); + assertThat(changedSecurityRequirements3).isNotNull(); + assertThat(changedSecurityRequirements3.getIncreased()).hasSize(1); SecurityRequirement securityRequirement3 = changedSecurityRequirements3.getIncreased().get(0); - assertTrue(securityRequirement3.size() == 1); - assertTrue(securityRequirement3.get("petstore_auth").size() == 2); + assertThat(securityRequirement3) + .hasSize(1) + .hasEntrySatisfying("petstore_auth", values -> assertThat(values).hasSize(2)); } - @Test(expected = IllegalArgumentException.class) + @Test public void testWithUnknownSecurityScheme() { - OpenApiCompare.fromLocations(OPENAPI_DOC3, OPENAPI_DOC3); + assertThrows( + IllegalArgumentException.class, + () -> OpenApiCompare.fromLocations(OPENAPI_DOC3, OPENAPI_DOC3)); } } diff --git a/src/test/java/com/qdesrame/openapi/test/TestUtils.java b/src/test/java/com/qdesrame/openapi/test/TestUtils.java index a763d66f2..aaa947d14 100644 --- a/src/test/java/com/qdesrame/openapi/test/TestUtils.java +++ b/src/test/java/com/qdesrame/openapi/test/TestUtils.java @@ -1,10 +1,10 @@ package com.qdesrame.openapi.test; +import static org.assertj.core.api.Assertions.assertThat; import static org.slf4j.LoggerFactory.getLogger; import com.qdesrame.openapi.diff.OpenApiCompare; import com.qdesrame.openapi.diff.model.ChangedOpenApi; -import org.junit.Assert; import org.slf4j.Logger; public class TestUtils { @@ -13,29 +13,29 @@ public class TestUtils { public static void assertOpenApiAreEquals(String oldSpec, String newSpec) { ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(oldSpec, newSpec); LOG.info("Result: {}", changedOpenApi.isChanged().getValue()); - Assert.assertTrue(changedOpenApi.getNewEndpoints().isEmpty()); - Assert.assertTrue(changedOpenApi.getMissingEndpoints().isEmpty()); - Assert.assertTrue(changedOpenApi.getChangedOperations().isEmpty()); + assertThat(changedOpenApi.getNewEndpoints()).isEmpty(); + assertThat(changedOpenApi.getMissingEndpoints()).isEmpty(); + assertThat(changedOpenApi.getChangedOperations()).isEmpty(); } public static void assertOpenApiChangedEndpoints(String oldSpec, String newSpec) { ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(oldSpec, newSpec); LOG.info("Result: {}", changedOpenApi.isChanged().getValue()); - Assert.assertTrue(changedOpenApi.getNewEndpoints().isEmpty()); - Assert.assertTrue(changedOpenApi.getMissingEndpoints().isEmpty()); - Assert.assertTrue(changedOpenApi.getChangedOperations().size() > 0); + assertThat(changedOpenApi.getNewEndpoints()).isEmpty(); + assertThat(changedOpenApi.getMissingEndpoints()).isEmpty(); + assertThat(changedOpenApi.getChangedOperations()).isNotEmpty(); } public static void assertOpenApiBackwardCompatible( String oldSpec, String newSpec, boolean isDiff) { ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(oldSpec, newSpec); LOG.info("Result: {}", changedOpenApi.isChanged().getValue()); - Assert.assertTrue(changedOpenApi.isCompatible()); + assertThat(changedOpenApi.isCompatible()).isTrue(); } public static void assertOpenApiBackwardIncompatible(String oldSpec, String newSpec) { ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(oldSpec, newSpec); LOG.info("Result: {}", changedOpenApi.isChanged().getValue()); - Assert.assertTrue(changedOpenApi.isIncompatible()); + assertThat(changedOpenApi.isIncompatible()).isTrue(); } } diff --git a/src/test/resources/content_diff_1.yaml b/src/test/resources/content_diff_1.yaml index 3ca5d6f7d..f51b5c5ca 100644 --- a/src/test/resources/content_diff_1.yaml +++ b/src/test/resources/content_diff_1.yaml @@ -2,7 +2,7 @@ openapi: "3.0.1" info: title: "Test title" - description: "This is a test description" + description: "This is a test metadata" termsOfService: "http://test.com" contact: name: "Mark Snijder" diff --git a/src/test/resources/content_diff_2.yaml b/src/test/resources/content_diff_2.yaml index 8a59b4c07..53d25e979 100644 --- a/src/test/resources/content_diff_2.yaml +++ b/src/test/resources/content_diff_2.yaml @@ -2,7 +2,7 @@ openapi: "3.0.1" info: title: "Test title" - description: "This is a test description" + description: "This is a test metadata" termsOfService: "http://test.com" contact: name: "Mark Snijder"