Skip to content

Commit 1652aee

Browse files
committed
Start draining deferred results on subscription - more tests - currently failing
1 parent dcf4b11 commit 1652aee

File tree

1 file changed

+43
-7
lines changed

1 file changed

+43
-7
lines changed

‎src/test/groovy/graphql/execution/incremental/IncrementalCallStateDeferTest.groovy‎

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import graphql.execution.ResultPath
66
importgraphql.execution.pubsub.CapturingSubscriber
77
importgraphql.incremental.DelayedIncrementalPartialResult
88
importorg.awaitility.Awaitility
9+
importorg.reactivestreams.Publisher
910
importspock.lang.Specification
1011

1112
importjava.util.concurrent.CompletableFuture
@@ -58,7 +59,7 @@ class IncrementalCallStateDeferTest extends Specification{
5859
incrementalCallState.enqueue(offThread("C", 10, "/field/path"))
5960

6061
when:
61-
def subscriber =newgraphql.execution.pubsub.CapturingSubscriber<DelayedIncrementalPartialResult>(){
62+
def subscriber =newCapturingSubscriber<DelayedIncrementalPartialResult>(){
6263
@Override
6364
voidonComplete(){
6465
assertfalse, "This should not be called!"
@@ -84,7 +85,7 @@ class IncrementalCallStateDeferTest extends Specification{
8485
incrementalCallState.enqueue(offThread("C", 10, "/field/path")) // <-- will finish first
8586

8687
when:
87-
def subscriber =newgraphql.execution.pubsub.CapturingSubscriber<DelayedIncrementalPartialResult>(){
88+
def subscriber =newCapturingSubscriber<DelayedIncrementalPartialResult>(){
8889
@Override
8990
voidonNext(DelayedIncrementalPartialResultexecutionResult){
9091
this.getEvents().add(executionResult)
@@ -113,8 +114,8 @@ class IncrementalCallStateDeferTest extends Specification{
113114
incrementalCallState.enqueue(offThread("C", 10, "/field/path")) // <-- will finish first
114115

115116
when:
116-
def subscriber1 =newgraphql.execution.pubsub.CapturingSubscriber<DelayedIncrementalPartialResult>()
117-
def subscriber2 =newgraphql.execution.pubsub.CapturingSubscriber<DelayedIncrementalPartialResult>()
117+
def subscriber1 =newCapturingSubscriber<DelayedIncrementalPartialResult>()
118+
def subscriber2 =newCapturingSubscriber<DelayedIncrementalPartialResult>()
118119
incrementalCallState.startDeferredCalls().subscribe(subscriber1)
119120
incrementalCallState.startDeferredCalls().subscribe(subscriber2)
120121

@@ -196,7 +197,38 @@ class IncrementalCallStateDeferTest extends Specification{
196197
results.any{it.incremental[0].data["c"] =="C" }
197198
}
198199

200+
def"nothing happens until the publisher is subscribed to"(){
201+
202+
def startingValue ="*"
203+
given:
204+
def incrementalCallState =newIncrementalCallState()
205+
incrementalCallState.enqueue(offThread({-> startingValue +"A"}, 100, "/field/path")) // <-- will finish last
206+
incrementalCallState.enqueue(offThread({-> startingValue +"B"}, 50, "/field/path")) // <-- will finish second
207+
incrementalCallState.enqueue(offThread({-> startingValue +"C"}, 10, "/field/path")) // <-- will finish first
208+
209+
when:
210+
211+
// get the publisher but not work has been done here
212+
def publisher = incrementalCallState.startDeferredCalls()
213+
// we are changing a side effect after the publisher is created
214+
startingValue ="_"
215+
216+
// subscription wll case the queue publisher to start draining the queue
217+
List<DelayedIncrementalPartialResult> results = subscribeAndWaitCalls(publisher)
218+
219+
then:
220+
assertResultsSizeAndHasNextRule(3, results)
221+
results[0].incremental[0].data["_c"] =="_C"
222+
results[1].incremental[0].data["_b"] =="_B"
223+
results[2].incremental[0].data["_a"] =="_A"
224+
}
225+
226+
199227
privatestaticDeferredFragmentCalloffThread(Stringdata, intsleepTime, Stringpath){
228+
offThread(() -> data, sleepTime, path)
229+
}
230+
231+
privatestaticDeferredFragmentCalloffThread(Supplier<String>dataSupplier, intsleepTime, Stringpath){
200232
def callSupplier =newSupplier<CompletableFuture<DeferredFragmentCall.FieldWithExecutionResult>>(){
201233
@Override
202234
CompletableFuture<DeferredFragmentCall.FieldWithExecutionResult>get(){
@@ -205,6 +237,7 @@ class IncrementalCallStateDeferTest extends Specification{
205237
if (data =="Bang"){
206238
thrownewRuntimeException(data)
207239
}
240+
String data = dataSupplier.get()
208241
newDeferredFragmentCall.FieldWithExecutionResult(data.toLowerCase(), newExecutionResultImpl(data, []))
209242
})
210243
}
@@ -240,10 +273,13 @@ class IncrementalCallStateDeferTest extends Specification{
240273
}
241274

242275
privatestaticList<DelayedIncrementalPartialResult>startAndWaitCalls(IncrementalCallStateincrementalCallState){
243-
defsubscriber=newCapturingSubscriber<DelayedIncrementalPartialResult>()
244-
245-
incrementalCallState.startDeferredCalls().subscribe(subscriber)
276+
defpublisher=incrementalCallState.startDeferredCalls()
277+
return subscribeAndWaitCalls(publisher)
278+
}
246279

280+
privatestaticList<DelayedIncrementalPartialResult>subscribeAndWaitCalls(Publisher<DelayedIncrementalPartialResult>publisher){
281+
def subscriber =newCapturingSubscriber<DelayedIncrementalPartialResult>()
282+
publisher.subscribe(subscriber)
247283
Awaitility.await().untilTrue(subscriber.isDone())
248284
return subscriber.getEvents()
249285
}

0 commit comments

Comments
(0)