Skip to content

Commit

Permalink
fix allOf with properties for ref as parent rule (#20083)
Browse files Browse the repository at this point in the history
  • Loading branch information
wing328 authored Nov 13, 2024
1 parent a95ea1f commit 301af60
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -755,15 +755,16 @@ private Schema normalizeAllOfWithProperties(Schema schema, Set<Schema> visitedSc
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);
}
// normalize allOf sub schemas one by one
normalizeSchema((Schema) item, visitedSchemas);
}
// process rules here
schema = processRefactorAllOfWithPropertiesOnly(schema);

return schema;
}
Expand Down Expand Up @@ -1325,9 +1326,8 @@ private Schema processRefactorAllOfWithPropertiesOnly(Schema schema) {
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<>());
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,30 @@ public void testOpenAPINormalizerRefAsParentInAllOf() {
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");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1776,7 +1776,7 @@ public void testJdkHttpClientWithAndWithoutParentExtension() {
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"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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'

0 comments on commit 301af60

Please sign in to comment.