From 7a765decebbc6233482d012d76953f5745c6e562 Mon Sep 17 00:00:00 2001 From: Valentin Valchev Date: Mon, 27 Apr 2020 16:32:57 +0300 Subject: [PATCH 1/2] Fixed #6070 - [BUG][All Languages] Multi-Part content type in response ignores properties of composed schema (allOf/oneOf) https://github.com/OpenAPITools/openapi-generator/issues/6070 This change uses the existing addProperties() method to combine properties of composed schemas. --- .../main/java/org/openapitools/codegen/DefaultCodegen.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index 82cebbf02245..17edf00ddbec 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -5517,8 +5517,11 @@ public List fromRequestBodyToFormParameters(RequestBody body, LOGGER.debug("debugging fromRequestBodyToFormParameters= " + body); Schema schema = ModelUtils.getSchemaFromRequestBody(body); schema = ModelUtils.getReferencedSchema(this.openAPI, schema); - if (schema.getProperties() != null && !schema.getProperties().isEmpty()) { - Map properties = schema.getProperties(); + List allRequired = new ArrayList(); + Map properties = new LinkedHashMap<>(); + addProperties(properties, allRequired, schema); + + if (!properties.isEmpty()) { for (Map.Entry entry : properties.entrySet()) { CodegenParameter codegenParameter = CodegenModelFactory.newInstance(CodegenModelType.PARAMETER); // key => property name From b60e7aaf49cfbcc52a55af9f69032a11c0bf8c1b Mon Sep 17 00:00:00 2001 From: Valentin Valchev Date: Mon, 27 Apr 2020 18:27:18 +0300 Subject: [PATCH 2/2] added unit test --- .../codegen/DefaultCodegenTest.java | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java index bebe90010f73..43b308c65e19 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java @@ -1995,4 +1995,73 @@ public void testUseOneOfInterfaces() { Schema items = ((ArraySchema) openAPI.getComponents().getSchemas().get("CustomOneOfArraySchema")).getItems(); Assert.assertEquals(items.getExtensions().get("x-one-of-name"), "CustomOneOfArraySchemaOneOf"); } + + @Test + public void testFormComposedSchema() { + OpenAPI openAPI = TestUtils.parseContent("openapi: 3.0.1\n" + + "info:\n" + + " version: '1.0.0'\n" + + " title: the title\n" + + "\n" + + "paths:\n" + + " '/users/me':\n" + + " post:\n" + + " description: Change user password.\n" + + " operationId: changeCurrentUserPassword\n" + + " requestBody:\n" + + " required: true\n" + + " content:\n" + + " multipart/form-data:\n" + + " schema:\n" + + " $ref: '#/components/schemas/ChangePasswordRequest'\n" + + " responses:\n" + + " '200':\n" + + " description: Successful operation\n" + + " content: {}\n" + + "\n" + + "components:\n" + + " schemas:\n" + + " CommonPasswordRequest:\n" + + " type: object\n" + + " required: [ password, passwordConfirmation ]\n" + + " properties:\n" + + " password:\n" + + " type: string\n" + + " format: password\n" + + " passwordConfirmation:\n" + + " type: string\n" + + " format: password\n" + + "\n" + + " ChangePasswordRequest:\n" + + " type: object\n" + + " allOf:\n" + + " - $ref: '#/components/schemas/CommonPasswordRequest'\n" + + " - type: object\n" + + " required: [ oldPassword ]\n" + + " properties:\n" + + " oldPassword:\n" + + " type: string\n" + + " format: password\n"); + + final DefaultCodegen cg = new DefaultCodegen(); + cg.setOpenAPI(openAPI); + cg.setUseOneOfInterfaces(true); + cg.preprocessOpenAPI(openAPI); + + final PathItem path = openAPI.getPaths().get("/users/me"); + final CodegenOperation operation = cg.fromOperation( + "/users/me", + "post", + path.getPost(), + path.getServers()); + assertEquals(operation.formParams.size(), 3, + "The list of parameters should include inherited type"); + + final List names = operation.formParams.stream() + .map(param -> param.paramName) + .collect(Collectors.toList()); + assertTrue(names.contains("password")); + assertTrue(names.contains("passwordConfirmation")); + assertTrue(names.contains("oldPassword")); + } }