Skip to content

Commit 4d067ad

Browse files
justinasbardauskasjustinas.bardauskas
and
justinas.bardauskas
authored
After specs comparison, all parameters are removed from new spec (#453)
Co-authored-by: justinas.bardauskas <justinas.bardauskas@multitude.com>
1 parent f595a84 commit 4d067ad

File tree

2 files changed

+60
-16
lines changed

2 files changed

+60
-16
lines changed

core/src/main/java/org/openapitools/openapidiff/core/compare/ParametersDiff.java

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import io.swagger.v3.oas.models.Components;
44
import io.swagger.v3.oas.models.parameters.Parameter;
55
import java.util.ArrayList;
6+
import java.util.Collections;
67
import java.util.List;
78
import java.util.Objects;
89
import java.util.Optional;
@@ -16,6 +17,7 @@
1617

1718
/** compare two parameter */
1819
public class ParametersDiff {
20+
1921
private static final RefPointer<Parameter> refPointer = new RefPointer<>(RefType.PARAMETERS);
2022

2123
private final Components leftComponents;
@@ -47,29 +49,27 @@ public static boolean same(Parameter left, Parameter right) {
4749
}
4850

4951
public DeferredChanged<ChangedParameters> diff(
50-
List<Parameter> left, List<Parameter> right, DiffContext context) {
51-
52-
DeferredBuilder<Changed> builder = new DeferredBuilder<>();
53-
ChangedParameters changedParameters =
54-
new ChangedParameters(left, right != null ? new ArrayList<>(right) : null, context);
55-
if (null == left) left = new ArrayList<>();
56-
if (null == right) right = new ArrayList<>();
52+
final List<Parameter> left, final List<Parameter> right, final DiffContext context) {
53+
final DeferredBuilder<Changed> builder = new DeferredBuilder<>();
54+
final List<Parameter> wLeft = Optional.ofNullable(left).orElseGet(Collections::emptyList);
55+
final List<Parameter> wRight = Optional.ofNullable(right).map(ArrayList::new).orElseGet(ArrayList::new);
5756

58-
for (Parameter leftPara : left) {
59-
leftPara = refPointer.resolveRef(leftComponents, leftPara, leftPara.get$ref());
57+
final ChangedParameters changedParameters = new ChangedParameters(wLeft, wRight, context);
6058

61-
Optional<Parameter> rightParam = contains(rightComponents, right, leftPara);
62-
if (!rightParam.isPresent()) {
63-
changedParameters.getMissing().add(leftPara);
59+
for (Parameter leftParam : wLeft) {
60+
leftParam = refPointer.resolveRef(leftComponents, leftParam, leftParam.get$ref());
61+
Optional<Parameter> rightParamOpt = contains(rightComponents, wRight, leftParam);
62+
if (!rightParamOpt.isPresent()) {
63+
changedParameters.getMissing().add(leftParam);
6464
} else {
65-
Parameter rightPara = rightParam.get();
66-
right.remove(rightPara);
65+
Parameter rightParam = rightParamOpt.get();
66+
wRight.remove(rightParam);
6767
builder
68-
.with(openApiDiff.getParameterDiff().diff(leftPara, rightPara, context))
68+
.with(openApiDiff.getParameterDiff().diff(leftParam, rightParam, context))
6969
.ifPresent(changedParameters.getChanged()::add);
7070
}
7171
}
72-
changedParameters.getIncreased().addAll(right);
72+
changedParameters.getIncreased().addAll(wRight);
7373

7474
return builder.buildIsChanged(changedParameters);
7575
}

core/src/test/java/org/openapitools/openapidiff/core/OpenApiDiffTest.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
import static org.assertj.core.api.Assertions.assertThat;
44
import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiAreEquals;
55

6+
import io.swagger.parser.OpenAPIParser;
7+
import io.swagger.v3.oas.models.OpenAPI;
8+
import io.swagger.v3.parser.core.models.ParseOptions;
69
import java.io.FileWriter;
710
import java.io.IOException;
811
import java.nio.file.Path;
@@ -11,6 +14,7 @@
1114
import org.junit.jupiter.api.io.TempDir;
1215
import org.openapitools.openapidiff.core.model.ChangedOpenApi;
1316
import org.openapitools.openapidiff.core.model.ChangedOperation;
17+
import org.openapitools.openapidiff.core.model.DiffResult;
1418
import org.openapitools.openapidiff.core.model.Endpoint;
1519
import org.openapitools.openapidiff.core.output.HtmlRender;
1620
import org.openapitools.openapidiff.core.output.JsonRender;
@@ -21,6 +25,9 @@ public class OpenApiDiffTest {
2125
private final String OPENAPI_DOC1 = "petstore_v2_1.yaml";
2226
private final String OPENAPI_DOC2 = "petstore_v2_2.yaml";
2327
private final String OPENAPI_EMPTY_DOC = "petstore_v2_empty.yaml";
28+
private final String OPENAPI_DOC3 = "petstore_openapi3.yaml";
29+
30+
private static final OpenAPIParser PARSER = new OpenAPIParser();
2431

2532
@Test
2633
public void testEqual() {
@@ -104,4 +111,41 @@ public void testDiffAndJson(@TempDir Path tempDir) throws IOException {
104111
}
105112
assertThat(path).isNotEmptyFile();
106113
}
114+
115+
/** Testing that repetitive specs comparisons has to produce consistent result. */
116+
@Test
117+
public void testComparisonConsistency() {
118+
final OpenAPI oldSpec = loadSpecFromFile(OPENAPI_DOC3);
119+
final OpenAPI newSpec = loadSpecFromFile(OPENAPI_DOC3);
120+
121+
final ChangedOpenApi diff1 = OpenApiCompare.fromSpecifications(oldSpec, newSpec);
122+
assertThat(diff1.isChanged()).isEqualTo(DiffResult.NO_CHANGES);
123+
assertThat(diff1.getNewEndpoints()).isEmpty();
124+
assertThat(diff1.getMissingEndpoints()).isEmpty();
125+
assertThat(diff1.getChangedOperations()).isEmpty();
126+
127+
final ChangedOpenApi diff2 = OpenApiCompare.fromSpecifications(oldSpec, newSpec);
128+
assertThat(diff2.isChanged()).isEqualTo(DiffResult.NO_CHANGES);
129+
assertThat(diff2.getNewEndpoints()).isEmpty();
130+
assertThat(diff2.getMissingEndpoints()).isEmpty();
131+
assertThat(diff2.getChangedOperations()).isEmpty();
132+
}
133+
134+
@Test
135+
public void testSpecObjectsAreNotChangesAfterComparison() {
136+
final OpenAPI oldSpec = loadSpecFromFile(OPENAPI_DOC3);
137+
final OpenAPI newSpec = loadSpecFromFile(OPENAPI_DOC3);
138+
139+
OpenApiCompare.fromSpecifications(oldSpec, newSpec);
140+
OpenApiCompare.fromSpecifications(oldSpec, newSpec);
141+
142+
final OpenAPI expectedOldSpec = loadSpecFromFile(OPENAPI_DOC3);
143+
final OpenAPI expectedNewSpec = loadSpecFromFile(OPENAPI_DOC3);
144+
assertThat(oldSpec).isEqualTo(expectedOldSpec);
145+
assertThat(newSpec).isEqualTo(expectedNewSpec);
146+
}
147+
148+
private static OpenAPI loadSpecFromFile(String specFile) {
149+
return PARSER.readLocation(specFile, null, new ParseOptions()).getOpenAPI();
150+
}
107151
}

0 commit comments

Comments
 (0)