Skip to content

Commit 394b003

Browse files
committed
test(react-query/QueryResetErrorBoundary): relocate 'issue-9728' test and migrate to fake timers
1 parent d688458 commit 394b003

2 files changed

Lines changed: 78 additions & 108 deletions

File tree

packages/react-query/src/__tests__/QueryResetErrorBoundary.test.tsx

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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', () => {

packages/react-query/src/__tests__/issue-9728.test.tsx

Lines changed: 0 additions & 108 deletions
This file was deleted.

0 commit comments

Comments
 (0)