Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -726,8 +726,12 @@ public Schema normalizeSchema(Schema schema, Set<Schema> visitedSchemas) {
normalizeSchema(result.getItems(), visitedSchemas);
return result;
} else if (schema.getAdditionalProperties() instanceof Schema) { // map
normalizeMapSchema(schema);
normalizeSchema((Schema) schema.getAdditionalProperties(), visitedSchemas);
if(!ModelUtils.isModelWithPropertiesOnly(schema)) {
normalizeMapSchema(schema);
normalizeSchema((Schema) schema.getAdditionalProperties(), visitedSchemas);
} else {
normalizeProperties(schema.getProperties(), visitedSchemas);
}
} else if (ModelUtils.isOneOf(schema)) { // oneOf
return normalizeOneOf(schema, visitedSchemas);
} else if (ModelUtils.isAnyOf(schema)) { // anyOf
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import org.junit.jupiter.api.Assertions;
import org.openapitools.codegen.config.CodegenConfigurator;
import org.openapitools.codegen.config.GlobalSettings;
import org.openapitools.codegen.java.assertions.JavaFileAssert;
import org.openapitools.codegen.languages.SpringCodegen;
import org.openapitools.codegen.model.ModelMap;
import org.openapitools.codegen.model.ModelsMap;
Expand All @@ -55,6 +56,7 @@
import java.nio.file.Files;
import java.util.*;
import java.util.concurrent.*;
import java.util.function.Function;
import java.util.stream.Collectors;

import static org.assertj.core.api.Assertions.assertThat;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -939,6 +939,11 @@ public void testOpenAPINormalizerSimplifyOneOfAnyOf31Spec() {
assertEquals(schema22.getAnyOf(), null);
assertEquals(schema22.getTypes(), Set.of("string"));
assertEquals(schema22.getEnum().size(), 2);

Schema schema23 = openAPI.getComponents().getSchemas().get("AnyOfNullableAdditionalPropertiesTest");
assertEquals(((Schema) schema23.getProperties().get("str")).getAnyOf(), null);
assertTrue(((Schema) schema23.getProperties().get("str")).getNullable());
assertEquals(schema22.getTypes(), Set.of("string"));
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.entry;
import static org.assertj.core.api.InstanceOfAssertFactories.FILE;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.openapitools.codegen.CodegenConstants.*;
import static org.openapitools.codegen.TestUtils.*;
import static org.openapitools.codegen.languages.JavaClientCodegen.*;
Expand Down Expand Up @@ -3833,6 +3834,30 @@ public void queryParameterJsonSerialization(String library) {
);
}

@Test(description = "Issue #20213")
public void givenModelHasFalseAdditionalPropertiesAndPropertyHasNullAsAnyOfTypeThenModelIsCorrect() throws Exception {
File output = Files.createTempDirectory("test").toFile();
output.deleteOnExit();

final CodegenConfigurator configurator = new CodegenConfigurator()
.setGeneratorName("java")
.setInputSpec("src/test/resources/3_1/issue_20213.yaml")
.setOutputDir(output.getAbsolutePath().replace("\\", "/"));

final ClientOptInput clientOptInput = configurator.toClientOptInput();
DefaultGenerator defaultGenerator = new DefaultGenerator();
Map<String, File> fileMap = defaultGenerator.opts(clientOptInput).generate()
.stream().collect(Collectors.toMap(File::getName, Function.identity()));

JavaFileAssert.assertThat(fileMap.get("SampleObjectWithAdditionalFalse.java"))
.assertProperty("someString")
.withType("String")
.assertPropertyAnnotations()
.containsWithName("javax.annotation.Nullable");
assertFalse(fileMap.containsKey("SampleObjectWithAdditionalFalseSomeString.java"));

}

@DataProvider(name = "springClients")
public static Object[] springClients() {
return new Object[]{RESTCLIENT, WEBCLIENT};
Expand Down
30 changes: 30 additions & 0 deletions modules/openapi-generator/src/test/resources/3_1/issue_20213.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# filename: nullable-properties-with-additional-properties-false.yaml
openapi: 3.1.0
info:
title: ""
version: 1.0.0
components:
schemas:
# For reference, an object without additionalProperties: false, but with nullable properties
SampleObject:
properties:
someString:
anyOf:
- type: string
- type: 'null'

# For reference, an object with additionalProperties: false, but without any nullable properties
ReferenceObject:
additionalProperties: false
properties:
someString:
type: string

# The broken case: an object with additionalProperties: false and nullable properties
SampleObjectWithAdditionalFalse:
additionalProperties: false
properties:
someString:
anyOf:
- type: string
- type: 'null'
Original file line number Diff line number Diff line change
Expand Up @@ -137,4 +137,14 @@ components:
OneOfNullAndRef3:
oneOf:
- $ref: '#/components/schemas/Parent'
- type: "null"
- type: "null"
AnyOfNullableAdditionalPropertiesTest:
description: to test anyOf with additional properties
additionalProperties: false
properties:
str:
anyOf:
- type: string
- type: 'null'
- type: null
- $ref: null
Loading