Skip to content

Commit 028c40b

Browse files
authored
Fix nullable API response in diff (OpenAPITools#206)
1 parent ecb2a18 commit 028c40b

File tree

4 files changed

+54
-4
lines changed

4 files changed

+54
-4
lines changed

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

+5-4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import org.openapitools.openapidiff.core.model.ChangedResponse;
1313
import org.openapitools.openapidiff.core.model.DiffContext;
1414

15+
import javax.annotation.Nullable;
16+
1517
/** Created by adarsh.sharma on 04/01/18. */
1618
public class ApiResponseDiff {
1719
private final OpenApiDiff openApiDiff;
@@ -20,15 +22,14 @@ public ApiResponseDiff(OpenApiDiff openApiDiff) {
2022
this.openApiDiff = openApiDiff;
2123
}
2224

23-
public Optional<ChangedApiResponse> diff(
24-
ApiResponses left, ApiResponses right, DiffContext context) {
25+
public Optional<ChangedApiResponse> diff(@Nullable ApiResponses left, @Nullable ApiResponses right, DiffContext context) {
2526
MapKeyDiff<String, ApiResponse> responseMapKeyDiff = MapKeyDiff.diff(left, right);
2627
List<String> sharedResponseCodes = responseMapKeyDiff.getSharedKey();
2728
Map<String, ChangedResponse> resps = new LinkedHashMap<>();
2829
for (String responseCode : sharedResponseCodes) {
2930
openApiDiff
3031
.getResponseDiff()
31-
.diff(left.get(responseCode), right.get(responseCode), context)
32+
.diff(left != null ? left.get(responseCode) : null, right != null ? right.get(responseCode) : null, context)
3233
.ifPresent(changedResponse -> resps.put(responseCode, changedResponse));
3334
}
3435
ChangedApiResponse changedApiResponse =
@@ -38,7 +39,7 @@ public Optional<ChangedApiResponse> diff(
3839
.setChanged(resps);
3940
openApiDiff
4041
.getExtensionsDiff()
41-
.diff(left.getExtensions(), right.getExtensions(), context)
42+
.diff(left != null ? left.getExtensions() : null, right != null ? right.getExtensions() : null, context)
4243
.ifPresent(changedApiResponse::setExtensions);
4344
return isChanged(changedApiResponse);
4445
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package org.openapitools.openapidiff.core.compare;
2+
3+
import org.junit.jupiter.api.Assertions;
4+
import org.junit.jupiter.api.Test;
5+
6+
import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardCompatible;
7+
import static org.openapitools.openapidiff.core.TestUtils.assertOpenApiBackwardIncompatible;
8+
9+
10+
class ApiResponseDiffTest extends Assertions {
11+
/***
12+
* This is a regression test - when no responses were set, we would get an exception
13+
* since the OpenAPI object has a `null` ApiResponses field.
14+
*/
15+
@Test
16+
public void testNoResponseInPrevious() {
17+
// The previous API had no response, so adding a response shape is still compatible.
18+
assertOpenApiBackwardCompatible(
19+
"backwardCompatibility/apiResponse_diff_1.yaml",
20+
"backwardCompatibility/apiResponse_diff_2.yaml", true);
21+
22+
// Removing the response shape is backwards incompatible.
23+
assertOpenApiBackwardIncompatible(
24+
"backwardCompatibility/apiResponse_diff_2.yaml",
25+
"backwardCompatibility/apiResponse_diff_1.yaml");
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
openapi: 3.0.0
2+
info:
3+
title: Swagger Petstore
4+
paths:
5+
/store/inventory:
6+
get:
7+
operationId: asdf
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
openapi: 3.0.0
2+
info:
3+
title: Swagger Petstore
4+
paths:
5+
/store/inventory:
6+
get:
7+
responses:
8+
'200':
9+
content:
10+
application/json:
11+
schema:
12+
type: object
13+
properties:
14+
title:
15+
type: string

0 commit comments

Comments
 (0)