Skip to content

Commit 153bd65

Browse files
Additional test
1 parent da656e0 commit 153bd65

File tree

1 file changed

+50
-0
lines changed

1 file changed

+50
-0
lines changed

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationOperationRendererUnitTests.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,21 @@
1919
import static org.mockito.Mockito.mock;
2020
import static org.mockito.Mockito.verify;
2121
import static org.springframework.data.domain.Sort.Direction.DESC;
22+
import static org.springframework.data.mongodb.core.aggregation.Aggregation.newAggregation;
2223
import static org.springframework.data.mongodb.core.aggregation.Aggregation.project;
2324
import static org.springframework.data.mongodb.core.aggregation.Aggregation.sort;
2425

2526
import java.time.ZonedDateTime;
2627
import java.util.List;
2728
import java.util.Set;
29+
import java.util.stream.Stream;
2830

2931
import org.assertj.core.api.Assertions;
3032
import org.bson.Document;
3133
import org.junit.jupiter.api.Test;
34+
import org.junit.jupiter.params.ParameterizedTest;
35+
import org.junit.jupiter.params.provider.Arguments;
36+
import org.junit.jupiter.params.provider.MethodSource;
3237
import org.springframework.data.annotation.Id;
3338
import org.springframework.data.convert.ConverterBuilder;
3439
import org.springframework.data.convert.CustomConversions;
@@ -37,6 +42,7 @@
3742
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
3843
import org.springframework.data.mongodb.core.convert.NoOpDbRefResolver;
3944
import org.springframework.data.mongodb.core.convert.QueryMapper;
45+
import org.springframework.data.mongodb.core.mapping.Field;
4046
import org.springframework.data.mongodb.core.query.Criteria;
4147
import org.springframework.data.mongodb.test.util.MongoTestMappingContext;
4248

@@ -100,6 +106,37 @@ void appliesConversionToValuesUsedInAggregation() {
100106
.isInstanceOf(String.class);
101107
}
102108

109+
@ParameterizedTest // GH-4722
110+
@MethodSource("studentAggregationContexts")
111+
void mapsOperationThatDoesNotExposeDedicatedFieldsCorrectly(AggregationOperationContext aggregationContext) {
112+
113+
var agg = newAggregation(Student.class, Aggregation.unwind("grades"), Aggregation.replaceRoot("grades"),
114+
Aggregation.project("grades"));
115+
116+
List<Document> mappedPipeline = AggregationOperationRenderer.toDocument(agg.getPipeline().getOperations(),
117+
aggregationContext);
118+
119+
Assertions.assertThat(mappedPipeline).last().isEqualTo(Document.parse("{\"$project\": {\"grades\": 1}}"));
120+
}
121+
122+
private static Stream<Arguments> studentAggregationContexts() {
123+
124+
MongoTestMappingContext ctx = new MongoTestMappingContext(cfg -> {
125+
cfg.initialEntitySet(Student.class);
126+
});
127+
128+
MappingMongoConverter mongoConverter = new MappingMongoConverter(NoOpDbRefResolver.INSTANCE, ctx);
129+
mongoConverter.afterPropertiesSet();
130+
131+
QueryMapper queryMapper = new QueryMapper(mongoConverter);
132+
133+
return Stream.of(
134+
Arguments
135+
.of(new TypeBasedAggregationOperationContext(Student.class, ctx, queryMapper, FieldLookupPolicy.strict())),
136+
Arguments.of(
137+
new TypeBasedAggregationOperationContext(Student.class, ctx, queryMapper, FieldLookupPolicy.relaxed())));
138+
}
139+
103140
record TestRecord(@Id String field1, String field2, LayerOne layerOne) {
104141
record LayerOne(List<LayerTwo> layerTwo) {
105142
}
@@ -110,4 +147,17 @@ record LayerTwo(LayerThree layerThree) {
110147
record LayerThree(int fieldA, int fieldB) {
111148
}
112149
}
150+
151+
static class Student {
152+
153+
@Field("mark") List<Grade> grades;
154+
155+
}
156+
157+
static class Grade {
158+
159+
int points;
160+
String grades;
161+
}
162+
113163
}

0 commit comments

Comments
 (0)