@@ -725,6 +725,84 @@ describe('QueryErrorResetBoundary', () => {
725725
726726 consoleMock . mockRestore ( )
727727 } )
728+
729+ it ( 'should refetch after error when staleTime is Infinity and previous data exists (#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 [ _ , forceUpdate ] = React . useState ( 0 )
745+
746+ React . useEffect ( ( ) => {
747+ forceUpdate ( 1 )
748+ } , [ ] )
749+
750+ const { data, refetch } = useQuery ( {
751+ queryKey : key ,
752+ queryFn,
753+ retry : false ,
754+ staleTime : Infinity ,
755+ throwOnError : true ,
756+ } )
757+
758+ return (
759+ < div >
760+ < div > Data: { data } </ div >
761+ < button onClick = { ( ) => refetch ( ) } > Refetch</ button >
762+ </ div >
763+ )
764+ }
765+
766+ const rendered = renderWithClient (
767+ queryClient ,
768+ < React . StrictMode >
769+ < QueryErrorResetBoundary >
770+ { ( { reset } ) => (
771+ < ErrorBoundary
772+ onReset = { reset }
773+ fallbackRender = { ( { resetErrorBoundary } ) => (
774+ < div >
775+ < div > Status: error</ div >
776+ < button onClick = { resetErrorBoundary } > Retry</ button >
777+ </ div >
778+ ) }
779+ >
780+ < Page />
781+ </ ErrorBoundary >
782+ ) }
783+ </ QueryErrorResetBoundary >
784+ </ React . StrictMode > ,
785+ )
786+
787+ // 1. First mount -> fetching -> Success
788+ await vi . advanceTimersByTimeAsync ( 11 )
789+ expect ( rendered . getByText ( 'Data: Success 1' ) ) . toBeInTheDocument ( )
790+ expect ( queryFn ) . toHaveBeenCalledTimes ( 1 )
791+
792+ // 2. Click Refetch -> Triggers fetch -> Fails (Error 2) -> ErrorBoundary
793+ fireEvent . click ( rendered . getByText ( 'Refetch' ) )
794+ await vi . advanceTimersByTimeAsync ( 11 )
795+ expect ( rendered . getByText ( 'Status: error' ) ) . toBeInTheDocument ( )
796+ expect ( queryFn ) . toHaveBeenCalledTimes ( 2 )
797+
798+ // 3. Click Retry -> Remounts
799+ // Because staleTime is Infinity and we have Data from (1),
800+ // AND we are in Error state.
801+ fireEvent . click ( rendered . getByText ( 'Retry' ) )
802+ await vi . advanceTimersByTimeAsync ( 11 )
803+ expect ( rendered . getByText ( 'Data: Success 3' ) ) . toBeInTheDocument ( )
804+ expect ( queryFn ) . toHaveBeenCalledTimes ( 3 )
805+ } )
728806 } )
729807
730808 describe ( 'useQueries' , ( ) => {
0 commit comments