Skip to content

Commit e101a41

Browse files
authored
Merge pull request #331 from skrysmanski/fix/required-form-params
Mark form parameters as required when body is required
2 parents 23875f7 + d33e141 commit e101a41

File tree

3 files changed

+119
-0
lines changed

3 files changed

+119
-0
lines changed

src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2033,13 +2033,17 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation
20332033
for (String propertyName : propertyMap.keySet()) {
20342034
CodegenParameter formParameter = fromParameter(new Parameter()
20352035
.name(propertyName)
2036+
.required(body.getRequired())
20362037
.schema(propertyMap.get(propertyName)), imports);
20372038
if (isMultipart) {
20382039
formParameter.getVendorExtensions().put(CodegenConstants.IS_MULTIPART_EXT_NAME, Boolean.TRUE);
20392040
}
20402041
// 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.
20412042
formParameter.getVendorExtensions().put(CodegenConstants.IS_FORM_PARAM_EXT_NAME, Boolean.TRUE);
20422043
formParams.add(formParameter.copy());
2044+
if (body.getRequired()) {
2045+
requiredParams.add(formParameter.copy());
2046+
}
20432047
allParams.add(formParameter);
20442048

20452049
codegenContent.getParameters().add(formParameter.copy());

src/test/java/io/swagger/codegen/v3/generators/DefaultCodegenConfigTest.java

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,77 @@ public void testRequestBodyRefConsumesList() {
186186
Assert.assertEquals(codegenOp.consumes.get(1).get("mediaType"), "application/xml");
187187
}
188188

189+
/**
190+
* Tests when a 'application/x-www-form-urlencoded' request body is marked as required that all form
191+
* params are also marked as required.
192+
*
193+
* @see #testOptionalFormParams()
194+
*/
195+
@Test
196+
public void testRequiredFormParams() {
197+
// Setup
198+
final P_DefaultCodegenConfig codegen = new P_DefaultCodegenConfig();
199+
200+
final OpenAPI openAPI = new OpenAPIV3Parser().read("src/test/resources/3_0_0/requiredFormParamsTest.yaml");
201+
final String path = "/test_required";
202+
203+
final Operation op = openAPI.getPaths().get(path).getPost();
204+
Assert.assertNotNull(op);
205+
206+
// Test
207+
final CodegenOperation codegenOp = codegen.fromOperation(path, "post", op, openAPI.getComponents().getSchemas(), openAPI);
208+
209+
// Verification
210+
List<CodegenParameter> formParams = codegenOp.getFormParams();
211+
Assert.assertNotNull(formParams);
212+
Assert.assertEquals(formParams.size(), 2);
213+
214+
for (CodegenParameter formParam : formParams) {
215+
Assert.assertTrue(formParam.getRequired(), "Form param '" + formParam.getParamName() + "' is not required.");
216+
}
217+
218+
// Required params must be updated as well.
219+
List<CodegenParameter> requiredParams = codegenOp.getRequiredParams();
220+
Assert.assertNotNull(requiredParams);
221+
Assert.assertEquals(requiredParams.size(), 2);
222+
requiredParams.get(0).getParamName().equals("id");
223+
requiredParams.get(1).getParamName().equals("name");
224+
}
225+
226+
/**
227+
* Tests when a 'application/x-www-form-urlencoded' request body is marked as optional that all form
228+
* params are also marked as optional.
229+
*
230+
* @see #testRequiredFormParams()
231+
*/
232+
@Test
233+
public void testOptionalFormParams() {
234+
// Setup
235+
final P_DefaultCodegenConfig codegen = new P_DefaultCodegenConfig();
236+
237+
final OpenAPI openAPI = new OpenAPIV3Parser().read("src/test/resources/3_0_0/requiredFormParamsTest.yaml");
238+
final String path = "/test_optional";
239+
240+
final Operation op = openAPI.getPaths().get(path).getPost();
241+
Assert.assertNotNull(op);
242+
243+
// Test
244+
final CodegenOperation codegenOp = codegen.fromOperation(path, "post", op, openAPI.getComponents().getSchemas(), openAPI);
245+
246+
// Verification
247+
List<CodegenParameter> formParams = codegenOp.getFormParams();
248+
Assert.assertNotNull(formParams);
249+
Assert.assertEquals(formParams.size(), 2);
250+
251+
for (CodegenParameter formParam : formParams) {
252+
Assert.assertFalse(formParam.getRequired(), "Form param '" + formParam.getParamName() + "' is required.");
253+
}
254+
255+
// Required params must be updated as well.
256+
List<CodegenParameter> requiredParams = codegenOp.getRequiredParams();
257+
Assert.assertTrue(requiredParams == null || requiredParams.size() == 0);
258+
}
259+
189260
private static class P_DefaultCodegenConfig extends DefaultCodegenConfig{
190261
@Override
191262
public String getArgumentsLocation() {
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
openapi: 3.0.0
2+
info:
3+
title: Test Api
4+
version: '3.0.0'
5+
6+
paths:
7+
/test_required:
8+
post:
9+
summary: Operation with form body that is required
10+
operationId: get_with_required_body
11+
requestBody:
12+
required: true
13+
content:
14+
application/x-www-form-urlencoded:
15+
schema:
16+
$ref: '#/components/schemas/Category'
17+
responses:
18+
"200":
19+
description: Success
20+
21+
/test_optional:
22+
post:
23+
summary: Operation with form body that is optional
24+
operationId: get_with_optional_body
25+
requestBody:
26+
required: false
27+
content:
28+
application/x-www-form-urlencoded:
29+
schema:
30+
$ref: '#/components/schemas/Category'
31+
responses:
32+
"200":
33+
description: Success
34+
35+
components:
36+
schemas:
37+
Category:
38+
type: object
39+
properties:
40+
id:
41+
type: integer
42+
format: int64
43+
name:
44+
type: string

0 commit comments

Comments
 (0)