Skip to content

Commit d78f47f

Browse files
christophstroblmp911de
authored andcommitted
Add tests to verify Limit is supported.
Closes #4397 Original pull request: #4398
1 parent 8cd956e commit d78f47f

File tree

4 files changed

+60
-0
lines changed

4 files changed

+60
-0
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessor.java

+6
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.Iterator;
2222
import java.util.List;
2323

24+
import org.springframework.data.domain.Limit;
2425
import org.springframework.data.domain.Pageable;
2526
import org.springframework.data.domain.Range;
2627
import org.springframework.data.domain.ScrollPosition;
@@ -117,6 +118,11 @@ public UpdateDefinition getUpdate() {
117118
return delegate.getUpdate();
118119
}
119120

121+
@Override
122+
public Limit getLimit() {
123+
return delegate.getLimit();
124+
}
125+
120126
/**
121127
* Converts the given value with the underlying {@link MongoWriter}.
122128
*

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java

+19
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,17 @@ void appliesScrollPositionCorrectly() {
213213
assertThat(page).contains(carter);
214214
}
215215

216+
@Test // GH-4397
217+
void appliesLimitToScrollingCorrectly() {
218+
219+
Window<Person> page = repository.findByLastnameLikeOrderByLastnameAscFirstnameAsc("*a*",
220+
ScrollPosition.keyset(), Limit.of(2));
221+
222+
assertThat(page.isLast()).isFalse();
223+
assertThat(page.size()).isEqualTo(2);
224+
assertThat(page).contains(carter);
225+
}
226+
216227
@Test // GH-4308
217228
void appliesScrollPositionWithProjectionCorrectly() {
218229

@@ -236,6 +247,14 @@ void executesPagedFinderCorrectly() {
236247
assertThat(page).contains(carter, stefan);
237248
}
238249

250+
@Test // GH-4397
251+
void executesFinderCorrectlyWithSortAndLimit() {
252+
253+
List<Person> page = repository.findByLastnameLike("*a*", Sort.by(Direction.ASC, "lastname", "firstname"), Limit.of(2));
254+
255+
assertThat(page).containsExactly(carter, stefan);
256+
}
257+
239258
@Test
240259
void executesPagedFinderWithAnnotatedQueryCorrectly() {
241260

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java

+6
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.regex.Pattern;
2424
import java.util.stream.Stream;
2525

26+
import org.springframework.data.domain.Limit;
2627
import org.springframework.data.domain.Page;
2728
import org.springframework.data.domain.Pageable;
2829
import org.springframework.data.domain.Range;
@@ -126,6 +127,9 @@ public interface PersonRepository extends MongoRepository<Person, String>, Query
126127
Window<Person> findTop2ByLastnameLikeOrderByLastnameAscFirstnameAsc(String lastname,
127128
ScrollPosition scrollPosition);
128129

130+
Window<Person> findByLastnameLikeOrderByLastnameAscFirstnameAsc(String lastname,
131+
ScrollPosition scrollPosition, Limit limit);
132+
129133
/**
130134
* Returns a scroll of {@link Person}s applying projections with a lastname matching the given one (*-wildcards
131135
* supported).
@@ -145,6 +149,8 @@ Window<Person> findTop2ByLastnameLikeOrderByLastnameAscFirstnameAsc(String lastn
145149
*/
146150
Page<Person> findByLastnameLike(String lastname, Pageable pageable);
147151

152+
List<Person> findByLastnameLike(String lastname, Sort sort, Limit limit);
153+
148154
@Query("{ 'lastname' : { '$regex' : '?0', '$options' : 'i'}}")
149155
Page<Person> findByLastnameLikeWithPageable(String lastname, Pageable pageable);
150156

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/AbstractMongoQueryUnitTests.java

+29
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.mockito.junit.jupiter.MockitoExtension;
3737
import org.mockito.junit.jupiter.MockitoSettings;
3838
import org.mockito.quality.Strictness;
39+
import org.springframework.data.domain.Limit;
3940
import org.springframework.data.domain.Page;
4041
import org.springframework.data.domain.PageRequest;
4142
import org.springframework.data.domain.Pageable;
@@ -493,6 +494,30 @@ void updateShouldApplyHint() {
493494
assertThat(captor.getValue().getHint()).isEqualTo("idx-ln");
494495
}
495496

497+
@Test // GH-4397
498+
void limitShouldBeAppliedToQuery() {
499+
500+
createQueryForMethod("findWithLimit", String.class, Limit.class).execute(new Object[] { "dalinar", Limit.of(42) });
501+
502+
ArgumentCaptor<Query> captor = ArgumentCaptor.forClass(Query.class);
503+
verify(withQueryMock).matching(captor.capture());
504+
505+
assertThat(captor.getValue().getLimit()).isEqualTo(42);
506+
}
507+
508+
@Test // GH-4397
509+
void sortAndLimitShouldBeAppliedToQuery() {
510+
511+
createQueryForMethod("findWithSortAndLimit", String.class, Sort.class, Limit.class)
512+
.execute(new Object[] { "dalinar", Sort.by("fn"), Limit.of(42) });
513+
514+
ArgumentCaptor<Query> captor = ArgumentCaptor.forClass(Query.class);
515+
verify(withQueryMock).matching(captor.capture());
516+
517+
assertThat(captor.getValue().getLimit()).isEqualTo(42);
518+
assertThat(captor.getValue().getSortObject()).isEqualTo(new Document("fn", 1));
519+
}
520+
496521
private MongoQueryFake createQueryForMethod(String methodName, Class<?>... paramTypes) {
497522
return createQueryForMethod(Repo.class, methodName, paramTypes);
498523
}
@@ -614,6 +639,10 @@ private interface Repo extends MongoRepository<Person, Long> {
614639

615640
@Hint("idx-fn")
616641
void findWithHintByFirstname(String firstname);
642+
643+
List<Person> findWithLimit(String firstname, Limit limit);
644+
645+
List<Person> findWithSortAndLimit(String firstname, Sort sort, Limit limit);
617646
}
618647

619648
// DATAMONGO-1872

0 commit comments

Comments
 (0)