From 88a8b30b7385723d97caf5764f35e634e79094b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Wed, 13 Sep 2023 08:22:47 +0200 Subject: [PATCH] fix: avoid reverting state to a fetching one (#5997) * fix: avoid reverting state to a fetching one * Update packages/query-core/src/tests/query.test.tsx --------- Co-authored-by: Dominik Dorfmeister --- packages/query-core/src/query.ts | 2 +- packages/query-core/src/tests/query.test.tsx | 52 ++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/packages/query-core/src/query.ts b/packages/query-core/src/query.ts index 3b3960e900..d334a0f83c 100644 --- a/packages/query-core/src/query.ts +++ b/packages/query-core/src/query.ts @@ -559,7 +559,7 @@ export class Query< const error = action.error as unknown if (isCancelledError(error) && error.revert && this.revertState) { - return { ...this.revertState } + return { ...this.revertState, fetchStatus: 'idle' } } return { diff --git a/packages/query-core/src/tests/query.test.tsx b/packages/query-core/src/tests/query.test.tsx index dc2b2bfb23..fcc4ad023c 100644 --- a/packages/query-core/src/tests/query.test.tsx +++ b/packages/query-core/src/tests/query.test.tsx @@ -911,4 +911,56 @@ describe('query', () => { unsubscribe() }) + + test('should always revert to idle state (#5958)', async () => { + let mockedData = [1] + + const key = queryKey() + + const queryFn = jest.fn< + Promise, + [QueryFunctionContext>] + >() + + queryFn.mockImplementation(({ signal }) => { + return new Promise((resolve, reject) => { + const abortListener = () => { + clearTimeout(timerId) + reject(signal!.reason) + } + signal!.addEventListener('abort', abortListener) + + const timerId = setTimeout(() => { + signal!.removeEventListener('abort', abortListener) + resolve(mockedData.join(' - ')) + }, 50) + }) + }) + + const observer = new QueryObserver(queryClient, { + queryKey: key, + queryFn, + }) + const unsubscribe = observer.subscribe(() => undefined) + await sleep(60) // let it resolve + + mockedData = [1, 2] // update "server" state in the background + + queryClient.invalidateQueries(key) + await sleep(1) + queryClient.invalidateQueries(key) + await sleep(1) + unsubscribe() // unsubscribe to simulate unmount + + // set up a new observer to simulate a mount of new component + const newObserver = new QueryObserver(queryClient, { + queryKey: key, + queryFn, + }) + + const spy = jest.fn() + newObserver.subscribe(({ data }) => spy(data)) + await sleep(60) // let it resolve + expect(spy).toHaveBeenCalledWith('1 - 2') + }) })