@@ -4,15 +4,22 @@ import batching.GetLaunch2Query
4
4
import batching.GetLaunchQuery
5
5
import com.apollographql.apollo.ApolloClient
6
6
import com.apollographql.apollo.api.AnyAdapter
7
+ import com.apollographql.apollo.api.ApolloResponse
7
8
import com.apollographql.apollo.api.CustomScalarAdapters
8
9
import com.apollographql.apollo.api.ExecutionOptions.Companion.CAN_BE_BATCHED
9
10
import com.apollographql.apollo.api.http.HttpHeader
10
11
import com.apollographql.apollo.api.json.jsonReader
12
+ import com.apollographql.apollo.testing.internal.runTest
13
+ import com.apollographql.mockserver.MockRequest
14
+ import com.apollographql.mockserver.MockRequestBase
15
+ import com.apollographql.mockserver.MockResponse
11
16
import com.apollographql.mockserver.MockServer
17
+ import com.apollographql.mockserver.MockServerHandler
12
18
import com.apollographql.mockserver.awaitRequest
13
19
import com.apollographql.mockserver.enqueueString
14
- import com.apollographql.apollo.testing.internal.runTest
20
+ import kotlinx.coroutines.Deferred
15
21
import kotlinx.coroutines.async
22
+ import kotlinx.coroutines.awaitAll
16
23
import kotlinx.coroutines.delay
17
24
import okio.Buffer
18
25
import kotlin.test.Ignore
@@ -21,7 +28,9 @@ import kotlin.test.assertEquals
21
28
import kotlin.test.assertFails
22
29
import kotlin.test.assertFalse
23
30
import kotlin.test.assertIs
31
+ import kotlin.test.assertNotNull
24
32
import kotlin.test.assertTrue
33
+ import kotlin.time.Duration.Companion.seconds
25
34
26
35
class QueryBatchingTest {
27
36
private lateinit var mockServer: MockServer
@@ -90,7 +99,7 @@ class QueryBatchingTest {
90
99
91
100
// Only one request must have been sent
92
101
assertFails {
93
- mockServer.awaitRequest()
102
+ mockServer.awaitRequest(3 .seconds )
94
103
}
95
104
}
96
105
@@ -217,7 +226,7 @@ class QueryBatchingTest {
217
226
218
227
// Only one request must have been sent
219
228
assertFails {
220
- mockServer.awaitRequest()
229
+ mockServer.awaitRequest(3 .seconds )
221
230
}
222
231
}
223
232
@@ -251,7 +260,7 @@ class QueryBatchingTest {
251
260
val request = mockServer.awaitRequest()
252
261
// Only one request must have been sent
253
262
assertFails {
254
- mockServer.awaitRequest()
263
+ mockServer.awaitRequest(3 .seconds )
255
264
}
256
265
assertTrue(request.headers[" client0" ] == " 0" )
257
266
assertTrue(request.headers[" client1" ] == " 1" )
@@ -296,4 +305,45 @@ class QueryBatchingTest {
296
305
assertFalse(request.headers.keys.contains(" query1+query2-different-value" ))
297
306
assertFalse(request.headers.keys.contains(CAN_BE_BATCHED ))
298
307
}
308
+
309
+ @Test
310
+ fun batchSizeIsHonoredWithConcurrency () = runTest(before = { setUp() }, after = { tearDown() }) {
311
+ mockServer.close()
312
+ mockServer = MockServer .Builder ().handler(object : MockServerHandler {
313
+ override fun handle (request : MockRequestBase ): MockResponse {
314
+ val jsonReader = Buffer ().write((request as MockRequest ).body).jsonReader()
315
+ jsonReader.beginArray()
316
+ var arrayLength = 0
317
+ while (jsonReader.hasNext()) {
318
+ jsonReader.skipValue()
319
+ arrayLength++
320
+ }
321
+
322
+ // Check we never receive more than maxBatchSize queries
323
+ assertTrue(arrayLength <= 10 )
324
+
325
+ return MockResponse .Builder ()
326
+ .body(" [" + List (arrayLength) { """ {"data":{"launch":{"id":"83"}}}""" }.joinToString() + " ]" )
327
+ .build()
328
+ }
329
+ }).build()
330
+
331
+ apolloClient = ApolloClient .Builder ()
332
+ .serverUrl(mockServer.url())
333
+ .httpBatching(maxBatchSize = 10 , batchIntervalMillis = 10 )
334
+ .build()
335
+
336
+ val deferredResults = mutableListOf<Deferred <ApolloResponse <GetLaunchQuery .Data >>>()
337
+ repeat(100 ) {
338
+ deferredResults + = async {
339
+ delay(1 )
340
+ apolloClient.query(GetLaunchQuery ())
341
+ .canBeBatched(true )
342
+ .execute()
343
+ }
344
+ }
345
+ for (apolloResponse in deferredResults.awaitAll()) {
346
+ assertNotNull(apolloResponse.data)
347
+ }
348
+ }
299
349
}
0 commit comments