Skip to content

Commit 8508eb5

Browse files
authored
Change of 'nullable' is not detected (#747)
Fixes #482
1 parent 42c17be commit 8508eb5

File tree

9 files changed

+168
-2
lines changed

9 files changed

+168
-2
lines changed

core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/ComposedSchemaDiffResult.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@
1212
import org.apache.commons.collections4.CollectionUtils;
1313
import org.openapitools.openapidiff.core.compare.MapKeyDiff;
1414
import org.openapitools.openapidiff.core.compare.OpenApiDiff;
15-
import org.openapitools.openapidiff.core.model.ChangedOneOfSchema;
1615
import org.openapitools.openapidiff.core.model.ChangedSchema;
1716
import org.openapitools.openapidiff.core.model.DiffContext;
1817
import org.openapitools.openapidiff.core.model.deferred.DeferredBuilder;
1918
import org.openapitools.openapidiff.core.model.deferred.DeferredChanged;
2019
import org.openapitools.openapidiff.core.model.deferred.RealizedChanged;
2120
import org.openapitools.openapidiff.core.model.deferred.RecursiveSchemaSet;
21+
import org.openapitools.openapidiff.core.model.schema.ChangedOneOfSchema;
2222
import org.openapitools.openapidiff.core.utils.RefPointer;
2323
import org.openapitools.openapidiff.core.utils.RefType;
2424

core/src/main/java/org/openapitools/openapidiff/core/compare/schemadiffresult/SchemaDiffResult.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ public <V extends Schema<X>, X> DeferredChanged<ChangedSchema> diff(
7272
right.getExclusiveMaximum(),
7373
context))
7474
.setMultipleOf(new ChangedMultipleOf(left.getMultipleOf(), right.getMultipleOf()))
75+
.setNullable(new ChangedNullable(left.getNullable(), right.getNullable()))
7576
.setExamples(new ChangedExamples(left.getExamples(), right.getExamples()))
7677
.setExample(new ChangedExample(left.getExample(), right.getExample()));
7778
builder

core/src/main/java/org/openapitools/openapidiff/core/model/ChangedSchema.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
import org.openapitools.openapidiff.core.model.schema.ChangedEnum;
1212
import org.openapitools.openapidiff.core.model.schema.ChangedMaxLength;
1313
import org.openapitools.openapidiff.core.model.schema.ChangedMultipleOf;
14+
import org.openapitools.openapidiff.core.model.schema.ChangedNullable;
1415
import org.openapitools.openapidiff.core.model.schema.ChangedNumericRange;
16+
import org.openapitools.openapidiff.core.model.schema.ChangedOneOfSchema;
1517
import org.openapitools.openapidiff.core.model.schema.ChangedReadOnly;
1618
import org.openapitools.openapidiff.core.model.schema.ChangedRequired;
1719
import org.openapitools.openapidiff.core.model.schema.ChangedWriteOnly;
@@ -39,6 +41,7 @@ public class ChangedSchema implements ComposedChanged {
3941
protected ChangedMaxLength maxLength;
4042
protected ChangedNumericRange numericRange;
4143
protected ChangedMultipleOf multipleOf;
44+
protected ChangedNullable nullable;
4245
protected boolean discriminatorPropertyChanged;
4346
protected ChangedSchema items;
4447
protected ChangedOneOfSchema oneOfSchema;
@@ -122,6 +125,7 @@ public List<Changed> getChangedElements() {
122125
maxLength,
123126
numericRange,
124127
multipleOf,
128+
nullable,
125129
extensions))
126130
.collect(Collectors.toList());
127131
}
@@ -285,6 +289,10 @@ public ChangedMultipleOf getMultipleOf() {
285289
return this.multipleOf;
286290
}
287291

292+
public ChangedNullable getNullable() {
293+
return this.nullable;
294+
}
295+
288296
public boolean isDiscriminatorPropertyChanged() {
289297
return this.discriminatorPropertyChanged;
290298
}
@@ -433,6 +441,12 @@ public ChangedSchema setMultipleOf(final ChangedMultipleOf multipleOf) {
433441
return this;
434442
}
435443

444+
public ChangedSchema setNullable(final ChangedNullable nullable) {
445+
clearChangedCache();
446+
this.nullable = nullable;
447+
return this;
448+
}
449+
436450
public ChangedSchema setDiscriminatorPropertyChanged(final boolean discriminatorPropertyChanged) {
437451
clearChangedCache();
438452
this.discriminatorPropertyChanged = discriminatorPropertyChanged;
@@ -491,6 +505,7 @@ public boolean equals(Object o) {
491505
&& Objects.equals(maxLength, that.maxLength)
492506
&& Objects.equals(numericRange, that.numericRange)
493507
&& Objects.equals(multipleOf, that.multipleOf)
508+
&& Objects.equals(nullable, that.nullable)
494509
&& Objects.equals(items, that.items)
495510
&& Objects.equals(oneOfSchema, that.oneOfSchema)
496511
&& Objects.equals(addProp, that.addProp)
@@ -522,6 +537,7 @@ public int hashCode() {
522537
maxLength,
523538
numericRange,
524539
multipleOf,
540+
nullable,
525541
discriminatorPropertyChanged,
526542
items,
527543
oneOfSchema,
@@ -575,6 +591,8 @@ public java.lang.String toString() {
575591
+ this.getNumericRange()
576592
+ ", multipleOf="
577593
+ this.getMultipleOf()
594+
+ ", nullable="
595+
+ this.getNullable()
578596
+ ", discriminatorPropertyChanged="
579597
+ this.isDiscriminatorPropertyChanged()
580598
+ ", items="
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package org.openapitools.openapidiff.core.model.schema;
2+
3+
import java.util.Objects;
4+
import org.openapitools.openapidiff.core.model.Changed;
5+
import org.openapitools.openapidiff.core.model.DiffResult;
6+
7+
public class ChangedNullable implements Changed {
8+
9+
private final Boolean left;
10+
private final Boolean right;
11+
12+
public ChangedNullable(Boolean leftNullable, Boolean rightNullable) {
13+
this.left = leftNullable;
14+
this.right = rightNullable;
15+
}
16+
17+
@Override
18+
public DiffResult isChanged() {
19+
boolean leftValue = left != null && left;
20+
boolean rightValue = right != null && right;
21+
22+
if (leftValue != rightValue) {
23+
return DiffResult.COMPATIBLE;
24+
}
25+
26+
return DiffResult.NO_CHANGES;
27+
}
28+
29+
public Boolean getLeft() {
30+
return left;
31+
}
32+
33+
public Boolean getRight() {
34+
return right;
35+
}
36+
37+
@Override
38+
public String toString() {
39+
return "ChangedNullable [left=" + left + ", right=" + right + "]";
40+
}
41+
42+
@Override
43+
public boolean equals(Object o) {
44+
if (this == o) return true;
45+
if (o == null || getClass() != o.getClass()) return false;
46+
ChangedNullable that = (ChangedNullable) o;
47+
return Objects.equals(left, that.getLeft()) && Objects.equals(right, that.getRight());
48+
}
49+
50+
@Override
51+
public int hashCode() {
52+
return Objects.hash(left, right);
53+
}
54+
}

core/src/main/java/org/openapitools/openapidiff/core/model/ChangedOneOfSchema.java renamed to core/src/main/java/org/openapitools/openapidiff/core/model/schema/ChangedOneOfSchema.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.openapitools.openapidiff.core.model;
1+
package org.openapitools.openapidiff.core.model.schema;
22

33
import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.REQUEST_ONEOF_DECREASED;
44
import static org.openapitools.openapidiff.core.model.BackwardIncompatibleProp.RESPONSE_ONEOF_INCREASED;
@@ -8,6 +8,11 @@
88
import java.util.List;
99
import java.util.Map;
1010
import java.util.Objects;
11+
import org.openapitools.openapidiff.core.model.Changed;
12+
import org.openapitools.openapidiff.core.model.ChangedSchema;
13+
import org.openapitools.openapidiff.core.model.ComposedChanged;
14+
import org.openapitools.openapidiff.core.model.DiffContext;
15+
import org.openapitools.openapidiff.core.model.DiffResult;
1116

1217
public class ChangedOneOfSchema implements ComposedChanged {
1318
private final Map<String, String> oldMapping;

core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.apache.commons.lang3.StringUtils;
2121
import org.openapitools.openapidiff.core.exception.RendererException;
2222
import org.openapitools.openapidiff.core.model.*;
23+
import org.openapitools.openapidiff.core.model.schema.ChangedOneOfSchema;
2324
import org.openapitools.openapidiff.core.utils.RefPointer;
2425
import org.openapitools.openapidiff.core.utils.RefType;
2526
import org.slf4j.Logger;

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,4 +134,35 @@ public void changeMultipleOfHandling() {
134134
assertThat(props.get("field4").getMultipleOf().getLeft()).isEqualTo(BigDecimal.valueOf(10));
135135
assertThat(props.get("field4").getMultipleOf().getRight()).isNull();
136136
}
137+
138+
@Test // issue #482
139+
public void changeNullabeHandling() {
140+
ChangedOpenApi changedOpenApi =
141+
OpenApiCompare.fromLocations(
142+
"schemaDiff/schema-nullable-diff-1.yaml", "schemaDiff/schema-nullable-diff-2.yaml");
143+
ChangedSchema changedSchema =
144+
getRequestBodyChangedSchema(changedOpenApi, POST, "/schema/nullable", "application/json");
145+
146+
assertThat(changedSchema).isNotNull();
147+
Map<String, ChangedSchema> props = changedSchema.getChangedProperties();
148+
assertThat(props).isNotEmpty();
149+
150+
// Check no changes in nullable
151+
assertThat(props.get("field0")).isNull();
152+
153+
// Check changes in nullable
154+
assertThat(props.get("field1").getNullable().isCompatible()).isTrue();
155+
assertThat(props.get("field1").getNullable().getLeft()).isTrue();
156+
assertThat(props.get("field1").getNullable().getRight()).isFalse();
157+
158+
// Check deletion of nullable
159+
assertThat(props.get("field2").getNullable().isCompatible()).isTrue();
160+
assertThat(props.get("field2").getNullable().getLeft()).isTrue();
161+
assertThat(props.get("field2").getNullable().getRight()).isNull();
162+
163+
// Check addition of nullable
164+
assertThat(props.get("field3").getNullable().isCompatible()).isTrue();
165+
assertThat(props.get("field3").getNullable().getLeft()).isNull();
166+
assertThat(props.get("field3").getNullable().getRight()).isTrue();
167+
}
137168
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
openapi: 3.0.1
2+
info:
3+
description: Schema diff nullable
4+
title: schema diff nullable
5+
version: 1.0.0
6+
paths:
7+
/schema/nullable:
8+
post:
9+
requestBody:
10+
content:
11+
application/json:
12+
schema:
13+
$ref: '#/components/schemas/TestDTO'
14+
components:
15+
schemas:
16+
TestDTO:
17+
type: object
18+
properties:
19+
field0:
20+
type: integer
21+
field1:
22+
type: integer
23+
nullable: true
24+
field2:
25+
type: integer
26+
nullable: true
27+
field3:
28+
type: integer
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
openapi: 3.0.1
2+
info:
3+
description: Schema diff nullable
4+
title: schema diff nullable
5+
version: 1.0.0
6+
paths:
7+
/schema/nullable:
8+
post:
9+
requestBody:
10+
content:
11+
application/json:
12+
schema:
13+
$ref: '#/components/schemas/TestDTO'
14+
components:
15+
schemas:
16+
TestDTO:
17+
type: object
18+
properties:
19+
field0:
20+
type: integer
21+
field1:
22+
type: integer
23+
nullable: false
24+
field2:
25+
type: integer
26+
field3:
27+
type: integer
28+
nullable: true

0 commit comments

Comments
 (0)