@@ -2629,3 +2629,79 @@ test("handles final chunk of { hasNext: false } correctly in usage with Apollo C
26292629 } ) ;
26302630 await expect ( observableStream ) . not . toEmitAnything ( ) ;
26312631} ) ;
2632+
2633+ // Servers that return a `data` property in subsequent payloads are technically
2634+ // invalid, but we still want to handle cases where the server misbehaves.
2635+ //
2636+ // See the following issue for more information:
2637+ // https://github.com/apollographql/apollo-client/issues/12976
2638+ test ( "ignores `data` property added to subsequent chunks by misbehaving servers" , async ( ) => {
2639+ const stream = mockDeferStreamGraphQL17Alpha9 ( ) ;
2640+ const client = new ApolloClient ( {
2641+ link : stream . httpLink ,
2642+ cache : new InMemoryCache ( ) ,
2643+ incrementalHandler : new GraphQL17Alpha9Handler ( ) ,
2644+ } ) ;
2645+
2646+ const query = gql `
2647+ query HeroNameQuery {
2648+ hero {
2649+ id
2650+ ... @defer {
2651+ name
2652+ }
2653+ }
2654+ }
2655+ ` ;
2656+
2657+ const observableStream = new ObservableStream ( client . watchQuery ( { query } ) ) ;
2658+
2659+ stream . enqueueInitialChunk ( {
2660+ data : { hero : { __typename : "Hero" , id : "1" } } ,
2661+ pending : [ { id : "0" , path : [ "hero" ] } ] ,
2662+ hasNext : true ,
2663+ } ) ;
2664+
2665+ await expect ( observableStream ) . toEmitTypedValue ( {
2666+ loading : true ,
2667+ data : undefined ,
2668+ dataState : "empty" ,
2669+ networkStatus : NetworkStatus . loading ,
2670+ partial : true ,
2671+ } ) ;
2672+
2673+ await expect ( observableStream ) . toEmitTypedValue ( {
2674+ loading : true ,
2675+ data : markAsStreaming ( {
2676+ hero : {
2677+ __typename : "Hero" ,
2678+ id : "1" ,
2679+ } ,
2680+ } ) ,
2681+ dataState : "streaming" ,
2682+ networkStatus : NetworkStatus . streaming ,
2683+ partial : true ,
2684+ } ) ;
2685+
2686+ stream . enqueueSubsequentChunk ( {
2687+ // @ts -expect-error simulate misbehaving server
2688+ data : null ,
2689+ incremental : [ { data : { name : "Luke" } , id : "0" } ] ,
2690+ completed : [ { id : "0" } ] ,
2691+ hasNext : false ,
2692+ } ) ;
2693+
2694+ await expect ( observableStream ) . toEmitTypedValue ( {
2695+ loading : false ,
2696+ data : {
2697+ hero : {
2698+ __typename : "Hero" ,
2699+ id : "1" ,
2700+ name : "Luke" ,
2701+ } ,
2702+ } ,
2703+ dataState : "complete" ,
2704+ networkStatus : NetworkStatus . ready ,
2705+ partial : false ,
2706+ } ) ;
2707+ } ) ;
0 commit comments