@@ -539,6 +539,171 @@ describe('streamedQuery', () => {
539539 unsubscribe ( )
540540 } )
541541
542+ test ( 'should keep error state on reset refetch when initialData is defined' , async ( ) => {
543+ const key = queryKey ( )
544+ let shouldError = false
545+ const error = new Error ( 'stream failed' )
546+
547+ const observer = new QueryObserver ( queryClient , {
548+ queryKey : key ,
549+ initialData : [ 'initial' ] ,
550+ retry : false ,
551+ queryFn : streamedQuery ( {
552+ refetchMode : 'reset' ,
553+ streamFn : async function * ( ) {
554+ if ( shouldError ) {
555+ throw error
556+ }
557+
558+ yield 0
559+ } ,
560+ } ) ,
561+ } )
562+
563+ const unsubscribe = observer . subscribe ( vi . fn ( ) )
564+
565+ await vi . advanceTimersByTimeAsync ( 0 )
566+
567+ expect ( observer . getCurrentResult ( ) ) . toMatchObject ( {
568+ status : 'success' ,
569+ fetchStatus : 'idle' ,
570+ data : [ 'initial' , 0 ] ,
571+ } )
572+
573+ shouldError = true
574+
575+ const refetchPromise = observer . refetch ( )
576+
577+ await vi . advanceTimersByTimeAsync ( 0 )
578+ await expect ( refetchPromise ) . resolves . toMatchObject ( {
579+ status : 'error' ,
580+ error,
581+ data : [ 'initial' ] ,
582+ } )
583+
584+ expect ( observer . getCurrentResult ( ) ) . toMatchObject ( {
585+ status : 'error' ,
586+ fetchStatus : 'idle' ,
587+ data : [ 'initial' ] ,
588+ error,
589+ } )
590+
591+ unsubscribe ( )
592+ } )
593+
594+ test ( 'should treat a fetch after an initial error as a refetch for reset mode' , async ( ) => {
595+ const key = queryKey ( )
596+ let shouldError = true
597+ const error = new Error ( 'stream failed' )
598+
599+ const observer = new QueryObserver ( queryClient , {
600+ queryKey : key ,
601+ retry : false ,
602+ queryFn : streamedQuery ( {
603+ refetchMode : 'reset' ,
604+ streamFn : async function * ( ) {
605+ if ( shouldError ) {
606+ throw error
607+ }
608+
609+ yield * createAsyncNumberGenerator ( 1 )
610+ } ,
611+ } ) ,
612+ } )
613+
614+ const unsubscribe = observer . subscribe ( vi . fn ( ) )
615+
616+ await vi . advanceTimersByTimeAsync ( 0 )
617+
618+ expect ( observer . getCurrentResult ( ) ) . toMatchObject ( {
619+ status : 'error' ,
620+ fetchStatus : 'idle' ,
621+ data : undefined ,
622+ error,
623+ } )
624+
625+ shouldError = false
626+
627+ void observer . refetch ( )
628+
629+ await vi . advanceTimersByTimeAsync ( 0 )
630+
631+ expect ( observer . getCurrentResult ( ) ) . toMatchObject ( {
632+ status : 'pending' ,
633+ fetchStatus : 'fetching' ,
634+ data : undefined ,
635+ error : null ,
636+ } )
637+
638+ await vi . advanceTimersByTimeAsync ( 50 )
639+
640+ expect ( observer . getCurrentResult ( ) ) . toMatchObject ( {
641+ status : 'success' ,
642+ fetchStatus : 'idle' ,
643+ data : [ 0 ] ,
644+ error : null ,
645+ } )
646+
647+ unsubscribe ( )
648+ } )
649+
650+ test ( 'should reset to initialData on refetch after an initial error' , async ( ) => {
651+ const key = queryKey ( )
652+ let shouldError = true
653+ const error = new Error ( 'stream failed' )
654+
655+ const observer = new QueryObserver ( queryClient , {
656+ queryKey : key ,
657+ initialData : [ 'initial' ] ,
658+ retry : false ,
659+ queryFn : streamedQuery ( {
660+ refetchMode : 'reset' ,
661+ streamFn : async function * ( ) {
662+ if ( shouldError ) {
663+ throw error
664+ }
665+
666+ yield * createAsyncNumberGenerator ( 1 )
667+ } ,
668+ } ) ,
669+ } )
670+
671+ const unsubscribe = observer . subscribe ( vi . fn ( ) )
672+
673+ await vi . advanceTimersByTimeAsync ( 0 )
674+
675+ expect ( observer . getCurrentResult ( ) ) . toMatchObject ( {
676+ status : 'error' ,
677+ fetchStatus : 'idle' ,
678+ data : [ 'initial' ] ,
679+ error,
680+ } )
681+
682+ shouldError = false
683+
684+ void observer . refetch ( )
685+
686+ await vi . advanceTimersByTimeAsync ( 0 )
687+
688+ expect ( observer . getCurrentResult ( ) ) . toMatchObject ( {
689+ status : 'success' ,
690+ fetchStatus : 'fetching' ,
691+ data : [ 'initial' ] ,
692+ error : null ,
693+ } )
694+
695+ await vi . advanceTimersByTimeAsync ( 50 )
696+
697+ expect ( observer . getCurrentResult ( ) ) . toMatchObject ( {
698+ status : 'success' ,
699+ fetchStatus : 'idle' ,
700+ data : [ 'initial' , 0 ] ,
701+ error : null ,
702+ } )
703+
704+ unsubscribe ( )
705+ } )
706+
542707 test ( 'should not call reducer twice when refetchMode is replace' , async ( ) => {
543708 const key = queryKey ( )
544709 const arr : Array < number > = [ ]
0 commit comments