Skip to content

Commit d6383f3

Browse files
justinasbardauskasjustinas.bardauskasjoschi
authored
After specs comparison, all parameters are removed (#454)
Co-authored-by: justinas.bardauskas <[email protected]> Co-authored-by: Jochen Schalanda <[email protected]>
1 parent 6bba31e commit d6383f3

File tree

3 files changed

+67
-26
lines changed

3 files changed

+67
-26
lines changed

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

+19-17
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;
@@ -28,6 +29,7 @@ public ParametersDiffResult(
2829
}
2930
/** compare two parameter */
3031
public class ParametersDiff {
32+
3133
private static final RefPointer<Parameter> refPointer = new RefPointer<>(RefType.PARAMETERS);
3234

3335
private final Components leftComponents;
@@ -59,28 +61,28 @@ public static boolean same(Parameter left, Parameter right) {
5961
}
6062

6163
public ParametersDiffResult diff(
62-
List<Parameter> left, List<Parameter> right, DiffContext context) {
63-
DeferredBuilder<Changed> builder = new DeferredBuilder<>();
64-
ChangedParameters changedParameters =
65-
new ChangedParameters(left, right != null ? new ArrayList<>(right) : null, context);
66-
if (null == left) left = new ArrayList<>();
67-
if (null == right) right = new ArrayList<>();
68-
69-
for (Parameter leftPara : left) {
70-
leftPara = refPointer.resolveRef(leftComponents, leftPara, leftPara.get$ref());
71-
72-
Optional<Parameter> rightParam = contains(rightComponents, right, leftPara);
73-
if (!rightParam.isPresent()) {
74-
changedParameters.getMissing().add(leftPara);
64+
final List<Parameter> left, final List<Parameter> right, final DiffContext context) {
65+
final DeferredBuilder<Changed> builder = new DeferredBuilder<>();
66+
final List<Parameter> wLeft = Optional.ofNullable(left).orElseGet(Collections::emptyList);
67+
final List<Parameter> wRight =
68+
Optional.ofNullable(right).map(ArrayList::new).orElseGet(ArrayList::new);
69+
70+
final ChangedParameters changedParameters = new ChangedParameters(wLeft, wRight, context);
71+
72+
for (Parameter leftParam : wLeft) {
73+
leftParam = refPointer.resolveRef(leftComponents, leftParam, leftParam.get$ref());
74+
Optional<Parameter> rightParamOpt = contains(rightComponents, wRight, leftParam);
75+
if (!rightParamOpt.isPresent()) {
76+
changedParameters.getMissing().add(leftParam);
7577
} else {
76-
Parameter rightPara = rightParam.get();
77-
right.remove(rightPara);
78+
Parameter rightParam = rightParamOpt.get();
79+
wRight.remove(rightParam);
7880
builder
79-
.with(openApiDiff.getParameterDiff().diff(leftPara, rightPara, context))
81+
.with(openApiDiff.getParameterDiff().diff(leftParam, rightParam, context))
8082
.ifPresent(changedParameters.getChanged()::add);
8183
}
8284
}
83-
changedParameters.getIncreased().addAll(right);
85+
changedParameters.getIncreased().addAll(wRight);
8486
return new ParametersDiffResult(
8587
builder.buildIsChanged(changedParameters),
8688
pathUnchangedParametersChanged(changedParameters, context));

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

+44
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
}

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

+4-9
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import static org.assertj.core.api.Assertions.assertThat;
44
import static org.junit.jupiter.api.Assertions.assertThrows;
5-
import static org.junit.jupiter.api.Assertions.fail;
65
import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiAreEquals;
76

87
import org.junit.jupiter.api.Test;
@@ -42,13 +41,9 @@ public void testSameTemplateDifferentMethods() {
4241
@Test
4342
public void testDiffWithSimilarBeginningPaths() {
4443
ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_PATH5, OPENAPI_PATH6);
45-
try {
46-
ChangedOpenApi diff =
47-
OpenApiCompare.fromSpecifications(
48-
changedOpenApi.getOldSpecOpenApi(), changedOpenApi.getNewSpecOpenApi());
49-
assertThat(diff.getChangedOperations()).hasSize(4);
50-
} catch (IllegalArgumentException e) {
51-
fail(e.getMessage());
52-
}
44+
ChangedOpenApi diff =
45+
OpenApiCompare.fromSpecifications(
46+
changedOpenApi.getOldSpecOpenApi(), changedOpenApi.getNewSpecOpenApi());
47+
assertThat(diff.getChangedOperations()).isEmpty();
5348
}
5449
}

0 commit comments

Comments
 (0)