@@ -2,7 +2,11 @@ import React from 'react'
22import { render , waitFor } from '@testing-library/react'
33
44import { QueryClient , useQuery , UseQueryResult , useQueries } from '../..'
5- import { queryKey } from '../../reactjs/tests/utils'
5+ import {
6+ createQueryClient ,
7+ mockLogger ,
8+ queryKey ,
9+ } from '../../reactjs/tests/utils'
610import { sleep } from '../../core/utils'
711import { PersistedClient , Persister , persistQueryClientSave } from '../persist'
812import { PersistQueryClientProvider } from '../PersistQueryClientProvider'
@@ -24,12 +28,31 @@ const createMockPersister = (): Persister => {
2428 }
2529}
2630
31+ const createMockErrorPersister = (
32+ removeClient : Persister [ 'removeClient' ]
33+ ) : [ Error , Persister ] => {
34+ const error = new Error ( 'restore failed' )
35+ return [
36+ error ,
37+ {
38+ async persistClient ( ) {
39+ // noop
40+ } ,
41+ async restoreClient ( ) {
42+ await sleep ( 10 )
43+ throw error
44+ } ,
45+ removeClient,
46+ } ,
47+ ]
48+ }
49+
2750describe ( 'PersistQueryClientProvider' , ( ) => {
2851 test ( 'restores cache from persister' , async ( ) => {
2952 const key = queryKey ( )
3053 const states : UseQueryResult < string > [ ] = [ ]
3154
32- const queryClient = new QueryClient ( )
55+ const queryClient = createQueryClient ( )
3356 await queryClient . prefetchQuery ( key , ( ) => Promise . resolve ( 'hydrated' ) )
3457
3558 const persister = createMockPersister ( )
@@ -98,7 +121,7 @@ describe('PersistQueryClientProvider', () => {
98121 const key = queryKey ( )
99122 const states : UseQueryResult [ ] = [ ]
100123
101- const queryClient = new QueryClient ( )
124+ const queryClient = createQueryClient ( )
102125 await queryClient . prefetchQuery ( key , ( ) => Promise . resolve ( 'hydrated' ) )
103126
104127 const persister = createMockPersister ( )
@@ -174,7 +197,7 @@ describe('PersistQueryClientProvider', () => {
174197 const key = queryKey ( )
175198 const states : UseQueryResult < string > [ ] = [ ]
176199
177- const queryClient = new QueryClient ( )
200+ const queryClient = createQueryClient ( )
178201 await queryClient . prefetchQuery ( key , ( ) => Promise . resolve ( 'hydrated' ) )
179202
180203 const persister = createMockPersister ( )
@@ -252,7 +275,7 @@ describe('PersistQueryClientProvider', () => {
252275 const key = queryKey ( )
253276 const states : UseQueryResult < string > [ ] = [ ]
254277
255- const queryClient = new QueryClient ( )
278+ const queryClient = createQueryClient ( )
256279 await queryClient . prefetchQuery ( key , ( ) => Promise . resolve ( 'hydrated' ) )
257280
258281 const persister = createMockPersister ( )
@@ -319,7 +342,7 @@ describe('PersistQueryClientProvider', () => {
319342 test ( 'should call onSuccess after successful restoring' , async ( ) => {
320343 const key = queryKey ( )
321344
322- const queryClient = new QueryClient ( )
345+ const queryClient = createQueryClient ( )
323346 await queryClient . prefetchQuery ( key , ( ) => Promise . resolve ( 'hydrated' ) )
324347
325348 const persister = createMockPersister ( )
@@ -360,11 +383,50 @@ describe('PersistQueryClientProvider', () => {
360383 await waitFor ( ( ) => rendered . getByText ( 'fetched' ) )
361384 } )
362385
386+ test ( 'should remove cache after non-successful restoring' , async ( ) => {
387+ const key = queryKey ( )
388+ jest . spyOn ( console , 'warn' ) . mockImplementation ( ( ) => undefined )
389+ jest . spyOn ( console , 'error' ) . mockImplementation ( ( ) => undefined )
390+
391+ const queryClient = createQueryClient ( )
392+ const removeClient = jest . fn ( )
393+
394+ const [ error , persister ] = createMockErrorPersister ( removeClient )
395+
396+ function Page ( ) {
397+ const state = useQuery ( key , async ( ) => {
398+ await sleep ( 10 )
399+ return 'fetched'
400+ } )
401+
402+ return (
403+ < div >
404+ < h1 > { state . data } </ h1 >
405+ < h2 > fetchStatus: { state . fetchStatus } </ h2 >
406+ </ div >
407+ )
408+ }
409+
410+ const rendered = render (
411+ < PersistQueryClientProvider
412+ client = { queryClient }
413+ persistOptions = { { persister } }
414+ >
415+ < Page />
416+ </ PersistQueryClientProvider >
417+ )
418+
419+ await waitFor ( ( ) => rendered . getByText ( 'fetched' ) )
420+ expect ( removeClient ) . toHaveBeenCalledTimes ( 1 )
421+ expect ( mockLogger . error ) . toHaveBeenCalledTimes ( 1 )
422+ expect ( mockLogger . error ) . toHaveBeenCalledWith ( error )
423+ } )
424+
363425 test ( 'should be able to persist into multiple clients' , async ( ) => {
364426 const key = queryKey ( )
365427 const states : UseQueryResult [ ] = [ ]
366428
367- const queryClient = new QueryClient ( )
429+ const queryClient = createQueryClient ( )
368430 await queryClient . prefetchQuery ( key , ( ) => Promise . resolve ( 'hydrated' ) )
369431
370432 const persister = createMockPersister ( )
0 commit comments