@@ -134,6 +134,8 @@ impl SubgraphClient {
134
134
135
135
#[ cfg( test) ]
136
136
mod test {
137
+ use std:: str:: FromStr ;
138
+
137
139
use serde_json:: json;
138
140
use wiremock:: matchers:: { method, path} ;
139
141
use wiremock:: { Mock , MockServer , ResponseTemplate } ;
@@ -197,4 +199,220 @@ mod test {
197
199
198
200
assert ! ( result. data. is_some( ) ) ;
199
201
}
202
+
203
+ #[ tokio:: test]
204
+ async fn test_uses_local_deployment_if_healthy_and_synced ( ) {
205
+ let deployment =
206
+ DeploymentId :: from_str ( "QmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" ) . unwrap ( ) ;
207
+
208
+ let mock_server_local = MockServer :: start ( ) . await ;
209
+ mock_server_local
210
+ . register (
211
+ Mock :: given ( method ( "POST" ) )
212
+ . and ( path ( "/status" ) )
213
+ . respond_with ( ResponseTemplate :: new ( 200 ) . set_body_json ( json ! ( {
214
+ "data" : {
215
+ "indexingStatuses" : [
216
+ {
217
+ "synced" : true ,
218
+ "health" : "healthy"
219
+ }
220
+ ]
221
+ }
222
+ } ) ) ) ,
223
+ )
224
+ . await ;
225
+ mock_server_local
226
+ . register (
227
+ Mock :: given ( method ( "POST" ) )
228
+ . and ( path ( & format ! ( "/subgraphs/id/{}" , deployment) ) )
229
+ . respond_with ( ResponseTemplate :: new ( 200 ) . set_body_json ( json ! ( {
230
+ "data" : {
231
+ "user" : {
232
+ "name" : "local"
233
+ }
234
+ }
235
+ } ) ) ) ,
236
+ )
237
+ . await ;
238
+
239
+ let mock_server_remote = MockServer :: start ( ) . await ;
240
+ mock_server_remote
241
+ . register (
242
+ Mock :: given ( method ( "POST" ) )
243
+ . and ( path ( & format ! ( "/subgraphs/id/{}" , deployment) ) )
244
+ . respond_with ( ResponseTemplate :: new ( 200 ) . set_body_json ( json ! ( {
245
+ "data" : {
246
+ "user" : {
247
+ "name" : "remote"
248
+ }
249
+ }
250
+ } ) ) ) ,
251
+ )
252
+ . await ;
253
+
254
+ // Create the subgraph client
255
+ let client = SubgraphClient :: new (
256
+ Some ( DeploymentDetails :: for_graph_node ( & mock_server_local. uri ( ) , deployment) . unwrap ( ) ) ,
257
+ DeploymentDetails :: for_query_url ( & format ! (
258
+ "{}/subgraphs/id/{}" ,
259
+ mock_server_remote. uri( ) ,
260
+ deployment
261
+ ) )
262
+ . unwrap ( ) ,
263
+ )
264
+ . unwrap ( ) ;
265
+
266
+ // Query the subgraph
267
+ let response: Response < Value > = client
268
+ . query ( & json ! ( { "query" : "{ user(id: 1} { name } }" } ) )
269
+ . await
270
+ . unwrap ( ) ;
271
+
272
+ assert_eq ! ( response. data, Some ( json!( { "user" : { "name" : "local" } } ) ) ) ;
273
+ }
274
+
275
+ #[ tokio:: test]
276
+ async fn test_uses_query_url_if_local_deployment_is_unhealthy ( ) {
277
+ let deployment =
278
+ DeploymentId :: from_str ( "QmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" ) . unwrap ( ) ;
279
+
280
+ let mock_server_local = MockServer :: start ( ) . await ;
281
+ mock_server_local
282
+ . register (
283
+ Mock :: given ( method ( "POST" ) )
284
+ . and ( path ( "/status" ) )
285
+ . respond_with ( ResponseTemplate :: new ( 200 ) . set_body_json ( json ! ( {
286
+ "data" : {
287
+ "indexingStatuses" : [
288
+ {
289
+ "synced" : true ,
290
+ "health" : "unhealthy"
291
+ }
292
+ ]
293
+ }
294
+ } ) ) ) ,
295
+ )
296
+ . await ;
297
+ mock_server_local
298
+ . register (
299
+ Mock :: given ( method ( "POST" ) )
300
+ . and ( path ( & format ! ( "/subgraphs/id/{}" , deployment) ) )
301
+ . respond_with ( ResponseTemplate :: new ( 200 ) . set_body_json ( json ! ( {
302
+ "data" : {
303
+ "user" : {
304
+ "name" : "local"
305
+ }
306
+ }
307
+ } ) ) ) ,
308
+ )
309
+ . await ;
310
+
311
+ let mock_server_remote = MockServer :: start ( ) . await ;
312
+ mock_server_remote
313
+ . register (
314
+ Mock :: given ( method ( "POST" ) )
315
+ . and ( path ( & format ! ( "/subgraphs/id/{}" , deployment) ) )
316
+ . respond_with ( ResponseTemplate :: new ( 200 ) . set_body_json ( json ! ( {
317
+ "data" : {
318
+ "user" : {
319
+ "name" : "remote"
320
+ }
321
+ }
322
+ } ) ) ) ,
323
+ )
324
+ . await ;
325
+
326
+ // Create the subgraph client
327
+ let client = SubgraphClient :: new (
328
+ Some ( DeploymentDetails :: for_graph_node ( & mock_server_local. uri ( ) , deployment) . unwrap ( ) ) ,
329
+ DeploymentDetails :: for_query_url ( & format ! (
330
+ "{}/subgraphs/id/{}" ,
331
+ mock_server_remote. uri( ) ,
332
+ deployment
333
+ ) )
334
+ . unwrap ( ) ,
335
+ )
336
+ . unwrap ( ) ;
337
+
338
+ // Query the subgraph
339
+ let response: Response < Value > = client
340
+ . query ( & json ! ( { "query" : "{ user(id: 1} { name } }" } ) )
341
+ . await
342
+ . unwrap ( ) ;
343
+
344
+ assert_eq ! ( response. data, Some ( json!( { "user" : { "name" : "remote" } } ) ) ) ;
345
+ }
346
+
347
+ #[ tokio:: test]
348
+ async fn test_uses_query_url_if_local_deployment_is_not_synced ( ) {
349
+ let deployment =
350
+ DeploymentId :: from_str ( "QmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" ) . unwrap ( ) ;
351
+
352
+ let mock_server_local = MockServer :: start ( ) . await ;
353
+ mock_server_local
354
+ . register (
355
+ Mock :: given ( method ( "POST" ) )
356
+ . and ( path ( "/status" ) )
357
+ . respond_with ( ResponseTemplate :: new ( 200 ) . set_body_json ( json ! ( {
358
+ "data" : {
359
+ "indexingStatuses" : [
360
+ {
361
+ "synced" : false ,
362
+ "health" : "healthy"
363
+ }
364
+ ]
365
+ }
366
+ } ) ) ) ,
367
+ )
368
+ . await ;
369
+ mock_server_local
370
+ . register (
371
+ Mock :: given ( method ( "POST" ) )
372
+ . and ( path ( & format ! ( "/subgraphs/id/{}" , deployment) ) )
373
+ . respond_with ( ResponseTemplate :: new ( 200 ) . set_body_json ( json ! ( {
374
+ "data" : {
375
+ "user" : {
376
+ "name" : "local"
377
+ }
378
+ }
379
+ } ) ) ) ,
380
+ )
381
+ . await ;
382
+
383
+ let mock_server_remote = MockServer :: start ( ) . await ;
384
+ mock_server_remote
385
+ . register (
386
+ Mock :: given ( method ( "POST" ) )
387
+ . and ( path ( & format ! ( "/subgraphs/id/{}" , deployment) ) )
388
+ . respond_with ( ResponseTemplate :: new ( 200 ) . set_body_json ( json ! ( {
389
+ "data" : {
390
+ "user" : {
391
+ "name" : "remote"
392
+ }
393
+ }
394
+ } ) ) ) ,
395
+ )
396
+ . await ;
397
+
398
+ // Create the subgraph client
399
+ let client = SubgraphClient :: new (
400
+ Some ( DeploymentDetails :: for_graph_node ( & mock_server_local. uri ( ) , deployment) . unwrap ( ) ) ,
401
+ DeploymentDetails :: for_query_url ( & format ! (
402
+ "{}/subgraphs/id/{}" ,
403
+ mock_server_remote. uri( ) ,
404
+ deployment
405
+ ) )
406
+ . unwrap ( ) ,
407
+ )
408
+ . unwrap ( ) ;
409
+
410
+ // Query the subgraph
411
+ let response: Response < Value > = client
412
+ . query ( & json ! ( { "query" : "{ user(id: 1} { name } }" } ) )
413
+ . await
414
+ . unwrap ( ) ;
415
+
416
+ assert_eq ! ( response. data, Some ( json!( { "user" : { "name" : "remote" } } ) ) ) ;
417
+ }
200
418
}
0 commit comments