From 6daa385aec6343f465bb2923450b8f047fb1d3d9 Mon Sep 17 00:00:00 2001 From: Jochen Schalanda Date: Wed, 24 Jun 2020 09:37:18 +0200 Subject: [PATCH] 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) ``` --- .../diff/core/output/ConsoleRender.java | 11 +++++-- .../openapi/test/ConsoleRenderTest.java | 18 +++++++++++ .../test/resources/missing_property_1.yaml | 31 +++++++++++++++++++ .../test/resources/missing_property_2.yaml | 24 ++++++++++++++ 4 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 core/src/test/java/com/qdesrame/openapi/test/ConsoleRenderTest.java create mode 100644 core/src/test/resources/missing_property_1.yaml create mode 100644 core/src/test/resources/missing_property_2.yaml diff --git a/core/src/main/java/com/qdesrame/openapi/diff/core/output/ConsoleRender.java b/core/src/main/java/com/qdesrame/openapi/diff/core/output/ConsoleRender.java index f3e1e2b3f..499dff44e 100644 --- a/core/src/main/java/com/qdesrame/openapi/diff/core/output/ConsoleRender.java +++ b/core/src/main/java/com/qdesrame/openapi/diff/core/output/ConsoleRender.java @@ -213,12 +213,19 @@ private String properties( String propPrefix, String title, Map properties, DiffContext context) { StringBuilder sb = new StringBuilder(); if (properties != null) { - properties.forEach( - (key, value) -> sb.append(property(propPrefix + key, title, resolve(value)))); + properties.forEach((key, value) -> sb.append(resolveProperty(propPrefix, value, key, title))); } return sb.toString(); } + private String resolveProperty(String propPrefix, Schema value, String key, String title) { + try { + return property(propPrefix + key, title, resolve(value)); + } catch (Exception e) { + return property(propPrefix + key, title, type(value)); + } + } + protected String property(String name, String title, Schema schema) { return property(name, title, type(schema)); } diff --git a/core/src/test/java/com/qdesrame/openapi/test/ConsoleRenderTest.java b/core/src/test/java/com/qdesrame/openapi/test/ConsoleRenderTest.java new file mode 100644 index 000000000..705897c50 --- /dev/null +++ b/core/src/test/java/com/qdesrame/openapi/test/ConsoleRenderTest.java @@ -0,0 +1,18 @@ +package com.qdesrame.openapi.test; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.qdesrame.openapi.diff.core.OpenApiCompare; +import com.qdesrame.openapi.diff.core.model.ChangedOpenApi; +import com.qdesrame.openapi.diff.core.output.ConsoleRender; +import org.junit.jupiter.api.Test; + +public class ConsoleRenderTest { + @Test + public void renderDoesNotFailWhenPropertyHasBeenRemoved() { + ConsoleRender render = new ConsoleRender(); + ChangedOpenApi diff = + OpenApiCompare.fromLocations("missing_property_1.yaml", "missing_property_2.yaml"); + assertThat(render.render(diff)).isNotBlank(); + } +} diff --git a/core/src/test/resources/missing_property_1.yaml b/core/src/test/resources/missing_property_1.yaml new file mode 100644 index 000000000..070fc748f --- /dev/null +++ b/core/src/test/resources/missing_property_1.yaml @@ -0,0 +1,31 @@ +openapi: 3.0.1 +info: + title: Title + version: 1.0.0 + description: Description +paths: + /: + get: + summary: Simple GET + operationId: simpleGet + responses: + default: + content: + application/json: + schema: + $ref: '#/components/schemas/Wrapper' + description: Simple GET +components: + schemas: + Wrapper: + type: object + properties: + id: + type: string + childProperty: + $ref: '#/components/schemas/ChildProperty' + ChildProperty: + type: object + properties: + id: + type: string \ No newline at end of file diff --git a/core/src/test/resources/missing_property_2.yaml b/core/src/test/resources/missing_property_2.yaml new file mode 100644 index 000000000..f84504c52 --- /dev/null +++ b/core/src/test/resources/missing_property_2.yaml @@ -0,0 +1,24 @@ +openapi: 3.0.1 +info: + title: Title + version: 1.0.0 + description: Description +paths: + /: + get: + summary: Simple GET + operationId: simpleGet + responses: + default: + content: + application/json: + schema: + $ref: '#/components/schemas/Wrapper' + description: Simple GET +components: + schemas: + Wrapper: + type: object + properties: + id: + type: string \ No newline at end of file