@@ -725,6 +725,76 @@ describe('QueryErrorResetBoundary', () => {
725725
726726 consoleMock . mockRestore ( )
727727 } )
728+
729+ it ( 'should refetch after error when staleTime is Infinity and previous data exists (issue#9728)' , async ( ) => {
730+ const key = queryKey ( )
731+ const queryFn = vi . fn ( )
732+ let count = 0
733+
734+ queryFn . mockImplementation ( async ( ) => {
735+ await sleep ( 10 )
736+ count ++
737+ if ( count === 2 ) {
738+ throw new Error ( 'Error ' + count )
739+ }
740+ return 'Success ' + count
741+ } )
742+
743+ function Page ( ) {
744+ const { data, refetch } = useQuery ( {
745+ queryKey : key ,
746+ queryFn,
747+ retry : false ,
748+ staleTime : Infinity ,
749+ throwOnError : true ,
750+ } )
751+
752+ return (
753+ < div >
754+ < div > Data: { data } </ div >
755+ < button onClick = { ( ) => refetch ( ) } > Refetch</ button >
756+ </ div >
757+ )
758+ }
759+
760+ const rendered = renderWithClient (
761+ queryClient ,
762+ < QueryErrorResetBoundary >
763+ { ( { reset } ) => (
764+ < ErrorBoundary
765+ onReset = { reset }
766+ fallbackRender = { ( { resetErrorBoundary } ) => (
767+ < div >
768+ < div > Status: error</ div >
769+ < button onClick = { resetErrorBoundary } > Retry</ button >
770+ </ div >
771+ ) }
772+ >
773+ < Page />
774+ </ ErrorBoundary >
775+ ) }
776+ </ QueryErrorResetBoundary > ,
777+ )
778+
779+ // 1. First mount -> fetching -> Success
780+ await vi . advanceTimersByTimeAsync ( 11 )
781+ expect ( rendered . getByText ( 'Data: Success 1' ) ) . toBeInTheDocument ( )
782+ expect ( queryFn ) . toHaveBeenCalledTimes ( 1 )
783+
784+ // 2. Click Refetch -> Triggers fetch -> Fails (Error 2) -> ErrorBoundary
785+ fireEvent . click ( rendered . getByText ( 'Refetch' ) )
786+ await vi . advanceTimersByTimeAsync ( 11 )
787+ expect ( rendered . getByText ( 'Status: error' ) ) . toBeInTheDocument ( )
788+ expect ( queryFn ) . toHaveBeenCalledTimes ( 2 )
789+
790+ // 3. Click Retry -> Remounts
791+ // Because staleTime is Infinity and we have Data from (1),
792+ // AND we are in Error state.
793+ fireEvent . click ( rendered . getByText ( 'Retry' ) )
794+ await vi . advanceTimersByTimeAsync ( 11 )
795+ expect ( rendered . getByText ( 'Data: Success 3' ) ) . toBeInTheDocument ( )
796+ expect ( queryFn ) . toHaveBeenCalledTimes ( 3 )
797+ } )
728798 } )
729799
730800 describe ( 'useQueries' , ( ) => {
0 commit comments