diff --git a/src/main/java/com/qdesrame/openapi/diff/output/ConsoleRender.java b/src/main/java/com/qdesrame/openapi/diff/output/ConsoleRender.java index 7fe4d8a08..352e6df7b 100644 --- a/src/main/java/com/qdesrame/openapi/diff/output/ConsoleRender.java +++ b/src/main/java/com/qdesrame/openapi/diff/output/ConsoleRender.java @@ -234,7 +234,9 @@ protected Schema resolve(Schema schema) { protected String type(Schema schema) { String result = "object"; - if (schema instanceof ArraySchema) { + if (schema == null) { + result = "no schema"; + } else if (schema instanceof ArraySchema) { result = "array"; } else if (schema.getType() != null) { result = schema.getType(); diff --git a/src/main/java/com/qdesrame/openapi/diff/output/HtmlRender.java b/src/main/java/com/qdesrame/openapi/diff/output/HtmlRender.java index 756bc045a..9147c648c 100644 --- a/src/main/java/com/qdesrame/openapi/diff/output/HtmlRender.java +++ b/src/main/java/com/qdesrame/openapi/diff/output/HtmlRender.java @@ -288,7 +288,9 @@ protected Schema resolve(Schema schema) { protected String type(Schema schema) { String result = "object"; - if (schema instanceof ArraySchema) { + if (schema == null) { + result = "no schema"; + } else if (schema instanceof ArraySchema) { result = "array"; } else if (schema.getType() != null) { result = schema.getType(); diff --git a/src/test/java/com/qdesrame/openapi/test/ResponseAddedContentSchemaTest.java b/src/test/java/com/qdesrame/openapi/test/ResponseAddedContentSchemaTest.java new file mode 100644 index 000000000..66023c429 --- /dev/null +++ b/src/test/java/com/qdesrame/openapi/test/ResponseAddedContentSchemaTest.java @@ -0,0 +1,47 @@ +package com.qdesrame.openapi.test; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.qdesrame.openapi.diff.OpenApiCompare; +import com.qdesrame.openapi.diff.model.ChangedOpenApi; +import com.qdesrame.openapi.diff.model.ChangedResponse; +import com.qdesrame.openapi.diff.output.ConsoleRender; +import com.qdesrame.openapi.diff.output.HtmlRender; +import com.qdesrame.openapi.diff.output.MarkdownRender; +import io.swagger.v3.oas.models.media.Content; +import java.util.Map; +import org.junit.jupiter.api.Test; + +public class ResponseAddedContentSchemaTest { + + private final String OPENAPI_DOC1 = "response_schema_added_1.yaml"; + private final String OPENAPI_DOC2 = "response_schema_added_2.yaml"; + + @Test + public void testDiffDifferent() { + ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); + + assertThat(changedOpenApi.getNewEndpoints()).isEmpty(); + assertThat(changedOpenApi.getMissingEndpoints()).isEmpty(); + assertThat(changedOpenApi.getChangedOperations()).isNotEmpty(); + + Map changedResponses = + changedOpenApi.getChangedOperations().get(0).getApiResponses().getChanged(); + assertThat(changedResponses).containsKey("200"); + + ChangedResponse changedResponse = changedResponses.get("200"); + Content oldContent = changedResponse.getOldApiResponse().getContent(); + Content newContent = changedResponse.getNewApiResponse().getContent(); + assertThat(oldContent.get("application/json").getSchema()).isNull(); + assertThat(newContent.get("application/json").getSchema()).isNotNull(); + } + + @Test + public void testDiffCanBeRendered() { + ChangedOpenApi changedOpenApi = OpenApiCompare.fromLocations(OPENAPI_DOC1, OPENAPI_DOC2); + + assertThat(new ConsoleRender().render(changedOpenApi)).isNotBlank(); + assertThat(new HtmlRender().render(changedOpenApi)).isNotBlank(); + assertThat(new MarkdownRender().render(changedOpenApi)).isNotBlank(); + } +} diff --git a/src/test/resources/response_schema_added_1.yaml b/src/test/resources/response_schema_added_1.yaml new file mode 100644 index 000000000..d4050c576 --- /dev/null +++ b/src/test/resources/response_schema_added_1.yaml @@ -0,0 +1,106 @@ +openapi: "3.0.0" +info: + version: 1.0.0 + title: Swagger Petstore + license: + name: MIT +servers: + - url: http://petstore.swagger.io/v1 +paths: + /pets: + get: + summary: List all pets + operationId: listPets + tags: + - pets + parameters: + - name: limit + in: query + description: How many items to return at one time (max 100) + required: false + schema: + type: integer + format: int32 + responses: + '200': + description: A paged array of pets + headers: + x-next: + description: A link to the next page of responses + schema: + type: string + content: + application/json: {} + default: + description: unexpected error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + post: + summary: Create a pet + operationId: createPets + tags: + - pets + responses: + '201': + description: Null response + default: + description: unexpected error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + /pets/{petId}: + get: + summary: Info for a specific pet + operationId: showPetById + tags: + - pets + parameters: + - name: petId + in: path + required: true + description: The id of the pet to retrieve + schema: + type: string + responses: + '200': + description: Expected response to a valid request + content: + application/json: + $ref: "#/components/schemas/Pets" + default: + description: unexpected error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" +components: + schemas: + Pet: + required: + - id + - name + properties: + id: + type: integer + format: int64 + name: + type: string + tag: + type: string + Pets: + type: array + items: + $ref: "#/components/schemas/Pet" + Error: + required: + - code + - message + properties: + code: + type: integer + format: int32 + message: + type: string diff --git a/src/test/resources/response_schema_added_2.yaml b/src/test/resources/response_schema_added_2.yaml new file mode 100644 index 000000000..264dbeabf --- /dev/null +++ b/src/test/resources/response_schema_added_2.yaml @@ -0,0 +1,109 @@ +openapi: "3.0.0" +info: + version: 1.0.0 + title: Swagger Petstore + license: + name: MIT +servers: + - url: http://petstore.swagger.io/v1 +paths: + /pets: + get: + summary: List all pets + operationId: listPets + tags: + - pets + parameters: + - name: limit + in: query + description: How many items to return at one time (max 100) + required: false + schema: + type: integer + format: int32 + responses: + '200': + description: A paged array of pets + headers: + x-next: + description: A link to the next page of responses + schema: + type: string + content: + application/json: + schema: + $ref: "#/components/schemas/Pets" + default: + description: unexpected error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + post: + summary: Create a pet + operationId: createPets + tags: + - pets + responses: + '201': + description: Null response + default: + description: unexpected error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + /pets/{petId}: + get: + summary: Info for a specific pet + operationId: showPetById + tags: + - pets + parameters: + - name: petId + in: path + required: true + description: The id of the pet to retrieve + schema: + type: string + responses: + '200': + description: Expected response to a valid request + content: + application/json: + schema: + $ref: "#/components/schemas/Pets" + default: + description: unexpected error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" +components: + schemas: + Pet: + required: + - id + - name + properties: + id: + type: integer + format: int64 + name: + type: string + tag: + type: string + Pets: + type: array + items: + $ref: "#/components/schemas/Pet" + Error: + required: + - code + - message + properties: + code: + type: integer + format: int32 + message: + type: string