Skip to content

Commit 182e9e6

Browse files
committed
Extract ExecutionGraphQl[Request|Response] interfaces
Rename the implementation classes Request[Input|Output] accordingly to match the interfaces, and move them into the support package. Create AbstractGraphQlResponse in the support package that pre-implements response field access. This leaves mainly contracts in the top-level package. See gh-332
1 parent be05b03 commit 182e9e6

File tree

41 files changed

+623
-452
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+623
-452
lines changed

spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/AbstractDirectTransport.java

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,13 @@
2323
import reactor.core.publisher.Flux;
2424
import reactor.core.publisher.Mono;
2525

26+
import org.springframework.graphql.ExecutionGraphQlRequest;
27+
import org.springframework.graphql.ExecutionGraphQlResponse;
2628
import org.springframework.graphql.GraphQlRequest;
2729
import org.springframework.graphql.GraphQlResponse;
2830
import org.springframework.graphql.GraphQlResponseError;
29-
import org.springframework.graphql.RequestOutput;
31+
import org.springframework.graphql.support.DefaultExecutionGraphQlRequest;
32+
import org.springframework.graphql.support.DefaultExecutionGraphQlResponse;
3033
import org.springframework.graphql.client.GraphQlTransport;
3134
import org.springframework.test.util.AssertionErrors;
3235
import org.springframework.util.AlternativeJdkIdGenerator;
@@ -47,32 +50,38 @@ abstract class AbstractDirectTransport implements GraphQlTransport {
4750

4851
@Override
4952
public Mono<GraphQlResponse> execute(GraphQlRequest request) {
50-
return executeInternal(request).cast(GraphQlResponse.class);
53+
return executeInternal(toExecutionRequest(request)).cast(GraphQlResponse.class);
5154
}
5255

5356
@SuppressWarnings({"ConstantConditions", "unchecked"})
5457
@Override
5558
public Flux<GraphQlResponse> executeSubscription(GraphQlRequest request) {
56-
return executeInternal(request).flatMapMany(output -> {
59+
return executeInternal(toExecutionRequest(request)).flatMapMany(response -> {
5760
try {
58-
Object data = output.getData();
61+
Object data = response.getData();
5962
AssertionErrors.assertTrue("Not a Publisher: " + data, data instanceof Publisher);
6063

61-
List<GraphQlResponseError> errors = output.getErrors();
64+
List<GraphQlResponseError> errors = response.getErrors();
6265
AssertionErrors.assertTrue("Subscription errors: " + errors, CollectionUtils.isEmpty(errors));
6366

64-
return Flux.from((Publisher<ExecutionResult>) data)
65-
.map(result -> new RequestOutput(output.getExecutionInput(), result));
67+
return Flux.from((Publisher<ExecutionResult>) data).map(executionResult ->
68+
new DefaultExecutionGraphQlResponse(response.getExecutionInput(), executionResult));
6669
}
6770
catch (AssertionError ex) {
6871
throw new AssertionError(ex.getMessage() + "\nRequest: " + request, ex);
6972
}
7073
});
7174
}
7275

76+
private ExecutionGraphQlRequest toExecutionRequest(GraphQlRequest request) {
77+
return new DefaultExecutionGraphQlRequest(
78+
request.getDocument(), request.getOperationName(), request.getVariables(),
79+
idGenerator.generateId().toString(), null);
80+
}
81+
7382
/**
7483
* Subclasses must implement this to execute requests.
7584
*/
76-
protected abstract Mono<? extends RequestOutput> executeInternal(GraphQlRequest request);
85+
protected abstract Mono<ExecutionGraphQlResponse> executeInternal(ExecutionGraphQlRequest request);
7786

7887
}

spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/DefaultGraphQlTester.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434

3535
import org.springframework.core.ParameterizedTypeReference;
3636
import org.springframework.core.ResolvableType;
37-
import org.springframework.graphql.DefaultGraphQlRequest;
37+
import org.springframework.graphql.support.DefaultGraphQlRequest;
3838
import org.springframework.graphql.GraphQlRequest;
3939
import org.springframework.graphql.GraphQlResponse;
4040
import org.springframework.graphql.GraphQlResponseError;

spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/GraphQlServiceTransport.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,9 @@
1919

2020
import reactor.core.publisher.Mono;
2121

22-
import org.springframework.graphql.GraphQlRequest;
22+
import org.springframework.graphql.ExecutionGraphQlRequest;
23+
import org.springframework.graphql.ExecutionGraphQlResponse;
2324
import org.springframework.graphql.GraphQlService;
24-
import org.springframework.graphql.RequestInput;
25-
import org.springframework.graphql.RequestOutput;
2625
import org.springframework.util.Assert;
2726

2827

@@ -48,13 +47,8 @@ public GraphQlService getGraphQlService() {
4847
}
4948

5049
@Override
51-
protected Mono<RequestOutput> executeInternal(GraphQlRequest request) {
52-
53-
RequestInput requestInput = new RequestInput(
54-
request.getDocument(), request.getOperationName(), request.getVariables(),
55-
idGenerator.generateId().toString(), null);
56-
57-
return this.graphQlService.execute(requestInput);
50+
protected Mono<ExecutionGraphQlResponse> executeInternal(ExecutionGraphQlRequest request) {
51+
return this.graphQlService.execute(request);
5852
}
5953

6054
}

spring-graphql-test/src/main/java/org/springframework/graphql/test/tester/WebGraphQlHandlerTransport.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121

2222
import reactor.core.publisher.Mono;
2323

24+
import org.springframework.graphql.ExecutionGraphQlRequest;
25+
import org.springframework.graphql.ExecutionGraphQlResponse;
2426
import org.springframework.graphql.GraphQlRequest;
2527
import org.springframework.graphql.web.WebGraphQlHandler;
2628
import org.springframework.graphql.web.WebInput;
@@ -75,9 +77,9 @@ public CodecConfigurer getCodecConfigurer() {
7577

7678

7779
@Override
78-
protected Mono<WebOutput> executeInternal(GraphQlRequest request) {
79-
return this.graphQlHandler.handleRequest(
80-
new WebInput(this.url, this.headers, request.toMap(), idGenerator.generateId().toString(), null));
80+
protected Mono<ExecutionGraphQlResponse> executeInternal(ExecutionGraphQlRequest request) {
81+
WebInput input = new WebInput(this.url, this.headers, request.toMap(), idGenerator.generateId().toString(), null);
82+
return this.graphQlHandler.handleRequest(input).cast(ExecutionGraphQlResponse.class);
8183
}
8284

8385
}

spring-graphql-test/src/test/java/org/springframework/graphql/test/tester/GraphQlTesterBuilderTests.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,13 @@ void mutateDocumentSource() {
4848
GraphQlTester tester = builder.build();
4949
tester.documentName("name").execute();
5050

51-
assertThat(requestInput().getDocument()).isEqualTo(DOCUMENT);
51+
assertThat(request().getDocument()).isEqualTo(DOCUMENT);
5252

5353
// Mutate
5454
tester = tester.mutate().build();
5555
tester.documentName("name").execute();
5656

57-
assertThat(requestInput().getDocument()).isEqualTo(DOCUMENT);
57+
assertThat(request().getDocument()).isEqualTo(DOCUMENT);
5858
}
5959

6060
@Test
@@ -74,7 +74,7 @@ void errorsFilteredGlobally() {
7474
.errors().verify()
7575
.path("me").pathDoesNotExist();
7676

77-
assertThat(requestInput().getDocument()).contains(document);
77+
assertThat(request().getDocument()).contains(document);
7878
}
7979

8080
}

spring-graphql-test/src/test/java/org/springframework/graphql/test/tester/GraphQlTesterTestSupport.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@
2929
import org.mockito.ArgumentCaptor;
3030
import reactor.core.publisher.Mono;
3131

32+
import org.springframework.graphql.ExecutionGraphQlRequest;
3233
import org.springframework.graphql.GraphQlService;
33-
import org.springframework.graphql.RequestInput;
34-
import org.springframework.graphql.RequestOutput;
34+
import org.springframework.graphql.support.DefaultExecutionGraphQlResponse;
3535

3636
import static org.mockito.BDDMockito.given;
3737
import static org.mockito.Mockito.mock;
@@ -46,7 +46,7 @@ public class GraphQlTesterTestSupport {
4646
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
4747

4848

49-
private final ArgumentCaptor<RequestInput> inputCaptor = ArgumentCaptor.forClass(RequestInput.class);
49+
private final ArgumentCaptor<ExecutionGraphQlRequest> requestCaptor = ArgumentCaptor.forClass(ExecutionGraphQlRequest.class);
5050

5151
private final GraphQlService graphQlService = mock(GraphQlService.class);
5252

@@ -63,8 +63,8 @@ public GraphQlTester.Builder<?> graphQlTesterBuilder() {
6363
return this.graphQlTesterBuilder;
6464
}
6565

66-
protected RequestInput requestInput() {
67-
return this.inputCaptor.getValue();
66+
protected ExecutionGraphQlRequest request() {
67+
return this.requestCaptor.getValue();
6868
}
6969

7070

@@ -83,8 +83,8 @@ private void setMockResponse(Consumer<ExecutionResultImpl.Builder> consumer) {
8383
ExecutionInput executionInput = ExecutionInput.newExecutionInput("{}").build();
8484
ExecutionResult result = builder.build();
8585

86-
given(this.graphQlService.execute(this.inputCaptor.capture()))
87-
.willReturn(Mono.just(new RequestOutput(executionInput, result)));
86+
given(this.graphQlService.execute(this.requestCaptor.capture()))
87+
.willReturn(Mono.just(new DefaultExecutionGraphQlResponse(executionInput, result)));
8888
}
8989

9090
private void serialize(String data, ExecutionResultImpl.Builder builder) {

spring-graphql-test/src/test/java/org/springframework/graphql/test/tester/GraphQlTesterTests.java

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@
2626
import org.junit.jupiter.api.Test;
2727

2828
import org.springframework.core.ParameterizedTypeReference;
29+
import org.springframework.graphql.ExecutionGraphQlRequest;
2930
import org.springframework.graphql.GraphQlService;
30-
import org.springframework.graphql.RequestInput;
3131

3232
import static org.assertj.core.api.Assertions.assertThat;
3333
import static org.assertj.core.api.Assertions.assertThatThrownBy;
@@ -51,7 +51,7 @@ void pathAndValueExist() {
5151
response.path("me.friends").pathExists().valueExists();
5252
response.path("hero").pathDoesNotExist().valueDoesNotExist();
5353

54-
assertThat(requestInput().getDocument()).contains(document);
54+
assertThat(request().getDocument()).contains(document);
5555
}
5656

5757
@Test
@@ -69,7 +69,7 @@ void valueIsEmpty() {
6969
.as("Path does not even exist")
7070
.hasMessageContaining("No value at JSON path \"$['data']['hero']");
7171

72-
assertThat(requestInput().getDocument()).contains(document);
72+
assertThat(request().getDocument()).contains(document);
7373
}
7474

7575
@Test
@@ -88,7 +88,7 @@ void matchesJson() {
8888
.as("Extended fields should fail in strict mode")
8989
.hasMessageContaining("Unexpected: name");
9090

91-
assertThat(requestInput().getDocument()).contains(document);
91+
assertThat(request().getDocument()).contains(document);
9292
}
9393

9494
@Test
@@ -118,7 +118,7 @@ void entity() {
118118
.entity(new ParameterizedTypeReference<Map<String, MovieCharacter>>() {})
119119
.isEqualTo(Collections.singletonMap("me", luke));
120120

121-
assertThat(requestInput().getDocument()).contains(document);
121+
assertThat(request().getDocument()).contains(document);
122122
}
123123

124124
@Test
@@ -153,7 +153,7 @@ void entityList() {
153153
.entityList(new ParameterizedTypeReference<MovieCharacter>() {})
154154
.containsExactly(han, leia);
155155

156-
assertThat(requestInput().getDocument()).contains(document);
156+
assertThat(request().getDocument()).contains(document);
157157
}
158158

159159
@Test
@@ -176,13 +176,13 @@ void operationNameAndVariables() {
176176

177177
response.path("hero").entity(MovieCharacter.class).isEqualTo(MovieCharacter.create("R2-D2"));
178178

179-
RequestInput input = requestInput();
180-
assertThat(input.getDocument()).contains(document);
181-
assertThat(input.getOperationName()).isEqualTo("HeroNameAndFriends");
182-
assertThat(input.getVariables()).hasSize(3);
183-
assertThat(input.getVariables()).containsEntry("episode", "JEDI");
184-
assertThat(input.getVariables()).containsEntry("foo", "bar");
185-
assertThat(input.getVariables()).containsEntry("keyOnly", null);
179+
ExecutionGraphQlRequest request = request();
180+
assertThat(request.getDocument()).contains(document);
181+
assertThat(request.getOperationName()).isEqualTo("HeroNameAndFriends");
182+
assertThat(request.getVariables()).hasSize(3);
183+
assertThat(request.getVariables()).containsEntry("episode", "JEDI");
184+
assertThat(request.getVariables()).containsEntry("foo", "bar");
185+
assertThat(request.getVariables()).containsEntry("keyOnly", null);
186186
}
187187

188188
@Test
@@ -193,7 +193,7 @@ void errorsEmptyOnExecuteAndVerify() {
193193

194194
graphQlTester().document(document).executeAndVerify();
195195

196-
assertThat(requestInput().getDocument()).contains(document);
196+
assertThat(request().getDocument()).contains(document);
197197
}
198198

199199
@Test
@@ -205,7 +205,7 @@ void errorsCheckedOnExecuteAndVerify() {
205205
assertThatThrownBy(() -> graphQlTester().document(document).executeAndVerify())
206206
.hasMessageContaining("Response has 1 unexpected error(s)");
207207

208-
assertThat(requestInput().getDocument()).contains(document);
208+
assertThat(request().getDocument()).contains(document);
209209
}
210210

211211
@Test
@@ -217,7 +217,7 @@ void errorsCheckedOnTraverse() {
217217
assertThatThrownBy(() -> graphQlTester().document(document).execute().path("me"))
218218
.hasMessageContaining("Response has 1 unexpected error(s)");
219219

220-
assertThat(requestInput().getDocument()).contains(document);
220+
assertThat(request().getDocument()).contains(document);
221221
}
222222

223223
@Test
@@ -236,7 +236,7 @@ void errorsPartiallyFiltered() {
236236
.verify())
237237
.hasMessageContaining("Response has 1 unexpected error(s) of 2 total.");
238238

239-
assertThat(requestInput().getDocument()).contains(document);
239+
assertThat(request().getDocument()).contains(document);
240240
}
241241

242242
@Test
@@ -255,7 +255,7 @@ void errorsFiltered() {
255255
.path("me")
256256
.pathDoesNotExist();
257257

258-
assertThat(requestInput().getDocument()).contains(document);
258+
assertThat(request().getDocument()).contains(document);
259259
}
260260

261261
@Test
@@ -273,7 +273,7 @@ void errorsExpected() {
273273
.verify()
274274
.path("me").pathDoesNotExist();
275275

276-
assertThat(requestInput().getDocument()).contains(document);
276+
assertThat(request().getDocument()).contains(document);
277277
}
278278

279279
@Test
@@ -312,7 +312,7 @@ void errorsConsumed() {
312312
})
313313
.path("me").pathDoesNotExist();
314314

315-
assertThat(requestInput().getDocument()).contains(document);
315+
assertThat(request().getDocument()).contains(document);
316316
}
317317

318318
}

spring-graphql-test/src/test/java/org/springframework/graphql/test/tester/WebGraphQlTesterBuilderTests.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@
3434
import org.springframework.core.ResolvableType;
3535
import org.springframework.core.codec.DecodingException;
3636
import org.springframework.core.io.buffer.DataBuffer;
37-
import org.springframework.graphql.RequestOutput;
37+
import org.springframework.graphql.ExecutionGraphQlResponse;
38+
import org.springframework.graphql.support.DefaultExecutionGraphQlResponse;
3839
import org.springframework.graphql.support.DocumentSource;
3940
import org.springframework.graphql.web.TestWebSocketClient;
4041
import org.springframework.graphql.web.TestWebSocketConnection;
@@ -210,11 +211,11 @@ private static class WebBuilderSetup implements TesterBuilderSetup {
210211

211212
private WebInput webInput;
212213

213-
private final Map<String, RequestOutput> responses = new HashMap<>();
214+
private final Map<String, ExecutionGraphQlResponse> responses = new HashMap<>();
214215

215216
public WebBuilderSetup() {
216217

217-
RequestOutput defaultResponse = new RequestOutput(
218+
ExecutionGraphQlResponse defaultResponse = new DefaultExecutionGraphQlResponse(
218219
ExecutionInput.newExecutionInput().query(DOCUMENT).build(),
219220
ExecutionResultImpl.newExecutionResult().build());
220221

@@ -227,11 +228,11 @@ public WebGraphQlTester.Builder<?> initBuilder() {
227228
}
228229

229230
protected WebGraphQlHandler webGraphQlHandler() {
230-
return WebGraphQlHandler.builder(requestInput -> {
231-
String document = requestInput.getDocument();
232-
RequestOutput output = this.responses.get(document);
233-
Assert.notNull(output, "Unexpected request: " + document);
234-
return Mono.just(output);
231+
return WebGraphQlHandler.builder(request -> {
232+
String document = request.getDocument();
233+
ExecutionGraphQlResponse response = this.responses.get(document);
234+
Assert.notNull(response, "Unexpected request: " + document);
235+
return Mono.just(response);
235236
})
236237
.interceptor((input, chain) -> {
237238
this.webInput = input;
@@ -243,7 +244,7 @@ protected WebGraphQlHandler webGraphQlHandler() {
243244
@Override
244245
public void setMockResponse(String document, ExecutionResult result) {
245246
ExecutionInput executionInput = ExecutionInput.newExecutionInput().query(document).build();
246-
this.responses.put(document, new RequestOutput(executionInput, result));
247+
this.responses.put(document, new DefaultExecutionGraphQlResponse(executionInput, result));
247248
}
248249

249250
@Override

0 commit comments

Comments
 (0)