fix allOf with properties for ref as parent rule (#20083)

This commit is contained in:
William Cheng 2024-11-13 21:27:19 +08:00 committed by GitHub
parent a95ea1f519
commit 301af6050b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 42 additions and 7 deletions

View File

@ -755,6 +755,9 @@ public class OpenAPINormalizer {
return schema;
}
// process rule to refactor properties into allOf sub-schema
schema = processRefactorAllOfWithPropertiesOnly(schema);
for (Object item : schema.getAllOf()) {
if (!(item instanceof Schema)) {
throw new RuntimeException("Error! allOf schema is not of the type Schema: " + item);
@ -762,8 +765,6 @@ public class OpenAPINormalizer {
// normalize allOf sub schemas one by one
normalizeSchema((Schema) item, visitedSchemas);
}
// process rules here
schema = processRefactorAllOfWithPropertiesOnly(schema);
return schema;
}
@ -1325,9 +1326,8 @@ public class OpenAPINormalizer {
schema.setTitle(null);
// at this point the schema becomes a simple allOf (no properties) with an additional schema containing
// the properties
return schema;
// the properties. Normalize it before returning.
return normalizeSchema(schema, new HashSet<>());
}
/**

View File

@ -56,6 +56,30 @@ public class OpenAPINormalizerTest {
assertEquals(schema5.getExtensions().get("x-parent"), "abstract");
}
@Test
public void testOpenAPINormalizerRefAsParentInAllOfAndRefactorAllOfWithProperties() {
// to test the both REF_AS_PARENT_IN_ALLOF and REFACTOR_ALLOF_WITH_PROPERTIES_ONLY
OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/allOf_extension_parent.yaml");
Schema schema = openAPI.getComponents().getSchemas().get("Child");
assertNull(schema.getExtensions());
Schema schema2 = openAPI.getComponents().getSchemas().get("Ancestor");
assertNull(schema2.getExtensions());
Map<String, String> options = new HashMap<>();
options.put("REF_AS_PARENT_IN_ALLOF", "true");
options.put("REFACTOR_ALLOF_WITH_PROPERTIES_ONLY", "true");
OpenAPINormalizer openAPINormalizer = new OpenAPINormalizer(openAPI, options);
openAPINormalizer.normalize();
Schema schema3 = openAPI.getComponents().getSchemas().get("Ancestor");
assertEquals(schema3.getExtensions().get("x-parent"), true);
Schema schema4 = openAPI.getComponents().getSchemas().get("Child");
assertNull(schema4.getExtensions());
}
@Test
public void testOpenAPINormalizerEnableKeepOnlyFirstTagInOperation() {
OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/enableKeepOnlyFirstTagInOperation_test.yaml");

View File

@ -1776,7 +1776,7 @@ public class JavaClientCodegenTest {
List<File> files = generator.opts(configurator.toClientOptInput()).generate();
validateJavaSourceFiles(files);
assertThat(files).hasSize(27);
assertThat(files).hasSize(33);
assertThat(output.resolve("src/main/java/xyz/abcdef/model/Child.java"))
.content().contains("public class Child extends Person {");
assertThat(output.resolve("src/main/java/xyz/abcdef/model/Adult.java"))

View File

@ -101,4 +101,15 @@ components:
description: allOf with a single item
nullable: true
allOf:
- $ref: '#/components/schemas/AnotherParent'
- $ref: '#/components/schemas/AnotherParent'
Ancestor:
type: object
properties:
p1:
type: integer
Offspring:
properties:
p2:
type: string
allOf:
- $ref: '#/components/schemas/Ancestor'