@@ -37,6 +37,30 @@ const friends = [
37
37
{ name : 'Leia' , id : 3 } ,
38
38
] ;
39
39
40
+ const nestedObjectType = new GraphQLObjectType ( {
41
+ name : 'NestedObject' ,
42
+ fields : {
43
+ scalarField : {
44
+ type : GraphQLString ,
45
+ } ,
46
+ nonNullScalarField : {
47
+ type : new GraphQLNonNull ( GraphQLString ) ,
48
+ } ,
49
+ nestedFriendList : { type : new GraphQLList ( friendType ) } ,
50
+ deeperNestedObject : {
51
+ type : new GraphQLObjectType ( {
52
+ name : 'DeeperNestedObject' ,
53
+ fields : {
54
+ nonNullScalarField : {
55
+ type : new GraphQLNonNull ( GraphQLString ) ,
56
+ } ,
57
+ deeperNestedFriendList : { type : new GraphQLList ( friendType ) } ,
58
+ } ,
59
+ } ) ,
60
+ } ,
61
+ } ,
62
+ } ) ;
63
+
40
64
const query = new GraphQLObjectType ( {
41
65
fields : {
42
66
scalarList : {
@@ -52,29 +76,10 @@ const query = new GraphQLObjectType({
52
76
type : new GraphQLList ( new GraphQLNonNull ( friendType ) ) ,
53
77
} ,
54
78
nestedObject : {
55
- type : new GraphQLObjectType ( {
56
- name : 'NestedObject' ,
57
- fields : {
58
- scalarField : {
59
- type : GraphQLString ,
60
- } ,
61
- nonNullScalarField : {
62
- type : new GraphQLNonNull ( GraphQLString ) ,
63
- } ,
64
- nestedFriendList : { type : new GraphQLList ( friendType ) } ,
65
- deeperNestedObject : {
66
- type : new GraphQLObjectType ( {
67
- name : 'DeeperNestedObject' ,
68
- fields : {
69
- nonNullScalarField : {
70
- type : new GraphQLNonNull ( GraphQLString ) ,
71
- } ,
72
- deeperNestedFriendList : { type : new GraphQLList ( friendType ) } ,
73
- } ,
74
- } ) ,
75
- } ,
76
- } ,
77
- } ) ,
79
+ type : nestedObjectType ,
80
+ } ,
81
+ nestedList : {
82
+ type : new GraphQLList ( nestedObjectType ) ,
78
83
} ,
79
84
} ,
80
85
name : 'Query' ,
@@ -678,6 +683,170 @@ describe('Execute: stream directive', () => {
678
683
} ,
679
684
] ) ;
680
685
} ) ;
686
+ it ( 'Does not initiate multiple streams at the same path' , async ( ) => {
687
+ const document = parse ( `
688
+ query {
689
+ nestedList {
690
+ nestedFriendList @stream(initialCount: 2) {
691
+ name
692
+ id
693
+ }
694
+ ... @defer {
695
+ nestedFriendList @stream(initialCount: 2) {
696
+ name
697
+ id
698
+ }
699
+ }
700
+ }
701
+ }
702
+ ` ) ;
703
+ const result = await complete ( document , {
704
+ nestedList : [
705
+ { nestedFriendList : friends } ,
706
+ { nestedFriendList : friends } ,
707
+ ] ,
708
+ } ) ;
709
+ expectJSON ( result ) . toDeepEqual ( [
710
+ {
711
+ data : {
712
+ nestedList : [
713
+ {
714
+ nestedFriendList : [
715
+ { name : 'Luke' , id : '1' } ,
716
+ { name : 'Han' , id : '2' } ,
717
+ ] ,
718
+ } ,
719
+ {
720
+ nestedFriendList : [
721
+ { name : 'Luke' , id : '1' } ,
722
+ { name : 'Han' , id : '2' } ,
723
+ ] ,
724
+ } ,
725
+ ] ,
726
+ } ,
727
+ hasNext : true ,
728
+ } ,
729
+ {
730
+ incremental : [
731
+ {
732
+ items : [ { name : 'Leia' , id : '3' } ] ,
733
+ path : [ 'nestedList' , 0 , 'nestedFriendList' , 2 ] ,
734
+ } ,
735
+ {
736
+ data : {
737
+ nestedFriendList : [
738
+ { name : 'Luke' , id : '1' } ,
739
+ { name : 'Han' , id : '2' } ,
740
+ ] ,
741
+ } ,
742
+ path : [ 'nestedList' , 0 ] ,
743
+ } ,
744
+ {
745
+ items : [ { name : 'Leia' , id : '3' } ] ,
746
+ path : [ 'nestedList' , 1 , 'nestedFriendList' , 2 ] ,
747
+ } ,
748
+ {
749
+ data : {
750
+ nestedFriendList : [
751
+ { name : 'Luke' , id : '1' } ,
752
+ { name : 'Han' , id : '2' } ,
753
+ ] ,
754
+ } ,
755
+ path : [ 'nestedList' , 1 ] ,
756
+ } ,
757
+ ] ,
758
+ hasNext : false ,
759
+ } ,
760
+ ] ) ;
761
+ } ) ;
762
+ it ( 'Does not initiate multiple streams at the same path for async iterables' , async ( ) => {
763
+ const document = parse ( `
764
+ query {
765
+ nestedList {
766
+ nestedFriendList @stream(initialCount: 2) {
767
+ name
768
+ id
769
+ }
770
+ ... @defer {
771
+ nestedFriendList @stream(initialCount: 2) {
772
+ name
773
+ id
774
+ }
775
+ }
776
+ }
777
+ }
778
+ ` ) ;
779
+ const result = await complete ( document , {
780
+ nestedList : [
781
+ {
782
+ async * nestedFriendList ( ) {
783
+ yield await Promise . resolve ( friends [ 0 ] ) ;
784
+ yield await Promise . resolve ( friends [ 1 ] ) ;
785
+ yield await Promise . resolve ( friends [ 2 ] ) ;
786
+ } ,
787
+ } ,
788
+ {
789
+ async * nestedFriendList ( ) {
790
+ yield await Promise . resolve ( friends [ 0 ] ) ;
791
+ yield await Promise . resolve ( friends [ 1 ] ) ;
792
+ yield await Promise . resolve ( friends [ 2 ] ) ;
793
+ } ,
794
+ } ,
795
+ ] ,
796
+ } ) ;
797
+ expectJSON ( result ) . toDeepEqual ( [
798
+ {
799
+ data : {
800
+ nestedList : [
801
+ {
802
+ nestedFriendList : [
803
+ { name : 'Luke' , id : '1' } ,
804
+ { name : 'Han' , id : '2' } ,
805
+ ] ,
806
+ } ,
807
+ {
808
+ nestedFriendList : [
809
+ { name : 'Luke' , id : '1' } ,
810
+ { name : 'Han' , id : '2' } ,
811
+ ] ,
812
+ } ,
813
+ ] ,
814
+ } ,
815
+ hasNext : true ,
816
+ } ,
817
+ {
818
+ incremental : [
819
+ {
820
+ data : {
821
+ nestedFriendList : [
822
+ { name : 'Luke' , id : '1' } ,
823
+ { name : 'Han' , id : '2' } ,
824
+ ] ,
825
+ } ,
826
+ path : [ 'nestedList' , 0 ] ,
827
+ } ,
828
+ {
829
+ data : {
830
+ nestedFriendList : [
831
+ { name : 'Luke' , id : '1' } ,
832
+ { name : 'Han' , id : '2' } ,
833
+ ] ,
834
+ } ,
835
+ path : [ 'nestedList' , 1 ] ,
836
+ } ,
837
+ {
838
+ items : [ { name : 'Leia' , id : '3' } ] ,
839
+ path : [ 'nestedList' , 0 , 'nestedFriendList' , 2 ] ,
840
+ } ,
841
+ {
842
+ items : [ { name : 'Leia' , id : '3' } ] ,
843
+ path : [ 'nestedList' , 1 , 'nestedFriendList' , 2 ] ,
844
+ } ,
845
+ ] ,
846
+ hasNext : false ,
847
+ } ,
848
+ ] ) ;
849
+ } ) ;
681
850
it ( 'Negative values of initialCount throw field errors on a field that returns an async iterable' , async ( ) => {
682
851
const document = parse ( `
683
852
query {
0 commit comments