Introduce GraphQlResponse

Replace the use of ExecutionResult on the client side where we are
dealing with a response map rather, and also incorporate it into the
server-side hierarchy where it wraps an ExecutionResult instead.

See gh-10
This commit is contained in:
rstoyanchev
2022-03-11 13:02:47 +00:00
parent 77e9835d3a
commit 15238072bb
37 changed files with 439 additions and 345 deletions

View File

@@ -25,6 +25,7 @@ import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import org.springframework.graphql.GraphQlRequest;
import org.springframework.graphql.GraphQlResponse;
import org.springframework.graphql.RequestOutput;
import org.springframework.graphql.client.GraphQlTransport;
import org.springframework.test.util.AssertionErrors;
@@ -45,22 +46,23 @@ abstract class AbstractDirectTransport implements GraphQlTransport {
@Override
public Mono<ExecutionResult> execute(GraphQlRequest request) {
return executeInternal(request).cast(ExecutionResult.class);
public Mono<GraphQlResponse> execute(GraphQlRequest request) {
return executeInternal(request).cast(GraphQlResponse.class);
}
@SuppressWarnings({"ConstantConditions", "unchecked"})
@Override
public Flux<ExecutionResult> executeSubscription(GraphQlRequest request) {
return executeInternal(request).flatMapMany(result -> {
public Flux<GraphQlResponse> executeSubscription(GraphQlRequest request) {
return executeInternal(request).flatMapMany(output -> {
try {
Object data = result.getData();
Object data = output.getData();
AssertionErrors.assertTrue("Not a Publisher: " + data, data instanceof Publisher);
List<GraphQLError> errors = result.getErrors();
List<GraphQLError> errors = output.getErrors();
AssertionErrors.assertTrue("Subscription errors: " + errors, CollectionUtils.isEmpty(errors));
return Flux.from((Publisher<ExecutionResult>) data);
return Flux.from((Publisher<ExecutionResult>) data)
.map(result -> new RequestOutput(output.getExecutionInput(), result));
}
catch (AssertionError ex) {
throw new AssertionError(ex.getMessage() + "\nRequest: " + request, ex);

View File

@@ -31,12 +31,12 @@ import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.TypeRef;
import graphql.ExecutionResult;
import graphql.GraphQLError;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.core.ResolvableType;
import org.springframework.graphql.GraphQlRequest;
import org.springframework.graphql.GraphQlResponse;
import org.springframework.graphql.client.GraphQlTransport;
import org.springframework.graphql.support.DocumentSource;
import org.springframework.lang.Nullable;
@@ -165,7 +165,7 @@ final class DefaultGraphQlTester implements GraphQlTester {
@SuppressWarnings("ConstantConditions")
@Override
public Response execute() {
return transport.execute(request()).map(result -> response(result, request())).block(responseTimeout);
return transport.execute(request()).map(response -> mapResponse(response, request())).block(responseTimeout);
}
@Override
@@ -175,15 +175,15 @@ final class DefaultGraphQlTester implements GraphQlTester {
@Override
public Subscription executeSubscription() {
return () -> transport.executeSubscription(request()).map(result -> response(result, request()));
return () -> transport.executeSubscription(request()).map(result -> mapResponse(result, request()));
}
private GraphQlRequest request() {
return new GraphQlRequest(this.document, this.operationName, this.variables);
}
private DefaultResponse response(ExecutionResult result, GraphQlRequest request) {
return new DefaultResponse(result, errorFilter, assertDecorator(request), jsonPathConfig);
private DefaultResponse mapResponse(GraphQlResponse response, GraphQlRequest request) {
return new DefaultResponse(response, errorFilter, assertDecorator(request), jsonPathConfig);
}
private Consumer<Runnable> assertDecorator(GraphQlRequest request) {
@@ -217,12 +217,12 @@ final class DefaultGraphQlTester implements GraphQlTester {
private ResponseDelegate(
ExecutionResult result, @Nullable Predicate<GraphQLError> errorFilter,
GraphQlResponse response, @Nullable Predicate<GraphQLError> errorFilter,
Consumer<Runnable> assertDecorator, Configuration jsonPathConfig) {
this.jsonDoc = JsonPath.parse(result.toSpecification(), jsonPathConfig);
this.jsonDoc = JsonPath.parse(response.toMap(), jsonPathConfig);
this.jsonContent = this.jsonDoc::jsonString;
this.errors = result.getErrors();
this.errors = response.getErrors();
this.unexpectedErrors = new ArrayList<>(this.errors);
this.assertDecorator = assertDecorator;
@@ -293,10 +293,10 @@ final class DefaultGraphQlTester implements GraphQlTester {
private final ResponseDelegate delegate;
private DefaultResponse(
ExecutionResult result, @Nullable Predicate<GraphQLError> errorFilter,
GraphQlResponse response, @Nullable Predicate<GraphQLError> errorFilter,
Consumer<Runnable> assertDecorator, Configuration jsonPathConfig) {
this.delegate = new ResponseDelegate(result, errorFilter, assertDecorator, jsonPathConfig);
this.delegate = new ResponseDelegate(response, errorFilter, assertDecorator, jsonPathConfig);
}
@Override

View File

@@ -20,11 +20,11 @@ package org.springframework.graphql.test.tester;
import java.net.URI;
import java.util.function.Consumer;
import graphql.ExecutionResult;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import org.springframework.graphql.GraphQlRequest;
import org.springframework.graphql.GraphQlResponse;
import org.springframework.graphql.client.CodecMappingProvider;
import org.springframework.graphql.client.GraphQlClient;
import org.springframework.graphql.client.GraphQlTransport;
@@ -164,7 +164,7 @@ final class DefaultWebSocketGraphQlTester extends AbstractDelegatingGraphQlTeste
return new GraphQlTransport() {
@Override
public Mono<ExecutionResult> execute(GraphQlRequest request) {
public Mono<GraphQlResponse> execute(GraphQlRequest request) {
return client
.document(request.getDocument())
.operationName(request.getOperationName())
@@ -174,7 +174,7 @@ final class DefaultWebSocketGraphQlTester extends AbstractDelegatingGraphQlTeste
}
@Override
public Flux<ExecutionResult> executeSubscription(GraphQlRequest request) {
public Flux<GraphQlResponse> executeSubscription(GraphQlRequest request) {
return client
.document(request.getDocument())
.operationName(request.getOperationName())

View File

@@ -19,14 +19,14 @@ package org.springframework.graphql.test.tester;
import java.util.Collections;
import java.util.Map;
import graphql.ExecutionResult;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.graphql.GraphQlRequest;
import org.springframework.graphql.GraphQlResponse;
import org.springframework.graphql.client.GraphQlTransport;
import org.springframework.graphql.support.MapExecutionResult;
import org.springframework.graphql.support.MapGraphQlResponse;
import org.springframework.http.MediaType;
import org.springframework.test.web.reactive.server.WebTestClient;
import org.springframework.util.Assert;
@@ -53,9 +53,9 @@ final class WebTestClientTransport implements GraphQlTransport {
@Override
public Mono<ExecutionResult> execute(GraphQlRequest request) {
public Mono<GraphQlResponse> execute(GraphQlRequest request) {
Map<String, Object> resultMap = this.webTestClient.post()
Map<String, Object> responseMap = this.webTestClient.post()
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.bodyValue(request.toMap())
@@ -66,13 +66,13 @@ final class WebTestClientTransport implements GraphQlTransport {
.returnResult()
.getResponseBody();
resultMap = (resultMap != null ? resultMap : Collections.emptyMap());
ExecutionResult result = MapExecutionResult.from(resultMap);
return Mono.just(result);
responseMap = (responseMap != null ? responseMap : Collections.emptyMap());
GraphQlResponse response = MapGraphQlResponse.forResponse(responseMap);
return Mono.just(response);
}
@Override
public Flux<ExecutionResult> executeSubscription(GraphQlRequest request) {
public Flux<GraphQlResponse> executeSubscription(GraphQlRequest request) {
throw new UnsupportedOperationException("Subscriptions not supported over HTTP");
}