Skip to content

Commit 794161f

Browse files
FIX #21407 - use referenced enum schema in request body if one is available
1 parent 88bba25 commit 794161f

File tree

3 files changed

+183
-8
lines changed

3 files changed

+183
-8
lines changed

modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7804,8 +7804,15 @@ protected void updateRequestBodyForArray(CodegenParameter codegenParameter, Sche
78047804
}
78057805
}
78067806

7807-
protected void updateRequestBodyForString(CodegenParameter codegenParameter, Schema schema, Set<String> imports, String bodyParameterName) {
7808-
updateRequestBodyForPrimitiveType(codegenParameter, schema, bodyParameterName, imports);
7807+
protected void updateRequestBodyForString(CodegenParameter codegenParameter, Schema schema, String name, Set<String> imports, String bodyParameterName) {
7808+
// when a name is present, it means that the schema has a $ref to a schema defined under /components/schemas
7809+
// in the OAS document
7810+
if (!StringUtils.isEmpty(name)) {
7811+
addBodyModelSchema(codegenParameter, name, schema, imports, bodyParameterName, false);
7812+
} else {
7813+
updateRequestBodyForPrimitiveType(codegenParameter, schema, bodyParameterName, imports);
7814+
}
7815+
78097816
if (ModelUtils.isByteArraySchema(schema)) {
78107817
codegenParameter.setIsString(false);
78117818
codegenParameter.isByteArray = true;
@@ -8006,7 +8013,7 @@ public CodegenParameter fromRequestBody(RequestBody body, Set<String> imports, S
80068013
// swagger v2 only, type file
80078014
codegenParameter.isFile = true;
80088015
} else if (ModelUtils.isStringSchema(schema)) {
8009-
updateRequestBodyForString(codegenParameter, schema, imports, bodyParameterName);
8016+
updateRequestBodyForString(codegenParameter, schema, name, imports, bodyParameterName);
80108017
} else if (ModelUtils.isNumberSchema(schema)) {
80118018
updateRequestBodyForPrimitiveType(codegenParameter, schema, bodyParameterName, imports);
80128019
codegenParameter.isNumeric = Boolean.TRUE;

modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java

Lines changed: 108 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,16 @@
3030
import io.swagger.v3.oas.models.Operation;
3131
import io.swagger.v3.oas.models.PathItem;
3232
import io.swagger.v3.oas.models.headers.Header;
33-
import io.swagger.v3.oas.models.media.*;
33+
import io.swagger.v3.oas.models.media.ArraySchema;
34+
import io.swagger.v3.oas.models.media.Content;
35+
import io.swagger.v3.oas.models.media.Encoding;
36+
import io.swagger.v3.oas.models.media.IntegerSchema;
37+
import io.swagger.v3.oas.models.media.MapSchema;
38+
import io.swagger.v3.oas.models.media.MediaType;
39+
import io.swagger.v3.oas.models.media.NumberSchema;
40+
import io.swagger.v3.oas.models.media.ObjectSchema;
41+
import io.swagger.v3.oas.models.media.Schema;
42+
import io.swagger.v3.oas.models.media.StringSchema;
3443
import io.swagger.v3.oas.models.parameters.QueryParameter;
3544
import io.swagger.v3.oas.models.parameters.RequestBody;
3645
import io.swagger.v3.oas.models.responses.ApiResponse;
@@ -43,7 +52,11 @@
4352
import org.openapitools.codegen.languages.SpringCodegen;
4453
import org.openapitools.codegen.model.ModelMap;
4554
import org.openapitools.codegen.model.ModelsMap;
46-
import org.openapitools.codegen.templating.mustache.*;
55+
import org.openapitools.codegen.templating.mustache.CamelCaseAndSanitizeLambda;
56+
import org.openapitools.codegen.templating.mustache.IndentedLambda;
57+
import org.openapitools.codegen.templating.mustache.LowercaseLambda;
58+
import org.openapitools.codegen.templating.mustache.TitlecaseLambda;
59+
import org.openapitools.codegen.templating.mustache.UppercaseLambda;
4760
import org.openapitools.codegen.utils.ModelUtils;
4861
import org.openapitools.codegen.utils.SemVer;
4962
import org.slf4j.LoggerFactory;
@@ -52,13 +65,35 @@
5265
import org.testng.annotations.Test;
5366

5467
import java.io.File;
68+
import java.io.IOException;
5569
import java.nio.file.Files;
56-
import java.util.*;
57-
import java.util.concurrent.*;
70+
import java.util.ArrayList;
71+
import java.util.Arrays;
72+
import java.util.Collections;
73+
import java.util.HashMap;
74+
import java.util.HashSet;
75+
import java.util.LinkedHashMap;
76+
import java.util.LinkedHashSet;
77+
import java.util.List;
78+
import java.util.Locale;
79+
import java.util.Map;
80+
import java.util.Objects;
81+
import java.util.Optional;
82+
import java.util.Set;
83+
import java.util.TreeSet;
84+
import java.util.concurrent.ExecutionException;
85+
import java.util.concurrent.ExecutorService;
86+
import java.util.concurrent.Executors;
87+
import java.util.concurrent.Future;
5888
import java.util.stream.Collectors;
5989

6090
import static org.assertj.core.api.Assertions.assertThat;
61-
import static org.junit.jupiter.api.Assertions.*;
91+
import static org.junit.jupiter.api.Assertions.assertEquals;
92+
import static org.junit.jupiter.api.Assertions.assertFalse;
93+
import static org.junit.jupiter.api.Assertions.assertNotNull;
94+
import static org.junit.jupiter.api.Assertions.assertNull;
95+
import static org.junit.jupiter.api.Assertions.assertTrue;
96+
import static org.junit.jupiter.api.Assertions.fail;
6297

6398
public class DefaultCodegenTest {
6499

@@ -5057,4 +5092,72 @@ private List<String> getNames(List<CodegenProperty> props) {
50575092
if (props == null) return null;
50585093
return props.stream().map(v -> v.name).collect(Collectors.toList());
50595094
}
5095+
5096+
@Test
5097+
public void testRequestBodyWith$RefToEnumSchema() {
5098+
// Given
5099+
OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_1/issue_21407.yaml");
5100+
DefaultCodegen codegen = new DefaultCodegen();
5101+
codegen.setOpenAPI(openAPI);
5102+
String path = "/v1/resource-class/send-with-$ref-to-enum-schema";
5103+
5104+
// When
5105+
CodegenOperation codegenOperation = codegen.fromOperation(path, "POST", openAPI.getPaths().get(path).getPost(), null);
5106+
5107+
// Then
5108+
assertThat(codegenOperation.bodyParam).satisfies(bodyParam -> {
5109+
assertThat(bodyParam).isNotNull();
5110+
assertThat(bodyParam.getDataType()).isEqualTo("Letter");
5111+
});
5112+
}
5113+
5114+
@Test
5115+
public void testRequestBodyWithInlineEnumSchema() throws IOException {
5116+
// Given
5117+
OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_1/issue_21407.yaml");
5118+
File outputDir = Files.createTempDirectory("test").toFile();
5119+
5120+
CodegenConfigurator configurator = new CodegenConfigurator()
5121+
.setGeneratorName("java")
5122+
.setInputSpec("src/test/resources/3_1/issue_21407.yaml")
5123+
.addInlineSchemaOption("RESOLVE_INLINE_ENUMS", "true")
5124+
.setOutputDir(outputDir.getAbsolutePath());
5125+
5126+
ClientOptInput clientOptInput = configurator.toClientOptInput();
5127+
clientOptInput.openAPI(openAPI);
5128+
5129+
DefaultGenerator generator = new DefaultGenerator();
5130+
generator.opts(clientOptInput).generate();
5131+
5132+
String path = "/v1/resource-class/send-with-inline-enum-schema";
5133+
5134+
// When
5135+
CodegenOperation codegenOperation = generator.config.fromOperation(path, "POST", openAPI.getPaths().get(path).getPost(), null);
5136+
5137+
// Then
5138+
assertThat(codegenOperation.bodyParam).satisfies(bodyParam -> {
5139+
assertThat(bodyParam).isNotNull();
5140+
// expecting a type that is different from String
5141+
assertThat(bodyParam.getDataType()).isEqualTo("SendWithInlineEnumSchemaRequest");
5142+
});
5143+
}
5144+
5145+
@Test
5146+
public void testRequestBodyWithStringType() {
5147+
// Given
5148+
OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_1/issue_21407.yaml");
5149+
DefaultCodegen codegen = new DefaultCodegen();
5150+
codegen.setOpenAPI(openAPI);
5151+
String path = "/v1/resource-class/send-with-string";
5152+
5153+
// When
5154+
CodegenOperation codegenOperation = codegen.fromOperation(path, "POST", openAPI.getPaths().get(path).getPost(), null);
5155+
5156+
// Then
5157+
assertThat(codegenOperation.bodyParam).satisfies(bodyParam -> {
5158+
assertThat(bodyParam).isNotNull();
5159+
assertThat(bodyParam.getDataType()).isEqualTo("String");
5160+
});
5161+
}
5162+
50605163
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
openapi: 3.1.0
2+
info:
3+
title: sample spec
4+
description: "Sample spec"
5+
version: 0.0.1
6+
tags:
7+
- name: ResourceClass
8+
paths:
9+
/v1/resource-class/send-with-$ref-to-enum-schema:
10+
post:
11+
tags:
12+
- ResourceClass
13+
description: Add @Operation annotation to provide a description
14+
operationId: send-with-$ref-to-enum-schema
15+
requestBody:
16+
content:
17+
application/json:
18+
schema:
19+
$ref: "#/components/schemas/Letter"
20+
responses:
21+
"200":
22+
description: OK - the request has succeeded.
23+
content:
24+
application/json:
25+
schema:
26+
$ref: "#/components/schemas/Letter"
27+
/v1/resource-class/send-with-string:
28+
post:
29+
tags:
30+
- ResourceClass
31+
description: Add @Operation annotation to provide a description
32+
operationId: send-with-string
33+
requestBody:
34+
content:
35+
application/json:
36+
schema:
37+
type: string
38+
responses:
39+
"204":
40+
description: "No Content - the request has been successfully processed,\
41+
\ but there is no additional content."
42+
/v1/resource-class/send-with-inline-enum-schema:
43+
post:
44+
tags:
45+
- ResourceClass
46+
description: Add @Operation annotation to provide a description
47+
operationId: send-with-inline-enum-schema
48+
requestBody:
49+
content:
50+
application/json:
51+
schema:
52+
type: string
53+
enum:
54+
- B
55+
responses:
56+
"204":
57+
description: "No Content - the request has been successfully processed,\
58+
\ but there is no additional content."
59+
components:
60+
schemas:
61+
Letter:
62+
type: string
63+
enum:
64+
- A
65+
jsonSchemaDialect: https://spec.openapis.org/oas/3.1/dialect/base

0 commit comments

Comments
 (0)