@@ -297,12 +297,11 @@ mod dynamic_context_switching {
297
297
}
298
298
299
299
#[ test]
300
- fn test_res ( ) {
300
+ fn test_res_success ( ) {
301
301
let schema = RootNode :: new ( Schema , EmptyMutation :: < OuterContext > :: new ( ) ) ;
302
302
let doc = r"
303
303
{
304
304
first: itemRes(key: 0) { value }
305
- missing: itemRes(key: 2) { value }
306
305
}
307
306
" ;
308
307
@@ -318,13 +317,7 @@ mod dynamic_context_switching {
318
317
319
318
let ( result, errs) = :: execute ( doc, None , & schema, & vars, & ctx) . expect ( "Execution failed" ) ;
320
319
321
- assert_eq ! ( errs, vec![
322
- ExecutionError :: new(
323
- SourcePosition :: new( 70 , 3 , 12 ) ,
324
- & [ "missing" ] ,
325
- FieldError :: new( "Could not find key 2" , Value :: null( ) ) ,
326
- ) ,
327
- ] ) ;
320
+ assert_eq ! ( errs, vec![ ] ) ;
328
321
329
322
println ! ( "Result: {:?}" , result) ;
330
323
@@ -334,10 +327,43 @@ mod dynamic_context_switching {
334
327
( "first" , Value :: object( vec![
335
328
( "value" , Value :: string( "First value" ) ) ,
336
329
] . into_iter( ) . collect( ) ) ) ,
337
- ( "missing" , Value :: null( ) ) ,
338
330
] . into_iter( ) . collect( ) ) ) ;
339
331
}
340
332
333
+ #[ test]
334
+ fn test_res_fail ( ) {
335
+ let schema = RootNode :: new ( Schema , EmptyMutation :: < OuterContext > :: new ( ) ) ;
336
+ let doc = r"
337
+ {
338
+ missing: itemRes(key: 2) { value }
339
+ }
340
+ " ;
341
+
342
+ let vars = vec ! [ ] . into_iter ( ) . collect ( ) ;
343
+
344
+ let ctx = OuterContext {
345
+ items : vec ! [
346
+ ( 0 , InnerContext { value: "First value" . to_owned( ) } ) ,
347
+ ( 1 , InnerContext { value: "Second value" . to_owned( ) } ) ,
348
+ ] . into_iter ( )
349
+ . collect ( ) ,
350
+ } ;
351
+
352
+ let ( result, errs) = :: execute ( doc, None , & schema, & vars, & ctx) . expect ( "Execution failed" ) ;
353
+
354
+ assert_eq ! ( errs, vec![
355
+ ExecutionError :: new(
356
+ SourcePosition :: new( 25 , 2 , 12 ) ,
357
+ & [ "missing" ] ,
358
+ FieldError :: new( "Could not find key 2" , Value :: null( ) ) ,
359
+ ) ,
360
+ ] ) ;
361
+
362
+ println ! ( "Result: {:?}" , result) ;
363
+
364
+ assert_eq ! ( result, Value :: null( ) ) ;
365
+ }
366
+
341
367
#[ test]
342
368
fn test_res_opt ( ) {
343
369
let schema = RootNode :: new ( Schema , EmptyMutation :: < OuterContext > :: new ( ) ) ;
@@ -413,24 +439,31 @@ mod dynamic_context_switching {
413
439
}
414
440
}
415
441
416
- mod nulls_out_errors {
442
+ mod propagates_errors_to_nullable_fields {
417
443
use value:: Value ;
418
444
use schema:: model:: RootNode ;
419
445
use executor:: { ExecutionError , FieldError , FieldResult } ;
420
446
use parser:: SourcePosition ;
421
447
use types:: scalars:: EmptyMutation ;
422
448
423
449
struct Schema ;
450
+ struct Inner ;
424
451
425
452
graphql_object ! ( Schema : ( ) |& self | {
426
- field sync( ) -> FieldResult <& str > { Ok ( "sync" ) }
427
- field sync_error( ) -> FieldResult <& str > { Err ( "Error for syncError" ) ? }
453
+ field inner( ) -> Inner { Inner }
454
+ } ) ;
455
+
456
+ graphql_object ! ( Inner : ( ) |& self | {
457
+ field nullable_field( ) -> Option <Inner > { Some ( Inner ) }
458
+ field non_nullable_field( ) -> Inner { Inner }
459
+ field nullable_error_field( ) -> FieldResult <Option <& str >> { Err ( "Error for nullableErrorField" ) ? }
460
+ field non_nullable_error_field( ) -> FieldResult <& str > { Err ( "Error for nonNullableErrorField" ) ? }
428
461
} ) ;
429
462
430
463
#[ test]
431
- fn test ( ) {
464
+ fn nullable_first_level ( ) {
432
465
let schema = RootNode :: new ( Schema , EmptyMutation :: < ( ) > :: new ( ) ) ;
433
- let doc = r"{ sync, syncError }" ;
466
+ let doc = r"{ inner { nullableErrorField } }" ;
434
467
435
468
let vars = vec ! [ ] . into_iter ( ) . collect ( ) ;
436
469
@@ -440,18 +473,119 @@ mod nulls_out_errors {
440
473
441
474
assert_eq ! (
442
475
result,
443
- Value :: object( vec![
444
- ( "sync" , Value :: string( "sync" ) ) ,
445
- ( "syncError" , Value :: null( ) ) ,
446
- ] . into_iter( ) . collect( ) ) ) ;
476
+ graphql_value!( { "inner" : { "nullableErrorField" : None } } ) ) ;
477
+
478
+ assert_eq ! (
479
+ errs,
480
+ vec![
481
+ ExecutionError :: new(
482
+ SourcePosition :: new( 10 , 0 , 10 ) ,
483
+ & [ "inner" , "nullableErrorField" ] ,
484
+ FieldError :: new( "Error for nullableErrorField" , Value :: null( ) ) ,
485
+ ) ,
486
+ ] ) ;
487
+ }
488
+
489
+ #[ test]
490
+ fn non_nullable_first_level ( ) {
491
+ let schema = RootNode :: new ( Schema , EmptyMutation :: < ( ) > :: new ( ) ) ;
492
+ let doc = r"{ inner { nonNullableErrorField } }" ;
493
+
494
+ let vars = vec ! [ ] . into_iter ( ) . collect ( ) ;
495
+
496
+ let ( result, errs) = :: execute ( doc, None , & schema, & vars, & ( ) ) . expect ( "Execution failed" ) ;
497
+
498
+ println ! ( "Result: {:?}" , result) ;
499
+
500
+ assert_eq ! (
501
+ result,
502
+ graphql_value!( None ) ) ;
503
+
504
+ assert_eq ! (
505
+ errs,
506
+ vec![
507
+ ExecutionError :: new(
508
+ SourcePosition :: new( 10 , 0 , 10 ) ,
509
+ & [ "inner" , "nonNullableErrorField" ] ,
510
+ FieldError :: new( "Error for nonNullableErrorField" , Value :: null( ) ) ,
511
+ ) ,
512
+ ] ) ;
513
+ }
514
+
515
+ #[ test]
516
+ fn nullable_nested_level ( ) {
517
+ let schema = RootNode :: new ( Schema , EmptyMutation :: < ( ) > :: new ( ) ) ;
518
+ let doc = r"{ inner { nullableField { nonNullableErrorField } } }" ;
519
+
520
+ let vars = vec ! [ ] . into_iter ( ) . collect ( ) ;
521
+
522
+ let ( result, errs) = :: execute ( doc, None , & schema, & vars, & ( ) ) . expect ( "Execution failed" ) ;
523
+
524
+ println ! ( "Result: {:?}" , result) ;
525
+
526
+ assert_eq ! (
527
+ result,
528
+ graphql_value!( { "inner" : { "nullableField" : None } } ) ) ;
529
+
530
+ assert_eq ! (
531
+ errs,
532
+ vec![
533
+ ExecutionError :: new(
534
+ SourcePosition :: new( 26 , 0 , 26 ) ,
535
+ & [ "inner" , "nullableField" , "nonNullableErrorField" ] ,
536
+ FieldError :: new( "Error for nonNullableErrorField" , Value :: null( ) ) ,
537
+ ) ,
538
+ ] ) ;
539
+ }
540
+
541
+ #[ test]
542
+ fn non_nullable_nested_level ( ) {
543
+ let schema = RootNode :: new ( Schema , EmptyMutation :: < ( ) > :: new ( ) ) ;
544
+ let doc = r"{ inner { nonNullableField { nonNullableErrorField } } }" ;
545
+
546
+ let vars = vec ! [ ] . into_iter ( ) . collect ( ) ;
547
+
548
+ let ( result, errs) = :: execute ( doc, None , & schema, & vars, & ( ) ) . expect ( "Execution failed" ) ;
549
+
550
+ println ! ( "Result: {:?}" , result) ;
551
+
552
+ assert_eq ! (
553
+ result,
554
+ graphql_value!( None ) ) ;
555
+
556
+ assert_eq ! (
557
+ errs,
558
+ vec![
559
+ ExecutionError :: new(
560
+ SourcePosition :: new( 29 , 0 , 29 ) ,
561
+ & [ "inner" , "nonNullableField" , "nonNullableErrorField" ] ,
562
+ FieldError :: new( "Error for nonNullableErrorField" , Value :: null( ) ) ,
563
+ ) ,
564
+ ] ) ;
565
+ }
566
+
567
+ #[ test]
568
+ fn nullable_innermost ( ) {
569
+ let schema = RootNode :: new ( Schema , EmptyMutation :: < ( ) > :: new ( ) ) ;
570
+ let doc = r"{ inner { nonNullableField { nullableErrorField } } }" ;
571
+
572
+ let vars = vec ! [ ] . into_iter ( ) . collect ( ) ;
573
+
574
+ let ( result, errs) = :: execute ( doc, None , & schema, & vars, & ( ) ) . expect ( "Execution failed" ) ;
575
+
576
+ println ! ( "Result: {:?}" , result) ;
577
+
578
+ assert_eq ! (
579
+ result,
580
+ graphql_value!( { "inner" : { "nonNullableField" : { "nullableErrorField" : None } } } ) ) ;
447
581
448
582
assert_eq ! (
449
583
errs,
450
584
vec![
451
585
ExecutionError :: new(
452
- SourcePosition :: new( 8 , 0 , 8 ) ,
453
- & [ "syncError " ] ,
454
- FieldError :: new( "Error for syncError " , Value :: null( ) ) ,
586
+ SourcePosition :: new( 29 , 0 , 29 ) ,
587
+ & [ "inner" , "nonNullableField" , "nullableErrorField "] ,
588
+ FieldError :: new( "Error for nullableErrorField " , Value :: null( ) ) ,
455
589
) ,
456
590
] ) ;
457
591
}
0 commit comments