@@ -4611,3 +4611,126 @@ function createMockStreamMergeFn() {
46114611 return result ;
46124612 } ) ;
46134613}
4614+
4615+ test ( "does not emit when no data added when a `@stream` completes while a `@defer` boundary is still pending" , async ( ) => {
4616+ const query = gql `
4617+ query {
4618+ greeting {
4619+ message
4620+ ... on Greeting @defer {
4621+ recipient {
4622+ name
4623+ }
4624+ }
4625+ }
4626+ friendList @stream(initialCount: 1) {
4627+ name
4628+ }
4629+ }
4630+ ` ;
4631+
4632+ const { httpLink, enqueueInitialChunk, enqueueSubsequentChunk } =
4633+ mockDeferStreamGraphQL17Alpha9 ( ) ;
4634+ const cache = new InMemoryCache ( ) ;
4635+
4636+ const client = new ApolloClient ( {
4637+ cache,
4638+ link : httpLink ,
4639+ incrementalHandler : new GraphQL17Alpha9Handler ( ) ,
4640+ } ) ;
4641+
4642+ const stream = new ObservableStream (
4643+ client . watchQuery ( { query, fetchPolicy : "network-only" } )
4644+ ) ;
4645+
4646+ await expect ( stream ) . toEmitTypedValue ( {
4647+ data : undefined ,
4648+ dataState : "empty" ,
4649+ loading : true ,
4650+ networkStatus : NetworkStatus . loading ,
4651+ partial : true ,
4652+ } ) ;
4653+
4654+ enqueueInitialChunk ( {
4655+ data : {
4656+ greeting : { __typename : "Greeting" , message : "Hello world" } ,
4657+ friendList : [ { __typename : "Friend" , name : "Luke" } ] ,
4658+ } ,
4659+ pending : [
4660+ { id : "0" , path : [ "greeting" ] } ,
4661+ { id : "1" , path : [ "friendList" ] } ,
4662+ ] ,
4663+ hasNext : true ,
4664+ } ) ;
4665+
4666+ await expect ( stream ) . toEmitTypedValue ( {
4667+ data : markAsStreaming ( {
4668+ greeting : { __typename : "Greeting" , message : "Hello world" } ,
4669+ friendList : [ { __typename : "Friend" , name : "Luke" } ] ,
4670+ } ) ,
4671+ dataState : "streaming" ,
4672+ loading : true ,
4673+ networkStatus : NetworkStatus . streaming ,
4674+ partial : true ,
4675+ } ) ;
4676+
4677+ enqueueSubsequentChunk ( {
4678+ incremental : [ { id : "1" , items : [ { __typename : "Friend" , name : "Han" } ] } ] ,
4679+ hasNext : true ,
4680+ } as any ) ;
4681+
4682+ await expect ( stream ) . toEmitTypedValue ( {
4683+ data : markAsStreaming ( {
4684+ greeting : { __typename : "Greeting" , message : "Hello world" } ,
4685+ friendList : [
4686+ { __typename : "Friend" , name : "Luke" } ,
4687+ { __typename : "Friend" , name : "Han" } ,
4688+ ] ,
4689+ } ) ,
4690+ dataState : "streaming" ,
4691+ loading : true ,
4692+ networkStatus : NetworkStatus . streaming ,
4693+ partial : true ,
4694+ } ) ;
4695+
4696+ enqueueSubsequentChunk ( {
4697+ completed : [ { id : "1" } ] ,
4698+ hasNext : true ,
4699+ } ) ;
4700+
4701+ await expect ( stream ) . not . toEmitAnything ( ) ;
4702+
4703+ enqueueSubsequentChunk ( {
4704+ incremental : [
4705+ {
4706+ id : "0" ,
4707+ data : {
4708+ __typename : "Greeting" ,
4709+ recipient : { __typename : "Person" , name : "Alice" } ,
4710+ } ,
4711+ } ,
4712+ ] ,
4713+ completed : [ { id : "0" } ] ,
4714+ hasNext : false ,
4715+ } ) ;
4716+
4717+ await expect ( stream ) . toEmitTypedValue ( {
4718+ data : {
4719+ greeting : {
4720+ __typename : "Greeting" ,
4721+ message : "Hello world" ,
4722+ recipient : { __typename : "Person" , name : "Alice" } ,
4723+ } ,
4724+ friendList : [
4725+ { __typename : "Friend" , name : "Luke" } ,
4726+ { __typename : "Friend" , name : "Han" } ,
4727+ ] ,
4728+ } ,
4729+ dataState : "complete" ,
4730+ loading : false ,
4731+ networkStatus : NetworkStatus . ready ,
4732+ partial : false ,
4733+ } ) ;
4734+
4735+ await expect ( stream ) . not . toEmitAnything ( ) ;
4736+ } ) ;
0 commit comments