@@ -288,6 +288,70 @@ describe('Execute: Handles basic execution tasks', () => {
288
288
} ) ;
289
289
} ) ;
290
290
291
+ it ( 'reflects onError:NO_PROPAGATE via errorBehavior' , ( ) => {
292
+ let resolvedInfo ;
293
+ const testType = new GraphQLObjectType ( {
294
+ name : 'Test' ,
295
+ fields : {
296
+ test : {
297
+ type : GraphQLString ,
298
+ resolve ( _val , _args , _ctx , info ) {
299
+ resolvedInfo = info ;
300
+ } ,
301
+ } ,
302
+ } ,
303
+ } ) ;
304
+ const schema = new GraphQLSchema ( { query : testType } ) ;
305
+
306
+ const document = parse ( 'query ($var: String) { result: test }' ) ;
307
+ const rootValue = { root : 'val' } ;
308
+ const variableValues = { var : 'abc' } ;
309
+
310
+ executeSync ( {
311
+ schema,
312
+ document,
313
+ rootValue,
314
+ variableValues,
315
+ onError : 'NO_PROPAGATE' ,
316
+ } ) ;
317
+
318
+ expect ( resolvedInfo ) . to . include ( {
319
+ errorBehavior : 'NO_PROPAGATE' ,
320
+ } ) ;
321
+ } ) ;
322
+
323
+ it ( 'reflects onError:ABORT via errorBehavior' , ( ) => {
324
+ let resolvedInfo ;
325
+ const testType = new GraphQLObjectType ( {
326
+ name : 'Test' ,
327
+ fields : {
328
+ test : {
329
+ type : GraphQLString ,
330
+ resolve ( _val , _args , _ctx , info ) {
331
+ resolvedInfo = info ;
332
+ } ,
333
+ } ,
334
+ } ,
335
+ } ) ;
336
+ const schema = new GraphQLSchema ( { query : testType } ) ;
337
+
338
+ const document = parse ( 'query ($var: String) { result: test }' ) ;
339
+ const rootValue = { root : 'val' } ;
340
+ const variableValues = { var : 'abc' } ;
341
+
342
+ executeSync ( {
343
+ schema,
344
+ document,
345
+ rootValue,
346
+ variableValues,
347
+ onError : 'ABORT' ,
348
+ } ) ;
349
+
350
+ expect ( resolvedInfo ) . to . include ( {
351
+ errorBehavior : 'ABORT' ,
352
+ } ) ;
353
+ } ) ;
354
+
291
355
it ( 'populates path correctly with complex types' , ( ) => {
292
356
let path ;
293
357
const someObject = new GraphQLObjectType ( {
@@ -742,6 +806,134 @@ describe('Execute: Handles basic execution tasks', () => {
742
806
} ) ;
743
807
} ) ;
744
808
809
+ it ( 'Full response path is included for non-nullable fields with onError:NO_PROPAGATE' , ( ) => {
810
+ const A : GraphQLObjectType = new GraphQLObjectType ( {
811
+ name : 'A' ,
812
+ fields : ( ) => ( {
813
+ nullableA : {
814
+ type : A ,
815
+ resolve : ( ) => ( { } ) ,
816
+ } ,
817
+ nonNullA : {
818
+ type : new GraphQLNonNull ( A ) ,
819
+ resolve : ( ) => ( { } ) ,
820
+ } ,
821
+ throws : {
822
+ type : new GraphQLNonNull ( GraphQLString ) ,
823
+ resolve : ( ) => {
824
+ throw new Error ( 'Catch me if you can' ) ;
825
+ } ,
826
+ } ,
827
+ } ) ,
828
+ } ) ;
829
+ const schema = new GraphQLSchema ( {
830
+ query : new GraphQLObjectType ( {
831
+ name : 'query' ,
832
+ fields : ( ) => ( {
833
+ nullableA : {
834
+ type : A ,
835
+ resolve : ( ) => ( { } ) ,
836
+ } ,
837
+ } ) ,
838
+ } ) ,
839
+ } ) ;
840
+
841
+ const document = parse ( `
842
+ query {
843
+ nullableA {
844
+ aliasedA: nullableA {
845
+ nonNullA {
846
+ anotherA: nonNullA {
847
+ throws
848
+ }
849
+ }
850
+ }
851
+ }
852
+ }
853
+ ` ) ;
854
+
855
+ const result = executeSync ( { schema, document, onError : 'NO_PROPAGATE' } ) ;
856
+ expectJSON ( result ) . toDeepEqual ( {
857
+ data : {
858
+ nullableA : {
859
+ aliasedA : {
860
+ nonNullA : {
861
+ anotherA : {
862
+ throws : null ,
863
+ } ,
864
+ } ,
865
+ } ,
866
+ } ,
867
+ } ,
868
+ errors : [
869
+ {
870
+ message : 'Catch me if you can' ,
871
+ locations : [ { line : 7 , column : 17 } ] ,
872
+ path : [ 'nullableA' , 'aliasedA' , 'nonNullA' , 'anotherA' , 'throws' ] ,
873
+ } ,
874
+ ] ,
875
+ } ) ;
876
+ } ) ;
877
+
878
+ it ( 'Full response path is included for non-nullable fields with onError:ABORT' , ( ) => {
879
+ const A : GraphQLObjectType = new GraphQLObjectType ( {
880
+ name : 'A' ,
881
+ fields : ( ) => ( {
882
+ nullableA : {
883
+ type : A ,
884
+ resolve : ( ) => ( { } ) ,
885
+ } ,
886
+ nonNullA : {
887
+ type : new GraphQLNonNull ( A ) ,
888
+ resolve : ( ) => ( { } ) ,
889
+ } ,
890
+ throws : {
891
+ type : new GraphQLNonNull ( GraphQLString ) ,
892
+ resolve : ( ) => {
893
+ throw new Error ( 'Catch me if you can' ) ;
894
+ } ,
895
+ } ,
896
+ } ) ,
897
+ } ) ;
898
+ const schema = new GraphQLSchema ( {
899
+ query : new GraphQLObjectType ( {
900
+ name : 'query' ,
901
+ fields : ( ) => ( {
902
+ nullableA : {
903
+ type : A ,
904
+ resolve : ( ) => ( { } ) ,
905
+ } ,
906
+ } ) ,
907
+ } ) ,
908
+ } ) ;
909
+
910
+ const document = parse ( `
911
+ query {
912
+ nullableA {
913
+ aliasedA: nullableA {
914
+ nonNullA {
915
+ anotherA: nonNullA {
916
+ throws
917
+ }
918
+ }
919
+ }
920
+ }
921
+ }
922
+ ` ) ;
923
+
924
+ const result = executeSync ( { schema, document, onError : 'ABORT' } ) ;
925
+ expectJSON ( result ) . toDeepEqual ( {
926
+ data : null ,
927
+ errors : [
928
+ {
929
+ message : 'Catch me if you can' ,
930
+ locations : [ { line : 7 , column : 17 } ] ,
931
+ path : [ 'nullableA' , 'aliasedA' , 'nonNullA' , 'anotherA' , 'throws' ] ,
932
+ } ,
933
+ ] ,
934
+ } ) ;
935
+ } ) ;
936
+
745
937
it ( 'uses the inline operation if no operation name is provided' , ( ) => {
746
938
const schema = new GraphQLSchema ( {
747
939
query : new GraphQLObjectType ( {
0 commit comments