Skip to content
This repository was archived by the owner on Oct 25, 2021. It is now read-only.

Commit 76cd275

Browse files
committed
webflux testing
1 parent 325f53a commit 76cd275

File tree

5 files changed

+64
-32
lines changed

5 files changed

+64
-32
lines changed

graphql-java-spring-webflux/src/main/java/graphql/spring/web/reactive/GraphQLInvocation.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22

33
import graphql.ExecutionResult;
44
import graphql.PublicApi;
5-
import org.springframework.web.context.request.WebRequest;
5+
import org.springframework.web.server.ServerWebExchange;
66
import reactor.core.publisher.Mono;
77

88
@PublicApi
99
public interface GraphQLInvocation {
1010

11-
Mono<ExecutionResult> invoke(GraphQLInvocationData invocationData, WebRequest webRequest);
11+
Mono<ExecutionResult> invoke(GraphQLInvocationData invocationData, ServerWebExchange webRequest);
1212

1313
}

graphql-java-spring-webflux/src/main/java/graphql/spring/web/reactive/components/DefaultGraphQLInvocation.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import graphql.spring.web.reactive.GraphQLInvocationData;
99
import org.springframework.beans.factory.annotation.Autowired;
1010
import org.springframework.stereotype.Component;
11-
import org.springframework.web.context.request.WebRequest;
11+
import org.springframework.web.server.ServerWebExchange;
1212
import reactor.core.publisher.Mono;
1313

1414
@Component
@@ -19,7 +19,7 @@ public class DefaultGraphQLInvocation implements GraphQLInvocation {
1919
private GraphQL graphQL;
2020

2121
@Override
22-
public Mono<ExecutionResult> invoke(GraphQLInvocationData invocationData, WebRequest webRequest) {
22+
public Mono<ExecutionResult> invoke(GraphQLInvocationData invocationData, ServerWebExchange serverWebExchange) {
2323
ExecutionInput executionInput = ExecutionInput.newExecutionInput()
2424
.query(invocationData.getQuery())
2525
.operationName(invocationData.getOperationName())

graphql-java-spring-webflux/src/main/java/graphql/spring/web/reactive/components/GraphQLController.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@
99
import graphql.spring.web.reactive.GraphQLInvocationData;
1010
import org.springframework.beans.factory.annotation.Autowired;
1111
import org.springframework.http.MediaType;
12-
import org.springframework.http.server.reactive.ServerHttpResponse;
1312
import org.springframework.web.bind.annotation.RequestBody;
1413
import org.springframework.web.bind.annotation.RequestMapping;
1514
import org.springframework.web.bind.annotation.RequestMethod;
1615
import org.springframework.web.bind.annotation.RequestParam;
1716
import org.springframework.web.bind.annotation.RestController;
17+
import org.springframework.web.server.ServerWebExchange;
1818
import reactor.core.publisher.Mono;
1919

2020
import java.io.IOException;
@@ -38,13 +38,13 @@ public class GraphQLController {
3838
consumes = MediaType.APPLICATION_JSON_VALUE,
3939
produces = MediaType.APPLICATION_JSON_VALUE)
4040
public Object graphqlPOST(@RequestBody GraphQLRequestBody body,
41-
ServerHttpResponse serverHttpResponse) {
41+
ServerWebExchange serverWebExchange) {
4242
String query = body.getQuery();
4343
if (query == null) {
4444
query = "";
4545
}
46-
Mono<ExecutionResult> executionResult = graphQLInvocation.invoke(new GraphQLInvocationData(query, body.getOperationName(), body.getVariables()), null);
47-
return executionResultHandler.handleExecutionResult(executionResult, serverHttpResponse);
46+
Mono<ExecutionResult> executionResult = graphQLInvocation.invoke(new GraphQLInvocationData(query, body.getOperationName(), body.getVariables()), serverWebExchange);
47+
return executionResultHandler.handleExecutionResult(executionResult, serverWebExchange.getResponse());
4848
}
4949

5050
@RequestMapping(value = "${graphql.url:graphql}",
@@ -54,9 +54,10 @@ public Object graphqlGET(
5454
@RequestParam("query") String query,
5555
@RequestParam(value = "operationName", required = false) String operationName,
5656
@RequestParam(value = "variables", required = false) String variablesJson,
57-
ServerHttpResponse serverHttpResponse) {
58-
Mono<ExecutionResult> executionResult = graphQLInvocation.invoke(new GraphQLInvocationData(query, operationName, convertVariablesJson(variablesJson)), null);
59-
return executionResultHandler.handleExecutionResult(executionResult, serverHttpResponse);
57+
ServerWebExchange serverWebExchange
58+
) {
59+
Mono<ExecutionResult> executionResult = graphQLInvocation.invoke(new GraphQLInvocationData(query, operationName, convertVariablesJson(variablesJson)), serverWebExchange);
60+
return executionResultHandler.handleExecutionResult(executionResult, serverWebExchange.getResponse());
6061
}
6162

6263
private Map<String, Object> convertVariablesJson(String jsonMap) {
Lines changed: 52 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
package graphql.spring.web.reactive.components;
22

3+
import graphql.ExecutionInput;
4+
import graphql.ExecutionResultImpl;
5+
import graphql.GraphQL;
36
import org.junit.Before;
47
import org.junit.Test;
58
import org.junit.runner.RunWith;
9+
import org.mockito.ArgumentCaptor;
10+
import org.mockito.Mockito;
611
import org.springframework.beans.factory.annotation.Autowired;
712
import org.springframework.context.ApplicationContext;
813
import org.springframework.http.MediaType;
@@ -15,8 +20,10 @@
1520
import java.net.URLEncoder;
1621
import java.util.LinkedHashMap;
1722
import java.util.Map;
23+
import java.util.concurrent.CompletableFuture;
1824

1925
import static org.hamcrest.CoreMatchers.is;
26+
import static org.junit.Assert.assertThat;
2027

2128
@RunWith(SpringRunner.class)
2229
@ContextConfiguration(classes = {TestAppConfig.class})
@@ -26,6 +33,9 @@ public class GraphQLControllerTest {
2633
@Autowired
2734
private ApplicationContext applicationContext;
2835

36+
@Autowired
37+
GraphQL graphql;
38+
2939
private WebTestClient client;
3040

3141
@Before
@@ -37,37 +47,68 @@ public void setup() {
3747
@Test
3848
public void testPostRequest() throws Exception {
3949
Map<String, Object> request = new LinkedHashMap<>();
50+
Map<String, Object> variables = new LinkedHashMap<>();
51+
variables.put("variable", "variableValue");
52+
String query = "query myQuery {foo}";
53+
request.put("query", query);
54+
request.put("variables", variables);
55+
String operationName = "myQuery";
56+
request.put("operationName", operationName);
57+
58+
ExecutionResultImpl executionResult = ExecutionResultImpl.newExecutionResult()
59+
.data("bar")
60+
.build();
61+
CompletableFuture cf = CompletableFuture.completedFuture(executionResult);
62+
ArgumentCaptor<ExecutionInput> captor = ArgumentCaptor.forClass(ExecutionInput.class);
63+
Mockito.when(graphql.executeAsync(captor.capture())).thenReturn(cf);
64+
4065
client.post().uri("/graphql")
4166
.body(Mono.just(request), Map.class)
4267
.accept(MediaType.APPLICATION_JSON_UTF8)
4368
.exchange()
4469
.expectStatus().isOk()
4570
.expectBody()
46-
.jsonPath("data", is("foo"));
47-
// String query = "{foo}";
48-
// String variablesJson = "{\"key\":\"value\"}";
49-
// MvcResult mvcResult = this.mockMvc.perform(get("/graphql")
50-
// .param("query", query)
51-
// .param("variables", variablesJson))
52-
// .andDo(print()).andExpect(status().isOk())
53-
// .andReturn();
71+
.jsonPath("data", is("bar"));
5472

73+
assertThat(captor.getAllValues().size(), is(1));
74+
75+
assertThat(captor.getValue().getQuery(), is(query));
76+
assertThat(captor.getValue().getVariables(), is(variables));
77+
assertThat(captor.getValue().getOperationName(), is(operationName));
5578
}
5679

5780
@Test
58-
public void testGetRequestWithVariables() throws Exception {
59-
String variablesJson = "{\"key\":\"value\"}";
81+
public void testGetRequest() throws Exception {
82+
String variablesJson = "{\"variable\":\"variableValue\"}";
6083
String variablesValue = URLEncoder.encode(variablesJson, "UTF-8");
61-
String queryString = URLEncoder.encode("{foo}", "UTF-8");
84+
String query = "query myQuery {foo}";
85+
String queryString = URLEncoder.encode(query, "UTF-8");
86+
String operationName = "myQuery";
87+
88+
ExecutionResultImpl executionResult = ExecutionResultImpl.newExecutionResult()
89+
.data("bar")
90+
.build();
91+
CompletableFuture cf = CompletableFuture.completedFuture(executionResult);
92+
ArgumentCaptor<ExecutionInput> captor = ArgumentCaptor.forClass(ExecutionInput.class);
93+
Mockito.when(graphql.executeAsync(captor.capture())).thenReturn(cf);
94+
6295
client.get().uri(uriBuilder -> uriBuilder.path("/graphql")
6396
.queryParam("variables", variablesValue)
6497
.queryParam("query", queryString)
98+
.queryParam("operationName", operationName)
6599
.build(variablesJson, queryString))
66100
.accept(MediaType.APPLICATION_JSON_UTF8)
67101
.exchange()
68102
.expectStatus().isOk()
69103
.expectBody()
70104
.jsonPath("data", is("foo"));
71105

106+
assertThat(captor.getAllValues().size(), is(1));
107+
108+
Map<String, Object> variables = new LinkedHashMap<>();
109+
variables.put("variable", "variableValue");
110+
assertThat(captor.getValue().getQuery(), is(query));
111+
assertThat(captor.getValue().getVariables(), is(variables));
112+
assertThat(captor.getValue().getOperationName(), is(operationName));
72113
}
73114
}

graphql-java-spring-webflux/src/test/java/graphql/spring/web/reactive/components/TestAppConfig.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,14 @@
11
package graphql.spring.web.reactive.components;
22

33
import com.fasterxml.jackson.databind.ObjectMapper;
4-
import graphql.ExecutionInput;
5-
import graphql.ExecutionResultImpl;
64
import graphql.GraphQL;
7-
import org.mockito.ArgumentMatchers;
85
import org.mockito.Mockito;
96
import org.springframework.context.annotation.Bean;
107
import org.springframework.context.annotation.ComponentScan;
118
import org.springframework.context.annotation.Configuration;
129
import org.springframework.web.context.request.WebRequest;
1310
import org.springframework.web.reactive.config.EnableWebFlux;
1411

15-
import java.util.concurrent.CompletableFuture;
16-
1712
@Configuration
1813
@EnableWebFlux
1914
@ComponentScan(basePackageClasses = GraphQLController.class)
@@ -23,11 +18,6 @@ public class TestAppConfig {
2318
@Bean
2419
public GraphQL graphQL() {
2520
GraphQL graphql = Mockito.mock(GraphQL.class);
26-
ExecutionResultImpl executionResult = ExecutionResultImpl.newExecutionResult()
27-
.data("foo")
28-
.build();
29-
CompletableFuture cf = CompletableFuture.completedFuture(executionResult);
30-
Mockito.when(graphql.executeAsync(ArgumentMatchers.<ExecutionInput>any())).thenReturn(cf);
3121
return graphql;
3222
}
3323

0 commit comments

Comments
 (0)