diff --git a/server/src/test/java/org/elasticsearch/index/mapper/blockloader/FlattenedFieldRootBlockLoaderTests.java b/server/src/test/java/org/elasticsearch/index/mapper/blockloader/FlattenedFieldRootBlockLoaderTests.java index 6368399048a1b..b62f0c2919147 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/blockloader/FlattenedFieldRootBlockLoaderTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/blockloader/FlattenedFieldRootBlockLoaderTests.java @@ -26,8 +26,10 @@ import java.io.IOException; import java.io.UncheckedIOException; import java.util.Collections; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; public class FlattenedFieldRootBlockLoaderTests extends BlockLoaderTestCase { @@ -96,7 +98,30 @@ private List parseActual(Object actual) throws IOException { @Override protected Object expected(Map fieldMapping, Object value, TestContext testContext) { - return value; + var nullValue = (String) fieldMapping.get("null_value"); + return nullValue == null ? value : applyFlattenedNullValue(value, nullValue); + } + + /** + * Mirrors flattened source normalization by materializing mapped {@code null_value} + * for null leaves in the expected source tree before comparison. + */ + private static Object applyFlattenedNullValue(Object value, String nullValue) { + return switch (value) { + case null -> nullValue; + case Map map -> map.entrySet() + .stream() + .collect( + Collectors.toMap( + e -> (String) e.getKey(), + e -> applyFlattenedNullValue(e.getValue(), nullValue), + (a, b) -> b, + LinkedHashMap::new + ) + ); + case List list -> list.stream().map(v -> applyFlattenedNullValue(v, nullValue)).toList(); + default -> value; + }; } @Override