Skip to content

Commit 4fb82ff

Browse files
committed
some javadoc and refactored tests
1 parent 3eca533 commit 4fb82ff

File tree

3 files changed

+66
-11
lines changed

3 files changed

+66
-11
lines changed

src/main/java/graphql/servlet/ExecutionResultHandler.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,17 @@
33
import graphql.ExecutionInput;
44
import graphql.ExecutionResult;
55

6-
import java.util.Iterator;
76
import java.util.function.BiFunction;
8-
import java.util.function.Consumer;
97

108
/**
119
* @author Andrew Potter
1210
*/
1311
public interface ExecutionResultHandler {
12+
/**
13+
* Allows separating the logic of handling batch queries from how each individual query is resolved.
14+
* @param batchedInvocationInput the batch query input
15+
* @param queryFunction Function to produce query results.
16+
*/
1417
void handleBatch(GraphQLBatchedInvocationInput batchedInvocationInput, BiFunction<GraphQLInvocationInput, ExecutionInput, ExecutionResult> queryFunction);
1518
}
1619

src/test/groovy/graphql/servlet/AbstractGraphQLHttpServletSpec.groovy

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class AbstractGraphQLHttpServletSpec extends Specification {
4242

4343
def setup() {
4444
subscriptionLatch = new CountDownLatch(1)
45-
servlet = TestUtils.createServlet({ env -> env.arguments.arg }, { env -> env.arguments.arg }, { env ->
45+
servlet = TestUtils.createDefaultServlet({ env -> env.arguments.arg }, { env -> env.arguments.arg }, { env ->
4646
AtomicReference<SingleSubscriberPublisher<String>> publisherRef = new AtomicReference<>()
4747
publisherRef.set(new SingleSubscriberPublisher<String>({
4848
SingleSubscriberPublisher<String> publisher = publisherRef.get()
@@ -116,7 +116,7 @@ class AbstractGraphQLHttpServletSpec extends Specification {
116116

117117
def "async query over HTTP GET starts async request"() {
118118
setup:
119-
servlet = TestUtils.createServlet({ env -> env.arguments.arg },{ env -> env.arguments.arg }, { env ->
119+
servlet = TestUtils.createDefaultServlet({ env -> env.arguments.arg },{ env -> env.arguments.arg }, { env ->
120120
AtomicReference<SingleSubscriberPublisher<String>> publisherRef = new AtomicReference<>();
121121
publisherRef.set(new SingleSubscriberPublisher<>({ subscription ->
122122
publisherRef.get().offer(env.arguments.arg)
@@ -287,6 +287,17 @@ class AbstractGraphQLHttpServletSpec extends Specification {
287287

288288
def "Execution Result Handler allows limiting number of queries"() {
289289
setup:
290+
servlet = TestUtils.createBatchCustomizedServlet({ env -> env.arguments.arg }, { env -> env.arguments.arg }, { env ->
291+
AtomicReference<SingleSubscriberPublisher<String>> publisherRef = new AtomicReference<>()
292+
publisherRef.set(new SingleSubscriberPublisher<String>({
293+
SingleSubscriberPublisher<String> publisher = publisherRef.get()
294+
publisher.offer("First\n\n" + env.arguments.arg)
295+
publisher.offer("Second\n\n" + env.arguments.arg)
296+
publisher.noMoreData()
297+
subscriptionLatch.countDown()
298+
}))
299+
return publisherRef.get()
300+
})
290301
request.addParameter('query', '[{ "query": "query { echo(arg:\\"test\\") }" }, { "query": "query { echo(arg:\\"test\\") }" }, { "query": "query { echo(arg:\\"test\\") }" }]')
291302

292303
when:
@@ -298,6 +309,19 @@ class AbstractGraphQLHttpServletSpec extends Specification {
298309
getBatchedResponseContent().size() == 2
299310
}
300311

312+
def "Default Execution Result Handler does not limit number of queries"() {
313+
setup:
314+
request.addParameter('query', '[{ "query": "query { echo(arg:\\"test\\") }" }, { "query": "query { echo(arg:\\"test\\") }" }, { "query": "query { echo(arg:\\"test\\") }" }]')
315+
316+
when:
317+
servlet.doGet(request, response)
318+
319+
then:
320+
response.getStatus() == STATUS_OK
321+
response.getContentType() == CONTENT_TYPE_JSON_UTF8
322+
getBatchedResponseContent().size() == 3
323+
}
324+
301325
def "mutation over HTTP GET returns errors"() {
302326
setup:
303327
request.addParameter('query', 'mutation { echo(arg:"test") }')
@@ -370,7 +394,7 @@ class AbstractGraphQLHttpServletSpec extends Specification {
370394

371395
def "async query over HTTP POST starts async request"() {
372396
setup:
373-
servlet = TestUtils.createServlet({ env -> env.arguments.arg },{ env -> env.arguments.arg }, { env ->
397+
servlet = TestUtils.createDefaultServlet({ env -> env.arguments.arg },{ env -> env.arguments.arg }, { env ->
374398
AtomicReference<SingleSubscriberPublisher<String>> publisherRef = new AtomicReference<>();
375399
publisherRef.set(new SingleSubscriberPublisher<>({ subscription ->
376400
publisherRef.get().offer(env.arguments.arg)
@@ -1043,7 +1067,7 @@ class AbstractGraphQLHttpServletSpec extends Specification {
10431067

10441068
def "errors while data fetching are masked in the response"() {
10451069
setup:
1046-
servlet = TestUtils.createServlet({ throw new TestException() })
1070+
servlet = TestUtils.createDefaultServlet({ throw new TestException() })
10471071
request.addParameter('query', 'query { echo(arg:"test") }')
10481072

10491073
when:
@@ -1059,7 +1083,7 @@ class AbstractGraphQLHttpServletSpec extends Specification {
10591083

10601084
def "errors that also implement GraphQLError thrown while data fetching are passed to caller"() {
10611085
setup:
1062-
servlet = TestUtils.createServlet({ throw new TestGraphQLErrorException("This is a test message") })
1086+
servlet = TestUtils.createDefaultServlet({ throw new TestGraphQLErrorException("This is a test message") })
10631087
request.addParameter('query', 'query { echo(arg:"test") }')
10641088

10651089
when:
@@ -1076,7 +1100,7 @@ class AbstractGraphQLHttpServletSpec extends Specification {
10761100

10771101
def "batched errors while data fetching are masked in the response"() {
10781102
setup:
1079-
servlet = TestUtils.createServlet({ throw new TestException() })
1103+
servlet = TestUtils.createDefaultServlet({ throw new TestException() })
10801104
request.addParameter('query', '[{ "query": "query { echo(arg:\\"test\\") }" }, { "query": "query { echo(arg:\\"test\\") }" }]')
10811105

10821106
when:

src/test/groovy/graphql/servlet/TestUtils.groovy

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,34 @@ import java.util.concurrent.atomic.AtomicReference
1010

1111
class TestUtils {
1212

13-
static def createServlet(DataFetcher queryDataFetcher = { env -> env.arguments.arg },
13+
static def createDefaultServlet(DataFetcher queryDataFetcher = { env -> env.arguments.arg },
14+
DataFetcher mutationDataFetcher = { env -> env.arguments.arg },
15+
DataFetcher subscriptionDataFetcher = { env ->
16+
AtomicReference<SingleSubscriberPublisher<String>> publisherRef = new AtomicReference<>();
17+
publisherRef.set(new SingleSubscriberPublisher<>({ subscription ->
18+
publisherRef.get().offer(env.arguments.arg)
19+
publisherRef.get().noMoreData()
20+
}))
21+
return publisherRef.get()
22+
}, boolean asyncServletModeEnabled = false) {
23+
GraphQLExecutionResultHandlerFactory defaultHandler = new DefaultGraphQLExecutionResultHandlerFactory();
24+
createServlet(queryDataFetcher, mutationDataFetcher, subscriptionDataFetcher, asyncServletModeEnabled, defaultHandler)
25+
}
26+
27+
static def createBatchCustomizedServlet(DataFetcher queryDataFetcher = { env -> env.arguments.arg },
28+
DataFetcher mutationDataFetcher = { env -> env.arguments.arg },
29+
DataFetcher subscriptionDataFetcher = { env ->
30+
AtomicReference<SingleSubscriberPublisher<String>> publisherRef = new AtomicReference<>();
31+
publisherRef.set(new SingleSubscriberPublisher<>({ subscription ->
32+
publisherRef.get().offer(env.arguments.arg)
33+
publisherRef.get().noMoreData()
34+
}))
35+
return publisherRef.get()
36+
}, boolean asyncServletModeEnabled = false) {
37+
createServlet(queryDataFetcher, mutationDataFetcher, subscriptionDataFetcher, asyncServletModeEnabled, createBatchInputHandlerFactory())
38+
}
39+
40+
private static def createServlet(DataFetcher queryDataFetcher = { env -> env.arguments.arg },
1441
DataFetcher mutationDataFetcher = { env -> env.arguments.arg },
1542
DataFetcher subscriptionDataFetcher = { env ->
1643
AtomicReference<SingleSubscriberPublisher<String>> publisherRef = new AtomicReference<>();
@@ -19,12 +46,13 @@ class TestUtils {
1946
publisherRef.get().noMoreData()
2047
}))
2148
return publisherRef.get()
22-
}, boolean asyncServletModeEnabled = false) {
49+
}, boolean asyncServletModeEnabled = false,
50+
GraphQLExecutionResultHandlerFactory batchHandlerFactory) {
2351
GraphQLHttpServlet servlet = GraphQLHttpServlet.with(GraphQLConfiguration
2452
.with(createGraphQlSchema(queryDataFetcher, mutationDataFetcher, subscriptionDataFetcher))
2553
.with(createInstrumentedQueryInvoker())
2654
.with(asyncServletModeEnabled)
27-
.with(createBatchInputHandlerFactory())
55+
.with(batchHandlerFactory)
2856
.build())
2957
servlet.init(null)
3058
return servlet

0 commit comments

Comments
 (0)