Skip to content

Commit

Permalink
fix: Avoid duplicate items in allOf and required arrays (#504)
Browse files Browse the repository at this point in the history
  • Loading branch information
CarstenWickner authored Dec 16, 2024
1 parent 3efd7d5 commit d8583b8
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -271,8 +271,11 @@ private Supplier<JsonNode> mergeArrays(List<JsonNode> arrayNodesToMerge) {
return null;
}
return () -> {
Set<JsonNode> arrayItems = new LinkedHashSet<>();
arrayNodesToMerge.forEach(node -> node.forEach(arrayItems::add));

ArrayNode mergedArrayNode = this.config.createArrayNode();
arrayNodesToMerge.forEach(node -> node.forEach(mergedArrayNode::add));
arrayItems.forEach(mergedArrayNode::add);
return mergedArrayNode;
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,25 +16,17 @@

package com.github.victools.jsonschema.generator.impl;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.github.victools.jsonschema.generator.OptionPreset;
import com.github.victools.jsonschema.generator.SchemaGeneratorConfig;
import com.github.victools.jsonschema.generator.SchemaGeneratorConfigBuilder;
import com.github.victools.jsonschema.generator.SchemaGeneratorConfigPart;
import com.github.victools.jsonschema.generator.SchemaVersion;
import java.util.Collections;
import java.util.stream.Stream;
import org.json.JSONArray;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.ArgumentsSource;
import org.junit.jupiter.params.provider.MethodSource;
import org.junit.jupiter.params.provider.ValueSource;
import org.mockito.Mock;
import org.skyscreamer.jsonassert.JSONAssert;
import org.skyscreamer.jsonassert.JSONCompareMode;

Expand Down Expand Up @@ -116,4 +108,34 @@ public void testSetStrictTypeInfo(String schemaInput, boolean considerNullType,
String schemaAsString = schema.toString();
JSONAssert.assertEquals('\n' + schemaAsString +'\n', expectedOutput, schemaAsString, JSONCompareMode.STRICT);
}

Stream<Arguments> parametersForTestReduceAllOfNodes() {
return Stream.of(
Arguments.of(
"{\"allOf\":[{\"type\":\"object\",\"properties\":{\"a\":{\"type\":\"string\"}}}," +
"{\"type\":\"object\",\"properties\":{\"a\":{\"type\":\"string\"},\"b\":{\"type\":\"string\"}}}]}",
"{\"type\":\"object\",\"properties\":{\"a\":{\"type\":\"string\"},\"b\":{\"type\":\"string\"}}}"),
Arguments.of(
"{\"allOf\":[{\"type\":\"object\",\"properties\":{\"a\":{\"type\":\"string\"}},\"required\":[\"a\"]}," +
"{\"type\":\"object\",\"properties\":{\"a\":{\"type\":\"string\"}},\"required\":[\"a\"]}]}",
"{\"type\":\"object\",\"properties\":{\"a\":{\"type\":\"string\"}},\"required\":[\"a\"]}"),
Arguments.of(
"{\"allOf\":[{\"type\":\"object\",\"properties\":{\"a\":{\"type\":\"string\"}},\"required\":[\"a\"]}," +
"{\"type\":\"object\",\"properties\":{\"b\":{\"type\":\"string\"}},\"required\":[\"a\",\"b\"]}]}",
"{\"type\":\"object\",\"properties\":{\"a\":{\"type\":\"string\"},\"b\":{\"type\":\"string\"}},\"required\":[\"a\",\"b\"]}")
);
}

@ParameterizedTest
@MethodSource("parametersForTestReduceAllOfNodes")
public void testReduceAllOfNodes(String schemaInput, String expectedOutput) throws Exception {
SchemaGeneratorConfigBuilder configBuilder = new SchemaGeneratorConfigBuilder(SchemaVersion.DRAFT_2019_09, OptionPreset.PLAIN_JSON);
SchemaCleanUpUtils utilsInstance = new SchemaCleanUpUtils(configBuilder.build());

JsonNode schema = configBuilder.getObjectMapper().readTree(schemaInput);
utilsInstance.reduceAllOfNodes(Collections.singletonList((ObjectNode) schema));

String schemaAsString = schema.toString();
JSONAssert.assertEquals('\n' + schemaAsString + '\n', expectedOutput, schemaAsString, JSONCompareMode.STRICT);
}
}

0 comments on commit d8583b8

Please sign in to comment.