@@ -37,7 +37,11 @@ const {
37
37
const { createReaderSelector} = require ( '../RelayModernSelector' ) ;
38
38
const RelayModernStore = require ( '../RelayModernStore' ) ;
39
39
const RelayRecordSource = require ( '../RelayRecordSource' ) ;
40
- const { disallowWarnings, expectToWarn} = require ( 'relay-test-utils-internal' ) ;
40
+ const {
41
+ disallowWarnings,
42
+ expectToWarn,
43
+ expectToWarnMany,
44
+ } = require ( 'relay-test-utils-internal' ) ;
41
45
42
46
disallowWarnings ( ) ;
43
47
@@ -737,6 +741,109 @@ describe.each(['RelayModernEnvironment', 'MultiActorEnvironment'])(
737
741
name : 'ALICE' ,
738
742
} ) ;
739
743
} ) ;
744
+
745
+ it ( 'warns if nested defer is executed in non-streaming mode and processes deferred selections' , ( ) => {
746
+ const query = graphql `
747
+ query RelayModernEnvironmentExecuteWithDeferTestNestedUserQuery(
748
+ $id: ID!
749
+ ) {
750
+ node(id: $id) {
751
+ ...RelayModernEnvironmentExecuteWithDeferTestNestedUserFragment
752
+ @dangerously_unaliased_fixme
753
+ @defer(label: "UserFragment")
754
+ }
755
+ }
756
+ ` ;
757
+ const fragment = graphql `
758
+ fragment RelayModernEnvironmentExecuteWithDeferTestNestedUserFragment on User {
759
+ id
760
+ ...RelayModernEnvironmentExecuteWithDeferTestNestedInnerUserFragment
761
+ @defer
762
+ }
763
+ ` ;
764
+ const fragmentInner = graphql `
765
+ fragment RelayModernEnvironmentExecuteWithDeferTestNestedInnerUserFragment on User {
766
+ name
767
+ ...RelayModernEnvironmentExecuteWithDeferTestNestedInnerInner2UserFragment
768
+ @defer
769
+ }
770
+ ` ;
771
+ const fragmentInnerInner2 = graphql `
772
+ fragment RelayModernEnvironmentExecuteWithDeferTestNestedInnerInner2UserFragment on User {
773
+ lastName
774
+ }
775
+ ` ;
776
+ variables = { id : '1' } ;
777
+ operation = createOperationDescriptor ( query , variables ) ;
778
+ selector = createReaderSelector ( fragment , '1' , { } , operation . request ) ;
779
+
780
+ const initialSnapshot = environment . lookup ( selector ) ;
781
+ const callback = jest . fn < [ Snapshot ] , void > ( ) ;
782
+ environment . subscribe ( initialSnapshot , callback ) ;
783
+
784
+ environment . execute ( { operation} ) . subscribe ( callbacks ) ;
785
+ const payload = {
786
+ data : {
787
+ node : {
788
+ id : '1' ,
789
+ __typename : 'User' ,
790
+ name : 'Alice' ,
791
+ lastName : 'Bob' ,
792
+ } ,
793
+ } ,
794
+ extensions : {
795
+ is_final : true ,
796
+ } ,
797
+ } ;
798
+
799
+ expectToWarnMany (
800
+ [
801
+ 'RelayModernEnvironment: Operation `RelayModernEnvironmentExecuteWithDeferTestNestedUserQuery` contains @defer/@stream ' +
802
+ 'directives but was executed in non-streaming mode. See ' +
803
+ 'https://fburl.com/relay-incremental-delivery-non-streaming-warning.' ,
804
+ 'RelayModernEnvironment: Operation `RelayModernEnvironmentExecuteWithDeferTestNestedUserQuery` contains @defer/@stream ' +
805
+ 'directives but was executed in non-streaming mode. See ' +
806
+ 'https://fburl.com/relay-incremental-delivery-non-streaming-warning.' ,
807
+ 'RelayModernEnvironment: Operation `RelayModernEnvironmentExecuteWithDeferTestNestedUserQuery` contains @defer/@stream ' +
808
+ 'directives but was executed in non-streaming mode. See ' +
809
+ 'https://fburl.com/relay-incremental-delivery-non-streaming-warning.' ,
810
+ ] ,
811
+ ( ) => {
812
+ dataSource . next ( payload ) ;
813
+ } ,
814
+ ) ;
815
+
816
+ expect ( complete ) . not . toBeCalled ( ) ;
817
+ expect ( error ) . not . toBeCalled ( ) ;
818
+ expect ( next . mock . calls . length ) . toBe ( 1 ) ;
819
+
820
+ expect ( callback . mock . calls . length ) . toBe ( 1 ) ;
821
+ const snapshot = callback . mock . calls [ 0 ] [ 0 ] ;
822
+ expect ( snapshot . isMissingData ) . toBe ( false ) ;
823
+ expect ( snapshot . data ?. id ) . toBe ( '1' ) ;
824
+
825
+ const innerSelector = createReaderSelector (
826
+ fragmentInner ,
827
+ '1' ,
828
+ { } ,
829
+ operation . request ,
830
+ ) ;
831
+ const innerSnapshot = environment . lookup ( innerSelector ) ;
832
+ expect ( innerSnapshot . isMissingData ) . toBe ( false ) ;
833
+ expect ( innerSnapshot . data ?. name ) . toEqual ( 'Alice' ) ;
834
+
835
+ const innerInner2Selector = createReaderSelector (
836
+ fragmentInnerInner2 ,
837
+ '1' ,
838
+ { } ,
839
+ operation . request ,
840
+ ) ;
841
+ const innerInner2Snapshot = environment . lookup ( innerInner2Selector ) ;
842
+ expect ( innerInner2Snapshot . isMissingData ) . toBe ( false ) ;
843
+ expect ( innerInner2Snapshot . data ) . toEqual ( {
844
+ lastName : 'Bob' ,
845
+ } ) ;
846
+ } ) ;
740
847
} ) ;
741
848
} ,
742
849
) ;
0 commit comments