From 927047023b964cb4568b2305687b69a614cf9ccd Mon Sep 17 00:00:00 2001 From: erwin Date: Sat, 10 Nov 2018 09:51:53 +0100 Subject: [PATCH] consider ResponseSchema refModel's format as it can differ e.g. INTERNAL, RELATIVE --- .../processors/ExternalRefProcessor.java | 2 +- .../io/swagger/parser/SwaggerParserTest.java | 50 +++++++++++++++++++ .../sub-folder/common-country.yaml | 28 +++++++++++ .../sub-folder/common-responses.yaml | 37 ++++++++++++++ .../sub-folder2/common-address.yaml | 30 +++++++++++ .../swagger-root.yaml | 31 ++++++++++++ 6 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 modules/swagger-parser/src/test/resources/nested-external-response-references/sub-folder/common-country.yaml create mode 100644 modules/swagger-parser/src/test/resources/nested-external-response-references/sub-folder/common-responses.yaml create mode 100644 modules/swagger-parser/src/test/resources/nested-external-response-references/sub-folder/sub-folder2/common-address.yaml create mode 100644 modules/swagger-parser/src/test/resources/nested-external-response-references/swagger-root.yaml diff --git a/modules/swagger-parser/src/main/java/io/swagger/parser/processors/ExternalRefProcessor.java b/modules/swagger-parser/src/main/java/io/swagger/parser/processors/ExternalRefProcessor.java index 180a769258..7334c4c565 100644 --- a/modules/swagger-parser/src/main/java/io/swagger/parser/processors/ExternalRefProcessor.java +++ b/modules/swagger-parser/src/main/java/io/swagger/parser/processors/ExternalRefProcessor.java @@ -196,7 +196,7 @@ public String processRefToExternalResponse(String $ref, RefFormat refFormat) { model = response.getResponseSchema(); if (model instanceof RefModel) { RefModel refModel = (RefModel) model; - if (RefUtils.isAnExternalRefFormat(refFormat)) { + if (RefUtils.isAnExternalRefFormat(refModel.getRefFormat())) { processRefModel(refModel, $ref); } else { processRefToExternalDefinition(file + refModel.get$ref(), RefFormat.RELATIVE); diff --git a/modules/swagger-parser/src/test/java/io/swagger/parser/SwaggerParserTest.java b/modules/swagger-parser/src/test/java/io/swagger/parser/SwaggerParserTest.java index f4ce3f3777..bca892b038 100644 --- a/modules/swagger-parser/src/test/java/io/swagger/parser/SwaggerParserTest.java +++ b/modules/swagger-parser/src/test/java/io/swagger/parser/SwaggerParserTest.java @@ -427,6 +427,12 @@ public void testLoadRelativeFileTree_Yaml() throws Exception { assertNotNull(Yaml.mapper().writeValueAsString(swagger)); } + @Test + public void testLoadnestedExternalResponseReferencesFile_Yaml() throws Exception { + final Swagger swagger = doRelativeResponseFileTest("src/test/resources/nested-external-response-references/swagger-root.yaml"); + assertNotNull(Yaml.mapper().writeValueAsString(swagger)); + } + @Test public void testLoadRecursiveExternalDef() throws Exception { SwaggerParser parser = new SwaggerParser(); @@ -762,6 +768,50 @@ private Swagger doRelativeFileTest(String location) { return swagger; } + private Swagger doRelativeResponseFileTest(String location) { + SwaggerParser parser = new SwaggerParser(); + SwaggerDeserializationResult readResult = parser.readWithInfo(location, null, true); + + if (readResult.getMessages().size() > 0) { + Json.prettyPrint(readResult.getMessages()); + } + final Swagger swagger = readResult.getSwagger(); + + Json.prettyPrint(swagger); + + final Path path = swagger.getPath("/users"); + assertEquals(path.getClass(), Path.class); //we successfully converted the RefPath to a Path + + final Operation operation = path.getGet(); + + final Map responsesMap = operation.getResponses(); + + assertResponse(swagger, responsesMap, "200", "OK", "#/definitions/User"); + + final Map definitions = swagger.getDefinitions(); + final ModelImpl refInDefinitions = (ModelImpl) definitions.get("UserX"); + expectedPropertiesInModel(refInDefinitions, "address"); + + final ModelImpl refInDefinitionsAddress = (ModelImpl) definitions.get("Address"); + expectedPropertiesInModel(refInDefinitionsAddress, "postal", "country"); + + final ModelImpl refInDefinitionsCountry = (ModelImpl) definitions.get("Country"); + expectedPropertiesInModel(refInDefinitionsCountry, "name"); + + final ModelImpl refInDefinitionsAddress_2 = (ModelImpl) definitions.get("Address_2"); + expectedPropertiesInModel(refInDefinitionsAddress_2, "postal", "country"); + + final ModelImpl refInDefinitionsCountry_2 = (ModelImpl) definitions.get("Country_2"); + expectedPropertiesInModel(refInDefinitionsCountry_2, "name"); + + + + + + return swagger; + } + + private void expectedPropertiesInModel(ModelImpl model, String... expectedProperties) { assertEquals(model.getProperties().size(), expectedProperties.length); for (String expectedProperty : expectedProperties) { diff --git a/modules/swagger-parser/src/test/resources/nested-external-response-references/sub-folder/common-country.yaml b/modules/swagger-parser/src/test/resources/nested-external-response-references/sub-folder/common-country.yaml new file mode 100644 index 0000000000..526c231a9d --- /dev/null +++ b/modules/swagger-parser/src/test/resources/nested-external-response-references/sub-folder/common-country.yaml @@ -0,0 +1,28 @@ +swagger: "2.0" +info: + title: Sample API + description: API description in Markdown. + version: 1.0.0 +host: api.example.com +basePath: /v1 +schemes: + - https +paths: + /users: + get: + summary: Returns a list of users. + description: Optional extended description in Markdown. + produces: + - application/json + responses: + 200: + description: OK + +definitions: + + + Country: + type: object + properties: + name: + type: string \ No newline at end of file diff --git a/modules/swagger-parser/src/test/resources/nested-external-response-references/sub-folder/common-responses.yaml b/modules/swagger-parser/src/test/resources/nested-external-response-references/sub-folder/common-responses.yaml new file mode 100644 index 0000000000..351e23976f --- /dev/null +++ b/modules/swagger-parser/src/test/resources/nested-external-response-references/sub-folder/common-responses.yaml @@ -0,0 +1,37 @@ +swagger: "2.0" +info: + title: Sample API + description: API description in Markdown. + version: 1.0.0 +host: api.example.com +basePath: /v1 +schemes: + - https +paths: + /users: + get: + summary: Returns a list of users. + description: Optional extended description in Markdown. + produces: + - application/json + responses: + 200: + $ref: '#/responses/Ok200' + +responses: + Ok200: + description: OK + schema: + $ref: '../swagger-root.yaml#/definitions/User' + + Ok201: + description: OK + schema: + $ref: '#/definitions/User' + +definitions: + User: + $ref: '../sub-folder/sub-folder2/common-address.yaml#/definitions/Address' +#BUG + Userx: + $ref: 'sub-folder2/common-address.yaml#/definitions/Address' \ No newline at end of file diff --git a/modules/swagger-parser/src/test/resources/nested-external-response-references/sub-folder/sub-folder2/common-address.yaml b/modules/swagger-parser/src/test/resources/nested-external-response-references/sub-folder/sub-folder2/common-address.yaml new file mode 100644 index 0000000000..1b9c0112ba --- /dev/null +++ b/modules/swagger-parser/src/test/resources/nested-external-response-references/sub-folder/sub-folder2/common-address.yaml @@ -0,0 +1,30 @@ +swagger: "2.0" +info: + title: Sample API + description: API description in Markdown. + version: 1.0.0 +host: api.example.com +basePath: /v1 +schemes: + - https +paths: + /users: + get: + summary: Returns a list of users. + description: Optional extended description in Markdown. + produces: + - application/json + responses: + 200: + description: OK + + +definitions: + + Address: + type: object + properties: + postal: + type: string + country: + $ref: '../common-country.yaml#/definitions/Country' diff --git a/modules/swagger-parser/src/test/resources/nested-external-response-references/swagger-root.yaml b/modules/swagger-parser/src/test/resources/nested-external-response-references/swagger-root.yaml new file mode 100644 index 0000000000..e87ff1efc7 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/nested-external-response-references/swagger-root.yaml @@ -0,0 +1,31 @@ +swagger: "2.0" +info: + title: Sample API + description: API description in Markdown. + version: 1.0.0 +host: api.example.com +basePath: /v1 +schemes: + - https +paths: + /users: + get: + summary: Returns a list of users. + description: Optional extended description in Markdown. + produces: + - application/json + responses: + 200: + $ref: 'sub-folder/common-responses.yaml#/responses/Ok200' + 201: + $ref: './sub-folder/common-responses.yaml#/responses/Ok201' + +definitions: + UserX: + type: object + properties: + address: + $ref: './sub-folder/sub-folder2/common-address.yaml#/definitions/Address' + + User: + $ref: './sub-folder/sub-folder2/common-address.yaml#/definitions/Address' \ No newline at end of file