Polishing tests

This commit is contained in:
Rossen Stoyanchev
2021-05-14 06:56:53 +01:00
parent 44a034ef3d
commit de8e2540b7
4 changed files with 41 additions and 50 deletions

View File

@@ -17,14 +17,13 @@ package org.springframework.graphql.support;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import graphql.ExecutionInput;
import graphql.ExecutionResult;
import graphql.GraphQL;
import graphql.schema.DataFetcher;
import graphql.schema.idl.RuntimeWiring;
import org.junit.jupiter.api.Test;
import org.reactivestreams.Publisher;
@@ -43,53 +42,47 @@ public class ReactorDataFetcherAdapterTests {
@Test
void monoDataFetcher() throws Exception {
GraphQL graphQL = graphQL("type Query { greeting: String }",
"Query", "greeting", env ->
Mono.deferContextual(context -> {
Object name = context.get("name");
return Mono.delay(Duration.ofMillis(50)).map(aLong -> "Hello " + name);
}));
GraphQL graphQL = initGraphQL("type Query { greeting: String }", builder -> {
builder.type("Query", typeBuilder -> typeBuilder.dataFetcher("greeting",
env -> Mono.deferContextual(context -> {
Object name = context.get("name");
return Mono.delay(Duration.ofMillis(50)).map(aLong -> "Hello " + name);
})));
});
ExecutionInput executionInput = initExecutionInput("{ greeting }", Context.of("name", "007"));
Map<String, Object> data = graphQL.executeAsync(executionInput).get().getData();
ExecutionInput input = executionInput("{ greeting }", Context.of("name", "007"));
Map<String, Object> data = graphQL.executeAsync(input).get().getData();
assertThat(data).hasSize(1).containsEntry("greeting", "Hello 007");
}
@Test
void fluxDataFetcher() throws Exception {
GraphQL graphQL = graphQL("type Query { greetings: [String] }",
"Query", "greetings", env ->
Mono.delay(Duration.ofMillis(50)).flatMapMany(aLong ->
Flux.deferContextual(context -> {
String name = context.get("name");
return Flux.just("Hi", "Bonjour", "Hola").map(s -> s + " " + name);
})));
GraphQL graphQL = initGraphQL("type Query { greetings: [String] }", builder -> {
builder.type("Query", typeBuilder -> typeBuilder.dataFetcher("greetings",
env -> Mono.delay(Duration.ofMillis(50)).flatMapMany(aLong ->
Flux.deferContextual(context -> {
String name = context.get("name");
return Flux.just("Hi", "Bonjour", "Hola").map(s -> s + " " + name);
}))));
});
ExecutionInput input = executionInput("{ greetings }", Context.of("name", "007"));
Map<String, Object> data = graphQL.executeAsync(input).get().getData();
ExecutionInput executionInput = initExecutionInput("{ greetings }", Context.of("name", "007"));
Map<String, Object> data = graphQL.executeAsync(executionInput).get().getData();
assertThat((List<String>) data.get("greetings")).containsExactly("Hi 007", "Bonjour 007", "Hola 007");
}
@Test
void fluxDataFetcherSubscription() throws Exception {
GraphQL graphQL = graphQL(
"type Query { greeting: String } type Subscription { greetings: String }",
"Subscription", "greetings", env ->
Mono.delay(Duration.ofMillis(50)).flatMapMany(aLong ->
Flux.deferContextual(context -> {
String name = context.get("name");
return Flux.just("Hi", "Bonjour", "Hola").map(s -> s + " " + name);
})));
GraphQL graphQL = initGraphQL(
"type Query { greeting: String } type Subscription { greetings: String }", builder ->
builder.type("Subscription", typeBuilder -> typeBuilder.dataFetcher("greetings",
env -> Mono.delay(Duration.ofMillis(50)).flatMapMany(aLong ->
Flux.deferContextual(context -> {
String name = context.get("name");
return Flux.just("Hi", "Bonjour", "Hola").map(s -> s + " " + name);
}))
)));
ExecutionInput input = initExecutionInput("subscription { greetings }", Context.of("name", "007"));
ExecutionInput input = executionInput("subscription { greetings }", Context.of("name", "007"));
Publisher<String> publisher = graphQL.executeAsync(input).get().getData();
List<String> actual = Flux.from(publisher)
@@ -102,20 +95,18 @@ public class ReactorDataFetcherAdapterTests {
assertThat(actual).containsExactly("Hi 007", "Bonjour 007", "Hola 007");
}
private GraphQL initGraphQL(String schemaValue, Consumer<RuntimeWiring.Builder> consumer) {
RuntimeWiring.Builder wiringBuilder = RuntimeWiring.newRuntimeWiring();
consumer.accept(wiringBuilder);
private GraphQL graphQL(String schemaValue, String typeName, String fieldName, DataFetcher<?> dataFetcher) {
RuntimeWiring wiring = RuntimeWiring.newRuntimeWiring()
.type(typeName, builder -> builder.dataFetcher(fieldName, dataFetcher))
.build();
return GraphQLSource.builder()
.schemaResource(new ByteArrayResource(schemaValue.getBytes(StandardCharsets.UTF_8)))
.runtimeWiring(wiringBuilder.build())
.typeVisitors(Collections.singletonList(ReactorDataFetcherAdapter.TYPE_VISITOR))
.runtimeWiring(wiring)
.build()
.graphQL();
}
private ExecutionInput initExecutionInput(String query, Context reactorContext) {
private ExecutionInput executionInput(String query, Context reactorContext) {
ExecutionInput input = ExecutionInput.newExecutionInput().query(query).build();
ReactorDataFetcherAdapter.addReactorContext(input, reactorContext);
return input;

View File

@@ -16,15 +16,15 @@ public class GraphQLDataFetchers {
public static DataFetcher getBookByIdDataFetcher() {
return environment -> books.stream()
.filter(book -> book.getId().equals(environment.getArgument("id")))
return env -> books.stream()
.filter(book -> book.getId().equals(env.getArgument("id")))
.findFirst()
.orElse(null);
}
public static DataFetcher getBooksOnSale() {
return environment -> Flux.fromIterable(books)
.filter(book -> book.getPageCount() >= (int) environment.getArgument("minPages"));
return env -> Flux.fromIterable(books)
.filter(book -> book.getPageCount() >= (int) env.getArgument("minPages"));
}
}

View File

@@ -276,14 +276,14 @@ public class GraphQLWebSocketHandlerTests {
WebGraphQLHandler graphQLHandler = WebInterceptor.createHandler(
(interceptors != null ? interceptors : Collections.emptyList()),
new ExecutionGraphQLService(initGraphQLSource()));
new ExecutionGraphQLService(graphQLSource()));
return new GraphQLWebSocketHandler(graphQLHandler,
ServerCodecConfigurer.create(),
(initTimeoutDuration != null ? initTimeoutDuration : Duration.ofSeconds(60)));
}
private static GraphQLSource initGraphQLSource() {
private static GraphQLSource graphQLSource() {
RuntimeWiring.Builder builder = RuntimeWiring.newRuntimeWiring();
builder.type(newTypeWiring("Query").dataFetcher("bookById", GraphQLDataFetchers.getBookByIdDataFetcher()));
builder.type(newTypeWiring("Subscription").dataFetcher("bookSearch", GraphQLDataFetchers.getBooksOnSale()));

View File

@@ -260,7 +260,7 @@ public class GraphQLWebSocketHandlerTests {
try {
WebGraphQLHandler graphQLHandler = WebInterceptor.createHandler(
(interceptors != null ? interceptors : Collections.emptyList()),
new ExecutionGraphQLService(initGraphQLSource()));
new ExecutionGraphQLService(graphQLSource()));
return new GraphQLWebSocketHandler(graphQLHandler, converter,
(initTimeoutDuration != null ? initTimeoutDuration : Duration.ofSeconds(60)));
@@ -270,7 +270,7 @@ public class GraphQLWebSocketHandlerTests {
}
}
private static GraphQLSource initGraphQLSource() throws Exception {
private static GraphQLSource graphQLSource() {
RuntimeWiring.Builder builder = RuntimeWiring.newRuntimeWiring();
builder.type(newTypeWiring("Query").dataFetcher("bookById", GraphQLDataFetchers.getBookByIdDataFetcher()));
builder.type(newTypeWiring("Subscription").dataFetcher("bookSearch", GraphQLDataFetchers.getBooksOnSale()));