Skip to content

Commit dc90558

Browse files
committed
Configure ExecutionInput in ExecutionGraphQlServiceTester
Closes gh-615
1 parent 44ff134 commit dc90558

File tree

5 files changed

+83
-11
lines changed

5 files changed

+83
-11
lines changed

spring-graphql-docs/src/docs/asciidoc/includes/testing.adoc

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,17 @@ Once `ExecutionGraphQlServiceTester` is created, you can begin to
223223
<<testing.requests, execute requests>> using the same API, independent of the underlying
224224
transport.
225225

226+
`ExecutionGraphQlServiceTester.Builder` provides an option to customize `ExecutionInput` details:
227+
228+
[source,java,indent=0,subs="verbatim,quotes"]
229+
----
230+
GraphQlService service = ... ;
231+
ExecutionGraphQlServiceTester tester = ExecutionGraphQlServiceTester.builder(service)
232+
.configureExecutionInput((executionInput, builder) -> builder.executionId(id).build())
233+
.build();
234+
----
235+
236+
226237

227238
[[testing.webgraphqltester]]
228239
=== `WebGraphQlHandler`

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

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2022 the original author or authors.
2+
* Copyright 2002-2023 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -17,9 +17,14 @@
1717
package org.springframework.graphql.test.tester;
1818

1919

20+
import java.util.ArrayList;
2021
import java.util.Collections;
22+
import java.util.List;
23+
import java.util.function.BiFunction;
2124
import java.util.function.Consumer;
2225

26+
import graphql.ExecutionInput;
27+
2328
import org.springframework.core.codec.Decoder;
2429
import org.springframework.core.codec.Encoder;
2530
import org.springframework.graphql.ExecutionGraphQlService;
@@ -40,6 +45,8 @@ final class DefaultExecutionGraphQlServiceTesterBuilder
4045

4146
private final ExecutionGraphQlService service;
4247

48+
private final List<BiFunction<ExecutionInput, ExecutionInput.Builder, ExecutionInput>> executionInputConfigurers;
49+
4350
@Nullable
4451
private Encoder<?> encoder;
4552

@@ -50,10 +57,20 @@ final class DefaultExecutionGraphQlServiceTesterBuilder
5057
DefaultExecutionGraphQlServiceTesterBuilder(ExecutionGraphQlService service) {
5158
Assert.notNull(service, "GraphQlService is required");
5259
this.service = service;
60+
this.executionInputConfigurers = new ArrayList<>();
5361
}
5462

5563
DefaultExecutionGraphQlServiceTesterBuilder(GraphQlServiceGraphQlTransport transport) {
5664
this.service = transport.getGraphQlService();
65+
this.executionInputConfigurers = new ArrayList<>(transport.getExecutionInputConfigurers());
66+
}
67+
68+
@Override
69+
public DefaultExecutionGraphQlServiceTesterBuilder configureExecutionInput(
70+
BiFunction<ExecutionInput, ExecutionInput.Builder, ExecutionInput> configurer) {
71+
72+
this.executionInputConfigurers.add(configurer);
73+
return this;
5774
}
5875

5976
@Override
@@ -71,7 +88,7 @@ public DefaultExecutionGraphQlServiceTesterBuilder decoder(Decoder<?> decoder) {
7188
@Override
7289
public ExecutionGraphQlServiceTester build() {
7390
registerJsonPathMappingProvider();
74-
GraphQlServiceGraphQlTransport transport = new GraphQlServiceGraphQlTransport(this.service);
91+
GraphQlServiceGraphQlTransport transport = createTransport();
7592
GraphQlTester tester = super.buildGraphQlTester(transport);
7693
return new DefaultExecutionGraphQlServiceTester(tester, transport, getBuilderInitializer());
7794
}
@@ -86,6 +103,10 @@ private void registerJsonPathMappingProvider() {
86103
}
87104
}
88105

106+
private GraphQlServiceGraphQlTransport createTransport() {
107+
return new GraphQlServiceGraphQlTransport(this.service, this.executionInputConfigurers);
108+
}
109+
89110

90111
/**
91112
* Default {@link ExecutionGraphQlServiceTester} implementation.

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2022 the original author or authors.
2+
* Copyright 2002-2023 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -16,6 +16,10 @@
1616

1717
package org.springframework.graphql.test.tester;
1818

19+
import java.util.function.BiFunction;
20+
21+
import graphql.ExecutionInput;
22+
1923
import org.springframework.core.codec.Decoder;
2024
import org.springframework.core.codec.Encoder;
2125
import org.springframework.graphql.ExecutionGraphQlService;
@@ -54,6 +58,14 @@ static ExecutionGraphQlServiceTester.Builder<?> builder(ExecutionGraphQlService
5458
*/
5559
interface Builder<B extends Builder<B>> extends GraphQlTester.Builder<B> {
5660

61+
/**
62+
* Provide a {@code BiFunction} to help initialize the
63+
* {@link ExecutionInput} with.
64+
* @since 1.1.2
65+
* @see org.springframework.graphql.ExecutionGraphQlRequest#configureExecutionInput(BiFunction)
66+
*/
67+
B configureExecutionInput(BiFunction<ExecutionInput, ExecutionInput.Builder, ExecutionInput> configurer);
68+
5769
/**
5870
* Configure the JSON encoder to use for mapping response data to
5971
* higher level objects.

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

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2022 the original author or authors.
2+
* Copyright 2002-2023 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -17,6 +17,11 @@
1717
package org.springframework.graphql.test.tester;
1818

1919

20+
import java.util.ArrayList;
21+
import java.util.List;
22+
import java.util.function.BiFunction;
23+
24+
import graphql.ExecutionInput;
2025
import reactor.core.publisher.Mono;
2126

2227
import org.springframework.graphql.ExecutionGraphQlRequest;
@@ -35,19 +40,30 @@ final class GraphQlServiceGraphQlTransport extends AbstractDirectGraphQlTranspor
3540

3641
private final ExecutionGraphQlService graphQlService;
3742

43+
private final List<BiFunction<ExecutionInput, ExecutionInput.Builder, ExecutionInput>> executionInputConfigurers;
44+
45+
46+
GraphQlServiceGraphQlTransport(
47+
ExecutionGraphQlService graphQlService,
48+
List<BiFunction<ExecutionInput, ExecutionInput.Builder, ExecutionInput>> executionInputConfigurers) {
3849

39-
GraphQlServiceGraphQlTransport(ExecutionGraphQlService graphQlService) {
4050
Assert.notNull(graphQlService, "GraphQlService is required");
4151
this.graphQlService = graphQlService;
52+
this.executionInputConfigurers = new ArrayList<>(executionInputConfigurers);
4253
}
4354

4455

4556
public ExecutionGraphQlService getGraphQlService() {
4657
return this.graphQlService;
4758
}
4859

60+
public List<BiFunction<ExecutionInput, ExecutionInput.Builder, ExecutionInput>> getExecutionInputConfigurers() {
61+
return this.executionInputConfigurers;
62+
}
63+
4964
@Override
5065
protected Mono<ExecutionGraphQlResponse> executeInternal(ExecutionGraphQlRequest request) {
66+
this.executionInputConfigurers.forEach(request::configureExecutionInput);
5167
return this.graphQlService.execute(request);
5268
}
5369

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

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2022 the original author or authors.
2+
* Copyright 2002-2023 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -21,12 +21,14 @@
2121

2222
import graphql.ExecutionResultImpl;
2323
import graphql.GraphqlErrorBuilder;
24+
import graphql.execution.ExecutionId;
2425
import org.junit.jupiter.api.Test;
2526
import reactor.core.publisher.Mono;
2627

2728
import org.springframework.core.ResolvableType;
2829
import org.springframework.core.codec.DecodingException;
2930
import org.springframework.core.io.buffer.DataBuffer;
31+
import org.springframework.graphql.ExecutionGraphQlRequest;
3032
import org.springframework.graphql.ExecutionGraphQlService;
3133
import org.springframework.graphql.support.DocumentSource;
3234
import org.springframework.http.codec.json.Jackson2JsonDecoder;
@@ -63,17 +65,27 @@ void mutateDocumentSource() {
6365
getGraphQlService().setDataAsJson(DOCUMENT, "{}");
6466

6567
// Original
66-
GraphQlTester.Builder<?> builder = graphQlTesterBuilder().documentSource(documentSource);
67-
GraphQlTester tester = builder.build();
68+
ExecutionGraphQlServiceTester tester = graphQlTesterBuilder()
69+
.documentSource(documentSource)
70+
.configureExecutionInput((executionInput, builder) -> builder.operationName("A").build())
71+
.build();
6872
tester.documentName("name").execute();
6973

70-
assertThat(getActualRequestDocument()).isEqualTo(DOCUMENT);
74+
ExecutionGraphQlRequest request = getGraphQlService().getGraphQlRequest();
75+
assertThat(request.toExecutionInput().getOperationName()).isEqualTo("A");
76+
assertThat(request.getDocument()).isEqualTo(DOCUMENT);
7177

7278
// Mutate
73-
tester = tester.mutate().build();
79+
ExecutionId id = ExecutionId.from("123");
80+
tester = tester.mutate()
81+
.configureExecutionInput((executionInput, builder) -> builder.executionId(id).build())
82+
.build();
7483
tester.documentName("name").execute();
7584

76-
assertThat(getActualRequestDocument()).isEqualTo(DOCUMENT);
85+
request = getGraphQlService().getGraphQlRequest();
86+
assertThat(request.toExecutionInput().getOperationName()).isEqualTo("A");
87+
assertThat(request.toExecutionInput().getExecutionId()).isEqualTo(id);
88+
assertThat(request.getDocument()).isEqualTo(DOCUMENT);
7789
}
7890

7991
@Test

0 commit comments

Comments
 (0)