Skip to content

Commit 6daa385

Browse files
committed
Fix exception in ConsoleRender when property has been removed
`ConsoleRender` failed to resolve component schemas which had been removed in the "new" OpenAPI specification and threw an `IllegalArgumentException`: ``` Unexpected exception. Reason: ref '#/components/schemas/RemovedSchema' doesn't exist. java.lang.IllegalArgumentException: ref '#/components/schemas/PermissionSet' doesn't exist. at com.qdesrame.openapi.diff.core.utils.RefPointer.resolveRef(RefPointer.java:20) at com.qdesrame.openapi.diff.core.output.ConsoleRender.resolve(ConsoleRender.java:231) at com.qdesrame.openapi.diff.core.output.ConsoleRender.lambda$properties$1(ConsoleRender.java:217) at java.util.LinkedHashMap.forEach(LinkedHashMap.java:684) at com.qdesrame.openapi.diff.core.output.ConsoleRender.properties(ConsoleRender.java:216) at com.qdesrame.openapi.diff.core.output.ConsoleRender.incompatibilities(ConsoleRender.java:199) at com.qdesrame.openapi.diff.core.output.ConsoleRender.lambda$incompatibilities$0(ConsoleRender.java:202) at java.util.LinkedHashMap.forEach(LinkedHashMap.java:684) at com.qdesrame.openapi.diff.core.output.ConsoleRender.incompatibilities(ConsoleRender.java:202) at com.qdesrame.openapi.diff.core.output.ConsoleRender.incompatibilities(ConsoleRender.java:185) at com.qdesrame.openapi.diff.core.output.ConsoleRender.itemContent(ConsoleRender.java:179) at com.qdesrame.openapi.diff.core.output.ConsoleRender.ul_content(ConsoleRender.java:155) at com.qdesrame.openapi.diff.core.output.ConsoleRender.ol_changed(ConsoleRender.java:87) at com.qdesrame.openapi.diff.core.output.ConsoleRender.render(ConsoleRender.java:47) at com.qdesrame.openapi.diff.cli.Main.main(Main.java:159) ```
1 parent 3c6f9af commit 6daa385

File tree

4 files changed

+82
-2
lines changed

4 files changed

+82
-2
lines changed

core/src/main/java/com/qdesrame/openapi/diff/core/output/ConsoleRender.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,12 +213,19 @@ private String properties(
213213
String propPrefix, String title, Map<String, Schema> properties, DiffContext context) {
214214
StringBuilder sb = new StringBuilder();
215215
if (properties != null) {
216-
properties.forEach(
217-
(key, value) -> sb.append(property(propPrefix + key, title, resolve(value))));
216+
properties.forEach((key, value) -> sb.append(resolveProperty(propPrefix, value, key, title)));
218217
}
219218
return sb.toString();
220219
}
221220

221+
private String resolveProperty(String propPrefix, Schema value, String key, String title) {
222+
try {
223+
return property(propPrefix + key, title, resolve(value));
224+
} catch (Exception e) {
225+
return property(propPrefix + key, title, type(value));
226+
}
227+
}
228+
222229
protected String property(String name, String title, Schema schema) {
223230
return property(name, title, type(schema));
224231
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.qdesrame.openapi.test;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import com.qdesrame.openapi.diff.core.OpenApiCompare;
6+
import com.qdesrame.openapi.diff.core.model.ChangedOpenApi;
7+
import com.qdesrame.openapi.diff.core.output.ConsoleRender;
8+
import org.junit.jupiter.api.Test;
9+
10+
public class ConsoleRenderTest {
11+
@Test
12+
public void renderDoesNotFailWhenPropertyHasBeenRemoved() {
13+
ConsoleRender render = new ConsoleRender();
14+
ChangedOpenApi diff =
15+
OpenApiCompare.fromLocations("missing_property_1.yaml", "missing_property_2.yaml");
16+
assertThat(render.render(diff)).isNotBlank();
17+
}
18+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
openapi: 3.0.1
2+
info:
3+
title: Title
4+
version: 1.0.0
5+
description: Description
6+
paths:
7+
/:
8+
get:
9+
summary: Simple GET
10+
operationId: simpleGet
11+
responses:
12+
default:
13+
content:
14+
application/json:
15+
schema:
16+
$ref: '#/components/schemas/Wrapper'
17+
description: Simple GET
18+
components:
19+
schemas:
20+
Wrapper:
21+
type: object
22+
properties:
23+
id:
24+
type: string
25+
childProperty:
26+
$ref: '#/components/schemas/ChildProperty'
27+
ChildProperty:
28+
type: object
29+
properties:
30+
id:
31+
type: string
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
openapi: 3.0.1
2+
info:
3+
title: Title
4+
version: 1.0.0
5+
description: Description
6+
paths:
7+
/:
8+
get:
9+
summary: Simple GET
10+
operationId: simpleGet
11+
responses:
12+
default:
13+
content:
14+
application/json:
15+
schema:
16+
$ref: '#/components/schemas/Wrapper'
17+
description: Simple GET
18+
components:
19+
schemas:
20+
Wrapper:
21+
type: object
22+
properties:
23+
id:
24+
type: string

0 commit comments

Comments
 (0)