From d3ebb0a52bafa4c32dcd682917fc34b6820981d4 Mon Sep 17 00:00:00 2001 From: Georgi Getsov <4756859+g-getsov@users.noreply.github.com> Date: Fri, 1 Mar 2024 03:23:53 +0000 Subject: [PATCH] Fix 3.1 generation for composed schema's with type object (#18002) --- .../openapitools/codegen/DefaultCodegen.java | 2 +- .../codegen/java/JavaClientCodegenTest.java | 29 +++++++ ...omposed-schemas-with-and-without-type.yaml | 83 +++++++++++++++++++ 3 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 modules/openapi-generator/src/test/resources/3_1/composed-schemas-with-and-without-type.yaml 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 e63277d05bc2..b37cf51c605a 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 @@ -7526,7 +7526,7 @@ protected void updateRequestBodyForObject(CodegenParameter codegenParameter, Sch } // set nullable setParameterNullable(codegenParameter, codegenProperty); - } else if (ModelUtils.isObjectSchema(schema)) { + } else if (ModelUtils.isObjectSchema(schema) || ModelUtils.isComposedSchema(schema)) { // object type schema or composed schema with properties defined this.addBodyModelSchema(codegenParameter, name, schema, imports, bodyParameterName, false); } diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java index c68d1b52fe26..e3d026d447a7 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java @@ -794,6 +794,35 @@ public void testAuthorizationScopeValues_Issue6733() throws IOException { files.forEach(File::deleteOnExit); } + @Test + public void testTypedAndNonTypedComposedSchemaGeneration_3_1() throws IOException { + File output = Files.createTempDirectory("test").toFile(); + output.deleteOnExit(); + + final CodegenConfigurator configurator = new CodegenConfigurator() + .setGeneratorName("java") + .setLibrary(JavaClientCodegen.RESTEASY) + .setValidateSpec(false) + .setInputSpec("src/test/resources/3_1/composed-schemas-with-and-without-type.yaml") + .setOutputDir(output.getAbsolutePath().replace("\\", "/")); + + final ClientOptInput clientOptInput = configurator.toClientOptInput(); + + DefaultGenerator generator = new DefaultGenerator(); + generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); + generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); + generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); + generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); + generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); + generator.setGenerateMetadata(false); + List files = generator.opts(clientOptInput).generate(); + + validateJavaSourceFiles(files); + + Assert.assertEquals(files.size(), 9); + files.forEach(File::deleteOnExit); + } + @Test public void testMultiPartSpecifiesFileName_Issue17367() throws IOException { File output = Files.createTempDirectory("test").toFile(); diff --git a/modules/openapi-generator/src/test/resources/3_1/composed-schemas-with-and-without-type.yaml b/modules/openapi-generator/src/test/resources/3_1/composed-schemas-with-and-without-type.yaml new file mode 100644 index 000000000000..723784bcccbb --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_1/composed-schemas-with-and-without-type.yaml @@ -0,0 +1,83 @@ +openapi: 3.1.0 +info: + version: 1.0.0 + title: Example + license: + name: MIT +servers: + - url: http://api.example.xyz/v1 +paths: + /pets: + patch: + requestBody: + content: + application/json: + schema: + type: object + oneOf: + - $ref: '#/components/schemas/Cat' + - $ref: '#/components/schemas/Dog' + - description: Any kind of pet + discriminator: + propertyName: pet_type + responses: + '200': + description: Updated + /pets-filtered: + patch: + requestBody: + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/PetByAge' + - $ref: '#/components/schemas/PetByType' + - description: Any kind of filter + responses: + '200': + description: Updated +components: + schemas: + Pet: + type: object + required: + - pet_type + Dog: + allOf: + - description: Dog information + - $ref: '#/components/schemas/Pet' + - type: object + properties: + bark: + type: boolean + breed: + type: string + enum: [Dingo, Husky, Retriever, Shepherd] + Cat: + allOf: + - $ref: '#/components/schemas/Pet' + - type: object + properties: + hunts: + type: boolean + age: + type: integer + PetByAge: + type: object + properties: + age: + type: integer + nickname: + type: string + required: + - age + PetByType: + type: object + properties: + pet_type: + type: string + enum: [Cat, Dog] + hunts: + type: boolean + required: + - pet_type \ No newline at end of file