From 6647407fd2361db632f8940a6f0e6d4888ad6d56 Mon Sep 17 00:00:00 2001 From: Sebastian Krysmanski Date: Sun, 17 Mar 2019 11:22:15 +0100 Subject: [PATCH 1/2] Form parameters are now marked as "required" when the request body itself is marked as "required". --- .../v3/generators/DefaultCodegenConfig.java | 4 ++ .../generators/DefaultCodegenConfigTest.java | 71 +++++++++++++++++++ .../3_0_0/requiredFormParamsTest.yaml | 44 ++++++++++++ 3 files changed, 119 insertions(+) create mode 100644 src/test/resources/3_0_0/requiredFormParamsTest.yaml diff --git a/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java b/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java index e4ff43f023..296e033d09 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java +++ b/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java @@ -2033,6 +2033,7 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation for (String propertyName : propertyMap.keySet()) { CodegenParameter formParameter = fromParameter(new Parameter() .name(propertyName) + .required(body.getRequired()) .schema(propertyMap.get(propertyName)), imports); if (isMultipart) { formParameter.getVendorExtensions().put(CodegenConstants.IS_MULTIPART_EXT_NAME, Boolean.TRUE); @@ -2040,6 +2041,9 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation // todo: this segment is only to support the "older" template design. it should be removed once all templates are updated with the new {{#contents}} tag. formParameter.getVendorExtensions().put(CodegenConstants.IS_FORM_PARAM_EXT_NAME, Boolean.TRUE); formParams.add(formParameter.copy()); + if (body.getRequired()) { + requiredParams.add(formParameter.copy()); + } allParams.add(formParameter); codegenContent.getParameters().add(formParameter.copy()); diff --git a/src/test/java/io/swagger/codegen/v3/generators/DefaultCodegenConfigTest.java b/src/test/java/io/swagger/codegen/v3/generators/DefaultCodegenConfigTest.java index 7c6d53d3e4..d8db0c8e72 100644 --- a/src/test/java/io/swagger/codegen/v3/generators/DefaultCodegenConfigTest.java +++ b/src/test/java/io/swagger/codegen/v3/generators/DefaultCodegenConfigTest.java @@ -186,6 +186,77 @@ public void testRequestBodyRefConsumesList() { Assert.assertEquals(codegenOp.consumes.get(1).get("mediaType"), "application/xml"); } + /** + * Tests when a 'application/x-www-form-urlencoded' request body is marked as required that all form + * params are also marked as required. + * + * @see #testOptionalFormParams() + */ + @Test + public void testRequiredFormParams() { + // Setup + final P_DefaultCodegenConfig codegen = new P_DefaultCodegenConfig(); + + final OpenAPI openAPI = new OpenAPIV3Parser().read("src/test/resources/3_0_0/requiredFormParamsTest.yaml"); + final String path = "/test_required"; + + final Operation op = openAPI.getPaths().get(path).getPost(); + Assert.assertNotNull(op); + + // Test + final CodegenOperation codegenOp = codegen.fromOperation(path, "post", op, openAPI.getComponents().getSchemas(), openAPI); + + // Verification + List formParams = codegenOp.getFormParams(); + Assert.assertNotNull(formParams); + Assert.assertEquals(formParams.size(), 2); + + for (CodegenParameter formParam : formParams) { + Assert.assertTrue(formParam.getRequired(), "Form param '" + formParam.getParamName() + "' is not required."); + } + + // Required params must be updated as well. + List requiredParams = codegenOp.getRequiredParams(); + Assert.assertNotNull(requiredParams); + Assert.assertEquals(requiredParams.size(), 2); + requiredParams.get(0).getParamName().equals("id"); + requiredParams.get(1).getParamName().equals("name"); + } + + /** + * Tests when a 'application/x-www-form-urlencoded' request body is marked as optional that all form + * params are also marked as optional. + * + * @see #testRequiredFormParams() + */ + @Test + public void testOptionalFormParams() { + // Setup + final P_DefaultCodegenConfig codegen = new P_DefaultCodegenConfig(); + + final OpenAPI openAPI = new OpenAPIV3Parser().read("src/test/resources/3_0_0/requiredFormParamsTest.yaml"); + final String path = "/test_optional"; + + final Operation op = openAPI.getPaths().get(path).getPost(); + Assert.assertNotNull(op); + + // Test + final CodegenOperation codegenOp = codegen.fromOperation(path, "post", op, openAPI.getComponents().getSchemas(), openAPI); + + // Verification + List formParams = codegenOp.getFormParams(); + Assert.assertNotNull(formParams); + Assert.assertEquals(formParams.size(), 2); + + for (CodegenParameter formParam : formParams) { + Assert.assertFalse(formParam.getRequired(), "Form param '" + formParam.getParamName() + "' is required."); + } + + // Required params must be updated as well. + List requiredParams = codegenOp.getRequiredParams(); + Assert.assertTrue(requiredParams == null || requiredParams.size() == 0); + } + private static class P_DefaultCodegenConfig extends DefaultCodegenConfig{ @Override public String getArgumentsLocation() { diff --git a/src/test/resources/3_0_0/requiredFormParamsTest.yaml b/src/test/resources/3_0_0/requiredFormParamsTest.yaml new file mode 100644 index 0000000000..f6cf58ebc1 --- /dev/null +++ b/src/test/resources/3_0_0/requiredFormParamsTest.yaml @@ -0,0 +1,44 @@ +openapi: 3.0.0 +info: + title: Test Api + version: '3.0.0' + +paths: + /test_required: + post: + summary: Operation with form body that is required + operationId: get_with_required_body + requestBody: + required: true + content: + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/Category' + responses: + "200": + description: Success + + /test_optional: + post: + summary: Operation with form body that is required + operationId: get_with_required_body + requestBody: + required: false + content: + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/Category' + responses: + "200": + description: Success + +components: + schemas: + Category: + type: object + properties: + id: + type: integer + format: int64 + name: + type: string From d33e14170781eccb1ff530095f1602c784ecf307 Mon Sep 17 00:00:00 2001 From: Sebastian Krysmanski Date: Sun, 17 Mar 2019 11:25:29 +0100 Subject: [PATCH 2/2] Fixed copy paste error --- src/test/resources/3_0_0/requiredFormParamsTest.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/resources/3_0_0/requiredFormParamsTest.yaml b/src/test/resources/3_0_0/requiredFormParamsTest.yaml index f6cf58ebc1..a738e7b4fb 100644 --- a/src/test/resources/3_0_0/requiredFormParamsTest.yaml +++ b/src/test/resources/3_0_0/requiredFormParamsTest.yaml @@ -20,8 +20,8 @@ paths: /test_optional: post: - summary: Operation with form body that is required - operationId: get_with_required_body + summary: Operation with form body that is optional + operationId: get_with_optional_body requestBody: required: false content: