From 3fd8e340a1c188c2f630e2515a5595e078a5313d Mon Sep 17 00:00:00 2001 From: Mohammed Rizwan Date: Sat, 21 Jul 2018 10:39:55 +0530 Subject: [PATCH 1/2] Fix for issue 765 requestBody not correctly populated when Parameters is a list of $refs (OAS 2 to 3 conversion) --- .../v3/parser/converter/SwaggerConverter.java | 8 +++- .../swagger/parser/test/V2ConverterTest.java | 10 +++++ .../src/test/resources/issue-765.yaml | 43 +++++++++++++++++++ 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 modules/swagger-parser-v2-converter/src/test/resources/issue-765.yaml diff --git a/modules/swagger-parser-v2-converter/src/main/java/io/swagger/v3/parser/converter/SwaggerConverter.java b/modules/swagger-parser-v2-converter/src/main/java/io/swagger/v3/parser/converter/SwaggerConverter.java index b4250e446c..0d0b5a45af 100644 --- a/modules/swagger-parser-v2-converter/src/main/java/io/swagger/v3/parser/converter/SwaggerConverter.java +++ b/modules/swagger-parser-v2-converter/src/main/java/io/swagger/v3/parser/converter/SwaggerConverter.java @@ -532,7 +532,13 @@ public Operation convert(io.swagger.models.Operation v2Operation) { } else if ("body".equals(param.getIn())) { operation.setRequestBody(convertParameterToRequestBody(param, v2Operation.getConsumes())); } else { - operation.addParametersItem(convert(param)); + Parameter convert = convert(param); + String $ref = convert.get$ref(); + if ($ref != null && $ref.startsWith("#/components/requestBodies/")) { + operation.setRequestBody(new RequestBody().$ref($ref)); + } else { + operation.addParametersItem(convert); + } } } diff --git a/modules/swagger-parser-v2-converter/src/test/java/io/swagger/parser/test/V2ConverterTest.java b/modules/swagger-parser-v2-converter/src/test/java/io/swagger/parser/test/V2ConverterTest.java index 4d56529095..eb5c5b3d44 100644 --- a/modules/swagger-parser-v2-converter/src/test/java/io/swagger/parser/test/V2ConverterTest.java +++ b/modules/swagger-parser-v2-converter/src/test/java/io/swagger/parser/test/V2ConverterTest.java @@ -77,6 +77,7 @@ public class V2ConverterTest { private static final String ISSUE_673_YAML = "issue-673.yaml"; private static final String ISSUE_676_JSON = "issue-676.json"; private static final String ISSUE_708_YAML = "issue-708.yaml"; + private static final String ISSUE_765_YAML = "issue-765.yaml"; private static final String API_BATCH_PATH = "/api/batch/"; private static final String PETS_PATH = "/pets"; @@ -616,6 +617,15 @@ public void testIssue708() throws Exception { assertEquals(schema.getPattern(), "^[0-9]+$"); } + @Test(description = "requestBody not correctly populated when Parameters is a list of $refs (OAS 2 to 3 conversion)") + public void testIssue765() throws Exception { + final OpenAPI oas = getConvertedOpenAPIFromJsonFile(ISSUE_765_YAML); + assertNotNull(oas); + RequestBody requestBody = oas.getPaths().get("/ping/{ActivityTypePath}").getPost().getRequestBody(); + assertNotNull(requestBody); + assertEquals("#/components/requestBodies/Block", requestBody.get$ref()); + } + @Test(description = "OpenAPI v2 converter - Missing Parameter.style property") public void testParameterConversion() throws Exception { OpenAPI oas = getConvertedOpenAPIFromJsonFile(PARAMETER_CONVERSION_JSON); diff --git a/modules/swagger-parser-v2-converter/src/test/resources/issue-765.yaml b/modules/swagger-parser-v2-converter/src/test/resources/issue-765.yaml new file mode 100644 index 0000000000..ff046ffec4 --- /dev/null +++ b/modules/swagger-parser-v2-converter/src/test/resources/issue-765.yaml @@ -0,0 +1,43 @@ +swagger: '2.0' +info: + description: 'Test' + version: 1.0.0 + title: OpenAPI Test + license: + name: Apache-2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +host: petstore.swagger.io +basePath: /v2 +schemes: + - http +parameters: + ActivityTypePath: + in: path + name: type + required: true + type: string + Block: + in: body + name: block + required: true + schema: + properties: + visual_type: + type: string + type: object +paths: + /ping/{ActivityTypePath}: + post: + summary: test + description: 'test it' + operationId: pingOp + consumes: + - application/json + produces: + - application/json + parameters: + - $ref: '#/parameters/Block' + - $ref: '#/parameters/ActivityTypePath' + responses: + '200': + description: OK \ No newline at end of file From 3863e1fa84daba84e589ab64e30052fab1911d2a Mon Sep 17 00:00:00 2001 From: Mohammed Rizwan Date: Sat, 21 Jul 2018 11:32:56 +0530 Subject: [PATCH 2/2] Fix for issue 765 --- .../v3/parser/converter/SwaggerConverter.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/modules/swagger-parser-v2-converter/src/main/java/io/swagger/v3/parser/converter/SwaggerConverter.java b/modules/swagger-parser-v2-converter/src/main/java/io/swagger/v3/parser/converter/SwaggerConverter.java index 0d0b5a45af..48f6996c7a 100644 --- a/modules/swagger-parser-v2-converter/src/main/java/io/swagger/v3/parser/converter/SwaggerConverter.java +++ b/modules/swagger-parser-v2-converter/src/main/java/io/swagger/v3/parser/converter/SwaggerConverter.java @@ -80,6 +80,7 @@ public class SwaggerConverter implements SwaggerParserExtension { private List globalConsumes = new ArrayList<>(); private List globalProduces = new ArrayList<>(); private Components components = new Components(); + private Map globalV2Parameters = new HashMap<>(); @Override public SwaggerParseResult readLocation(String url, List auths, ParseOptions options) { @@ -185,6 +186,7 @@ public SwaggerParseResult convert(SwaggerDeserializationResult parse) { } if (swagger.getParameters() != null) { + globalV2Parameters.putAll(swagger.getParameters()); swagger.getParameters().forEach((k, v) -> { if ("body".equals(v.getIn())) { components.addRequestBodies(k, convertParameterToRequestBody(v)); @@ -510,6 +512,16 @@ public PathItem convert(Path v2Path) { return v3Path; } + private boolean isRefABodyParam(io.swagger.models.parameters.Parameter param) { + if (param instanceof RefParameter) { + RefParameter refParameter = (RefParameter) param; + String simpleRef = refParameter.getSimpleRef(); + io.swagger.models.parameters.Parameter parameter = globalV2Parameters.get(simpleRef); + return "body".equals(parameter.getIn()); + } + return false; + } + public Operation convert(io.swagger.models.Operation v2Operation) { Operation operation = new Operation(); if (StringUtils.isNotBlank(v2Operation.getDescription())) { @@ -534,11 +546,12 @@ public Operation convert(io.swagger.models.Operation v2Operation) { } else { Parameter convert = convert(param); String $ref = convert.get$ref(); - if ($ref != null && $ref.startsWith("#/components/requestBodies/")) { + if ($ref != null && $ref.startsWith("#/components/requestBodies/") && isRefABodyParam(param)) { operation.setRequestBody(new RequestBody().$ref($ref)); } else { operation.addParametersItem(convert); } + //operation.addParametersItem(convert(param)); } }