Skip to content

Commit 0c1a60e

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

2 files changed

Lines changed: 70 additions & 108 deletions

File tree

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

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

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

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

0 commit comments

Comments
 (0)