Skip to content

Commit 650137f

Browse files
committed
Update Query By Example pagination tests
See gh-597
1 parent a0d7cc1 commit 650137f

File tree

3 files changed

+89
-33
lines changed

3 files changed

+89
-33
lines changed

spring-graphql/src/test/java/org/springframework/graphql/data/query/jpa/QueryByExampleDataFetcherJpaTests.java

+13-13
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.Arrays;
2121
import java.util.Collections;
2222
import java.util.List;
23+
import java.util.Map;
2324
import java.util.Optional;
2425
import java.util.function.Consumer;
2526
import java.util.stream.Collectors;
@@ -36,6 +37,7 @@
3637
import org.springframework.context.annotation.Bean;
3738
import org.springframework.context.annotation.Configuration;
3839
import org.springframework.data.domain.OffsetScrollPosition;
40+
import org.springframework.data.domain.Sort;
3941
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
4042
import org.springframework.data.repository.query.QueryByExampleExecutor;
4143
import org.springframework.graphql.BookSource;
@@ -139,19 +141,17 @@ void shouldFetchWindow() {
139141
.toWebGraphQlHandler()
140142
.handleRequest(request(BookSource.booksConnectionQuery("first:2, after:\"O_3\"")));
141143

142-
ResponseHelper.forResponse(response).assertData(
143-
"{\"books\":{" +
144-
"\"edges\":[" +
145-
"{\"cursor\":\"O_4\",\"node\":{\"id\":\"42\",\"name\":\"Hitchhiker's Guide to the Galaxy\"}}," +
146-
"{\"cursor\":\"O_5\",\"node\":{\"id\":\"53\",\"name\":\"Breaking Bad\"}}" +
147-
"]," +
148-
"\"pageInfo\":{" +
149-
"\"startCursor\":\"O_4\"," +
150-
"\"endCursor\":\"O_5\"," +
151-
"\"hasPreviousPage\":true," +
152-
"\"hasNextPage\":false" +
153-
"}}}"
154-
);
144+
List<Map<String, Object>> edges = ResponseHelper.forResponse(response).toEntity("books.edges", List.class);
145+
assertThat(edges.size()).isEqualTo(2);
146+
assertThat(edges.get(0).get("cursor")).isEqualTo("O_4");
147+
assertThat(edges.get(1).get("cursor")).isEqualTo("O_5");
148+
149+
Map<String, Object> pageInfo = ResponseHelper.forResponse(response).toEntity("books.pageInfo", Map.class);
150+
assertThat(pageInfo.size()).isEqualTo(4);
151+
assertThat(pageInfo.get("startCursor")).isEqualTo("O_4");
152+
assertThat(pageInfo.get("endCursor")).isEqualTo("O_5");
153+
assertThat(pageInfo.get("hasPreviousPage")).isEqualTo(true);
154+
assertThat(pageInfo.get("hasNextPage")).isEqualTo(false);
155155
};
156156

157157
// explicit wiring

spring-graphql/src/test/java/org/springframework/graphql/data/query/mongo/QueryByExampleDataFetcherMongoDbTests.java

+12-13
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.Arrays;
2121
import java.util.Collections;
2222
import java.util.List;
23+
import java.util.Map;
2324
import java.util.Optional;
2425
import java.util.function.Consumer;
2526
import java.util.stream.Collectors;
@@ -136,19 +137,17 @@ void shouldFetchWindow() {
136137
.toWebGraphQlHandler()
137138
.handleRequest(request(BookSource.booksConnectionQuery("first:2, after:\"O_3\"")));
138139

139-
ResponseHelper.forResponse(response).assertData(
140-
"{\"books\":{" +
141-
"\"edges\":[" +
142-
"{\"cursor\":\"O_4\",\"node\":{\"id\":\"42\",\"name\":\"Hitchhiker's Guide to the Galaxy\"}}," +
143-
"{\"cursor\":\"O_5\",\"node\":{\"id\":\"53\",\"name\":\"Breaking Bad\"}}" +
144-
"]," +
145-
"\"pageInfo\":{" +
146-
"\"startCursor\":\"O_4\"," +
147-
"\"endCursor\":\"O_5\"," +
148-
"\"hasPreviousPage\":true," +
149-
"\"hasNextPage\":false" +
150-
"}}}"
151-
);
140+
List<Map<String, Object>> edges = ResponseHelper.forResponse(response).toEntity("books.edges", List.class);
141+
assertThat(edges.size()).isEqualTo(2);
142+
assertThat(edges.get(0).get("cursor")).isEqualTo("O_4");
143+
assertThat(edges.get(1).get("cursor")).isEqualTo("O_5");
144+
145+
Map<String, Object> pageInfo = ResponseHelper.forResponse(response).toEntity("books.pageInfo", Map.class);
146+
assertThat(pageInfo.size()).isEqualTo(4);
147+
assertThat(pageInfo.get("startCursor")).isEqualTo("O_4");
148+
assertThat(pageInfo.get("endCursor")).isEqualTo("O_5");
149+
assertThat(pageInfo.get("hasPreviousPage")).isEqualTo(true);
150+
assertThat(pageInfo.get("hasNextPage")).isEqualTo(false);
152151
};
153152

154153
// explicit wiring

spring-graphql/src/test/java/org/springframework/graphql/data/query/mongo/QueryByExampleDataFetcherReactiveMongoDbTests.java

+64-7
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.net.URI;
2020
import java.util.Collections;
2121
import java.util.List;
22+
import java.util.Map;
2223
import java.util.function.Consumer;
2324
import java.util.stream.Collectors;
2425

@@ -36,13 +37,19 @@
3637
import org.springframework.beans.factory.annotation.Value;
3738
import org.springframework.context.annotation.Bean;
3839
import org.springframework.context.annotation.Configuration;
40+
import org.springframework.data.domain.OffsetScrollPosition;
3941
import org.springframework.data.mongodb.core.ReactiveMongoTemplate;
4042
import org.springframework.data.mongodb.repository.config.EnableReactiveMongoRepositories;
4143
import org.springframework.data.repository.query.ReactiveQueryByExampleExecutor;
4244
import org.springframework.graphql.BookSource;
4345
import org.springframework.graphql.GraphQlSetup;
4446
import org.springframework.graphql.ResponseHelper;
47+
import org.springframework.graphql.data.pagination.ConnectionFieldTypeVisitor;
4548
import org.springframework.graphql.data.query.QueryByExampleDataFetcher;
49+
import org.springframework.graphql.data.query.ScrollPositionCursorStrategy;
50+
import org.springframework.graphql.data.query.ScrollSubrange;
51+
import org.springframework.graphql.data.query.WindowConnectionAdapter;
52+
import org.springframework.graphql.execution.ConnectionTypeDefinitionConfigurer;
4653
import org.springframework.graphql.execution.RuntimeWiringConfigurer;
4754
import org.springframework.graphql.server.WebGraphQlHandler;
4855
import org.springframework.graphql.server.WebGraphQlRequest;
@@ -138,21 +145,71 @@ void shouldReactivelyFetchMultipleItems() {
138145
tester.accept(graphQlSetup(repository));
139146
}
140147

148+
@Test
149+
void shouldFetchWindow() {
150+
151+
repository.saveAll(List.of(
152+
new Book("1", "Nineteen Eighty-Four", new Author("0", "George", "Orwell")),
153+
new Book("2", "The Great Gatsby", new Author("0", "F. Scott", "Fitzgerald")),
154+
new Book("3", "Catch-22", new Author("0", "Joseph", "Heller")),
155+
new Book("42", "Hitchhiker's Guide to the Galaxy", new Author("0", "Douglas", "Adams")),
156+
new Book("53", "Breaking Bad", new Author("0", "", "Heisenberg"))));
157+
158+
Consumer<GraphQlSetup> tester = graphQlSetup -> {
159+
160+
Mono<WebGraphQlResponse> response = graphQlSetup
161+
.toWebGraphQlHandler()
162+
.handleRequest(request(BookSource.booksConnectionQuery("first:2, after:\"O_3\"")));
163+
164+
List<Map<String, Object>> edges = ResponseHelper.forResponse(response).toEntity("books.edges", List.class);
165+
assertThat(edges.size()).isEqualTo(2);
166+
assertThat(edges.get(0).get("cursor")).isEqualTo("O_4");
167+
assertThat(edges.get(1).get("cursor")).isEqualTo("O_5");
168+
169+
Map<String, Object> pageInfo = ResponseHelper.forResponse(response).toEntity("books.pageInfo", Map.class);
170+
assertThat(pageInfo.size()).isEqualTo(4);
171+
assertThat(pageInfo.get("startCursor")).isEqualTo("O_4");
172+
assertThat(pageInfo.get("endCursor")).isEqualTo("O_5");
173+
assertThat(pageInfo.get("hasPreviousPage")).isEqualTo(true);
174+
assertThat(pageInfo.get("hasNextPage")).isEqualTo(false);
175+
};
176+
177+
// explicit wiring
178+
179+
ScrollPositionCursorStrategy cursorStrategy = new ScrollPositionCursorStrategy();
180+
181+
DataFetcher<Mono<Iterable<Book>>> dataFetcher =
182+
QueryByExampleDataFetcher.builder(repository).cursorStrategy(cursorStrategy).scrollable();
183+
184+
GraphQlSetup graphQlSetup = paginationSetup(cursorStrategy).queryFetcher("books", dataFetcher);
185+
tester.accept(graphQlSetup);
186+
187+
// auto registration
188+
graphQlSetup = paginationSetup(cursorStrategy).runtimeWiring(createRuntimeWiringConfigurer(repository));
189+
tester.accept(graphQlSetup);
190+
}
191+
141192
private static GraphQlSetup graphQlSetup(String fieldName, DataFetcher<?> fetcher) {
142-
return initGraphQlSetup(null).queryFetcher(fieldName, fetcher);
193+
return GraphQlSetup.schemaResource(BookSource.schema).queryFetcher(fieldName, fetcher);
143194
}
144195

145196
private static GraphQlSetup graphQlSetup(@Nullable ReactiveQueryByExampleExecutor<?> executor) {
146-
return initGraphQlSetup(executor);
197+
return GraphQlSetup.schemaResource(BookSource.schema)
198+
.runtimeWiring(createRuntimeWiringConfigurer(executor));
147199
}
148200

149-
private static GraphQlSetup initGraphQlSetup(@Nullable ReactiveQueryByExampleExecutor<?> executor) {
201+
private static GraphQlSetup paginationSetup(ScrollPositionCursorStrategy cursorStrategy) {
202+
return GraphQlSetup.schemaResource(BookSource.paginationSchema)
203+
.typeDefinitionConfigurer(new ConnectionTypeDefinitionConfigurer())
204+
.typeVisitor(ConnectionFieldTypeVisitor.create(List.of(new WindowConnectionAdapter(cursorStrategy))));
205+
}
150206

151-
RuntimeWiringConfigurer configurer = QueryByExampleDataFetcher.autoRegistrationConfigurer(
207+
private static RuntimeWiringConfigurer createRuntimeWiringConfigurer(ReactiveQueryByExampleExecutor<?> executor) {
208+
return QueryByExampleDataFetcher.autoRegistrationConfigurer(
152209
Collections.emptyList(),
153-
(executor != null ? Collections.singletonList(executor) : Collections.emptyList()));
154-
155-
return GraphQlSetup.schemaResource(BookSource.schema).runtimeWiring(configurer);
210+
(executor != null ? Collections.singletonList(executor) : Collections.emptyList()),
211+
new ScrollPositionCursorStrategy(),
212+
new ScrollSubrange(OffsetScrollPosition.initial(), 10, true));
156213
}
157214

158215
private WebGraphQlRequest request(String query) {

0 commit comments

Comments
 (0)