1
- import { assert } from 'chai' ;
1
+ import { assert , expect } from 'chai' ;
2
2
import { describe , it } from 'mocha' ;
3
3
4
4
import { expectJSON } from '../../__testUtils__/expectJSON.js' ;
@@ -851,6 +851,57 @@ describe('Execute: stream directive', () => {
851
851
] ) ;
852
852
} ) ;
853
853
it ( 'Handles async errors thrown by completeValue after initialCount is reached' , async ( ) => {
854
+ const document = parse ( `
855
+ query {
856
+ friendList @stream(initialCount: 1) {
857
+ nonNullName
858
+ }
859
+ }
860
+ ` ) ;
861
+ const result = await complete ( document , {
862
+ friendList : ( ) => [
863
+ Promise . resolve ( { nonNullName : friends [ 0 ] . name } ) ,
864
+ Promise . resolve ( {
865
+ nonNullName : ( ) => Promise . reject ( new Error ( 'Oops' ) ) ,
866
+ } ) ,
867
+ Promise . resolve ( { nonNullName : friends [ 1 ] . name } ) ,
868
+ ] ,
869
+ } ) ;
870
+ expectJSON ( result ) . toDeepEqual ( [
871
+ {
872
+ data : {
873
+ friendList : [ { nonNullName : 'Luke' } ] ,
874
+ } ,
875
+ hasNext : true ,
876
+ } ,
877
+ {
878
+ incremental : [
879
+ {
880
+ items : [ null ] ,
881
+ path : [ 'friendList' , 1 ] ,
882
+ errors : [
883
+ {
884
+ message : 'Oops' ,
885
+ locations : [ { line : 4 , column : 11 } ] ,
886
+ path : [ 'friendList' , 1 , 'nonNullName' ] ,
887
+ } ,
888
+ ] ,
889
+ } ,
890
+ ] ,
891
+ hasNext : true ,
892
+ } ,
893
+ {
894
+ incremental : [
895
+ {
896
+ items : [ { nonNullName : 'Han' } ] ,
897
+ path : [ 'friendList' , 2 ] ,
898
+ } ,
899
+ ] ,
900
+ hasNext : false ,
901
+ } ,
902
+ ] ) ;
903
+ } ) ;
904
+ it ( 'Handles async errors thrown by completeValue after initialCount is reached for a non-nullable list' , async ( ) => {
854
905
const document = parse ( `
855
906
query {
856
907
nonNullFriendList @stream(initialCount: 1) {
@@ -946,6 +997,50 @@ describe('Execute: stream directive', () => {
946
997
} ,
947
998
] ) ;
948
999
} ) ;
1000
+ it ( 'Handles async errors thrown by completeValue after initialCount is reached from async iterable for a non-nullable list' , async ( ) => {
1001
+ const document = parse ( `
1002
+ query {
1003
+ nonNullFriendList @stream(initialCount: 1) {
1004
+ nonNullName
1005
+ }
1006
+ }
1007
+ ` ) ;
1008
+ const result = await complete ( document , {
1009
+ async * nonNullFriendList ( ) {
1010
+ yield await Promise . resolve ( { nonNullName : friends [ 0 ] . name } ) ;
1011
+ yield await Promise . resolve ( {
1012
+ nonNullName : ( ) => Promise . reject ( new Error ( 'Oops' ) ) ,
1013
+ } ) ;
1014
+ yield await Promise . resolve ( {
1015
+ nonNullName : friends [ 1 ] . name ,
1016
+ } ) ; /* c8 ignore start */
1017
+ } /* c8 ignore stop */ ,
1018
+ } ) ;
1019
+ expectJSON ( result ) . toDeepEqual ( [
1020
+ {
1021
+ data : {
1022
+ nonNullFriendList : [ { nonNullName : 'Luke' } ] ,
1023
+ } ,
1024
+ hasNext : true ,
1025
+ } ,
1026
+ {
1027
+ incremental : [
1028
+ {
1029
+ items : null ,
1030
+ path : [ 'nonNullFriendList' , 1 ] ,
1031
+ errors : [
1032
+ {
1033
+ message : 'Oops' ,
1034
+ locations : [ { line : 4 , column : 11 } ] ,
1035
+ path : [ 'nonNullFriendList' , 1 , 'nonNullName' ] ,
1036
+ } ,
1037
+ ] ,
1038
+ } ,
1039
+ ] ,
1040
+ hasNext : false ,
1041
+ } ,
1042
+ ] ) ;
1043
+ } ) ;
949
1044
it ( 'Filters payloads that are nulled' , async ( ) => {
950
1045
const document = parse ( `
951
1046
query {
@@ -961,8 +1056,8 @@ describe('Execute: stream directive', () => {
961
1056
nestedObject : {
962
1057
nonNullScalarField : ( ) => Promise . resolve ( null ) ,
963
1058
async * nestedFriendList ( ) {
964
- yield await Promise . resolve ( friends [ 0 ] ) ;
965
- } ,
1059
+ yield await Promise . resolve ( friends [ 0 ] ) ; /* c8 ignore start */
1060
+ } /* c8 ignore stop */ ,
966
1061
} ,
967
1062
} ) ;
968
1063
expectJSON ( result ) . toDeepEqual ( {
@@ -1061,9 +1156,6 @@ describe('Execute: stream directive', () => {
1061
1156
path : [ 'nestedObject' , 'nestedFriendList' , 0 ] ,
1062
1157
} ,
1063
1158
] ,
1064
- hasNext : true ,
1065
- } ,
1066
- {
1067
1159
hasNext : false ,
1068
1160
} ,
1069
1161
] ) ;
@@ -1088,8 +1180,8 @@ describe('Execute: stream directive', () => {
1088
1180
deeperNestedObject : {
1089
1181
nonNullScalarField : ( ) => Promise . resolve ( null ) ,
1090
1182
async * deeperNestedFriendList ( ) {
1091
- yield await Promise . resolve ( friends [ 0 ] ) ;
1092
- } ,
1183
+ yield await Promise . resolve ( friends [ 0 ] ) ; /* c8 ignore start */
1184
+ } /* c8 ignore stop */ ,
1093
1185
} ,
1094
1186
} ,
1095
1187
} ) ;
@@ -1176,14 +1268,17 @@ describe('Execute: stream directive', () => {
1176
1268
1177
1269
it ( 'Returns iterator and ignores errors when stream payloads are filtered' , async ( ) => {
1178
1270
let returned = false ;
1179
- let index = 0 ;
1271
+ let requested = false ;
1180
1272
const iterable = {
1181
1273
[ Symbol . asyncIterator ] : ( ) => ( {
1182
1274
next : ( ) => {
1183
- const friend = friends [ index ++ ] ;
1184
- if ( ! friend ) {
1185
- return Promise . resolve ( { done : true , value : undefined } ) ;
1275
+ if ( requested ) {
1276
+ /* c8 ignore next 3 */
1277
+ // Not reached, iterator should end immediately.
1278
+ expect . fail ( 'Not reached' ) ;
1186
1279
}
1280
+ requested = true ;
1281
+ const friend = friends [ 0 ] ;
1187
1282
return Promise . resolve ( {
1188
1283
done : false ,
1189
1284
value : {
@@ -1261,17 +1356,12 @@ describe('Execute: stream directive', () => {
1261
1356
] ,
1262
1357
} ,
1263
1358
] ,
1264
- hasNext : true ,
1359
+ hasNext : false ,
1265
1360
} ,
1266
1361
} ) ;
1267
- const result3 = await iterator . next ( ) ;
1268
- expectJSON ( result3 ) . toDeepEqual ( {
1269
- done : false ,
1270
- value : { hasNext : false } ,
1271
- } ) ;
1272
1362
1273
- const result4 = await iterator . next ( ) ;
1274
- expectJSON ( result4 ) . toDeepEqual ( { done : true , value : undefined } ) ;
1363
+ const result3 = await iterator . next ( ) ;
1364
+ expectJSON ( result3 ) . toDeepEqual ( { done : true , value : undefined } ) ;
1275
1365
1276
1366
assert ( returned ) ;
1277
1367
} ) ;
0 commit comments