@@ -896,6 +896,100 @@ test("handles @defer inside @stream", async () => {
896896 await expect ( observableStream ) . not . toEmitAnything ( ) ;
897897} ) ;
898898
899+ test ( 'reports "complete" once a sibling @defer boundary resolves while a @stream is still streaming with a "no-cache" fetch policy' , async ( ) => {
900+ const { httpLink, enqueueInitialChunk, enqueueSubsequentChunk } =
901+ mockDeferStreamGraphQL17Alpha9 ( ) ;
902+ const client = new ApolloClient ( {
903+ link : httpLink ,
904+ cache : new InMemoryCache ( ) ,
905+ incrementalHandler : new GraphQL17Alpha9Handler ( ) ,
906+ } ) ;
907+
908+ const query = gql `
909+ query {
910+ friendList @stream(initialCount: 1) {
911+ id
912+ name
913+ }
914+ ... @defer {
915+ someScalar
916+ }
917+ }
918+ ` ;
919+
920+ const observableStream = new ObservableStream (
921+ client . watchQuery ( { query, fetchPolicy : "no-cache" } )
922+ ) ;
923+
924+ await expect ( observableStream ) . toEmitTypedValue ( {
925+ data : undefined ,
926+ dataState : "empty" ,
927+ loading : true ,
928+ networkStatus : NetworkStatus . loading ,
929+ partial : true ,
930+ } ) ;
931+
932+ enqueueInitialChunk ( {
933+ data : { friendList : [ { __typename : "Friend" , id : "1" , name : "Luke" } ] } ,
934+ pending : [
935+ { id : "0" , path : [ ] } ,
936+ { id : "1" , path : [ "friendList" ] } ,
937+ ] ,
938+ hasNext : true ,
939+ } as any ) ;
940+
941+ await expect ( observableStream ) . toEmitTypedValue ( {
942+ data : markAsStreaming ( {
943+ friendList : [ { __typename : "Friend" , id : "1" , name : "Luke" } ] ,
944+ } ) ,
945+ dataState : "streaming" ,
946+ loading : true ,
947+ networkStatus : NetworkStatus . streaming ,
948+ partial : true ,
949+ } ) ;
950+
951+ enqueueSubsequentChunk ( {
952+ incremental : [ { id : "0" , data : { someScalar : "resolved" } } ] ,
953+ completed : [ { id : "0" } ] ,
954+ hasNext : true ,
955+ } as any ) ;
956+
957+ await expect ( observableStream ) . toEmitTypedValue ( {
958+ data : {
959+ friendList : [ { __typename : "Friend" , id : "1" , name : "Luke" } ] ,
960+ someScalar : "resolved" ,
961+ } ,
962+ dataState : "complete" ,
963+ loading : true ,
964+ networkStatus : NetworkStatus . streaming ,
965+ partial : false ,
966+ } ) ;
967+
968+ enqueueSubsequentChunk ( {
969+ incremental : [
970+ { id : "1" , items : [ { __typename : "Friend" , id : "2" , name : "Han" } ] } ,
971+ ] ,
972+ completed : [ { id : "1" } ] ,
973+ hasNext : false ,
974+ } as any ) ;
975+
976+ await expect ( observableStream ) . toEmitTypedValue ( {
977+ data : {
978+ friendList : [
979+ { __typename : "Friend" , id : "1" , name : "Luke" } ,
980+ { __typename : "Friend" , id : "2" , name : "Han" } ,
981+ ] ,
982+ someScalar : "resolved" ,
983+ } ,
984+ dataState : "complete" ,
985+ loading : false ,
986+ networkStatus : NetworkStatus . ready ,
987+ partial : false ,
988+ } ) ;
989+
990+ await expect ( observableStream ) . not . toEmitAnything ( ) ;
991+ } ) ;
992+
899993test ( "can use custom merge function to combine cached and streamed lists" , async ( ) => {
900994 const cache = new InMemoryCache ( {
901995 typePolicies : {
0 commit comments