diff --git a/test/use-swr-cache.test.tsx b/test/use-swr-cache.test.tsx index 22b7b6234..afdddb87c 100644 --- a/test/use-swr-cache.test.tsx +++ b/test/use-swr-cache.test.tsx @@ -1,7 +1,15 @@ -import { act, fireEvent, render, screen } from '@testing-library/react' +import { act, fireEvent, screen } from '@testing-library/react' import React, { useState } from 'react' import useSWR, { useSWRConfig, SWRConfig, mutate as globalMutate } from 'swr' -import { sleep, createKey, createResponse, nextTick, focusOn } from './utils' +import { + sleep, + createKey, + createResponse, + nextTick, + focusOn, + renderWithConfig, + renderWithGlobalCache +} from './utils' describe('useSWR - cache provider', () => { let provider @@ -14,26 +22,18 @@ describe('useSWR - cache provider', () => { const fetcher = _key => 'res:' + _key const keys = [createKey(), createKey()] - function Section() { + function Page() { const [index, setIndex] = useState(0) const { data } = useSWR(keys[index], fetcher) return
setIndex(1)}>{data}
} - function App() { - return ( - provider }}> -
- - ) - } - - const { container } = render() + renderWithConfig(, { provider: () => provider }) await screen.findByText(fetcher(keys[0])) expect(provider.get(keys[1])).toBe(undefined) - fireEvent.click(container.firstElementChild) + fireEvent.click(screen.getByText(fetcher(keys[0]))) await act(() => sleep(10)) expect(provider.get(keys[0])).toBe(fetcher(keys[0])) @@ -51,15 +51,9 @@ describe('useSWR - cache provider', () => { return
{data}
} - function App() { - return ( - new Map([[key, 'cached value']]) }}> - - - ) - } - - render() + renderWithConfig(, { + provider: () => new Map([[key, 'cached value']]) + }) screen.getByText('cached value') await screen.findByText('updated value') expect(renderedValues.length).toBe(2) @@ -76,15 +70,9 @@ describe('useSWR - cache provider', () => { return
{data}
} - function App() { - return ( - new Map([[key, 'cached value']]) }}> - - - ) - } - - render() + renderWithConfig(, { + provider: () => new Map([[key, 'cached value']]) + }) screen.getByText('cached value') await act(() => mutate(key, 'mutated value', false)) await screen.findByText('mutated value') @@ -110,15 +98,7 @@ describe('useSWR - cache provider', () => { ) } - function App() { - return ( - new Map([[key, '1']]) }}> - - - ) - } - - render() + renderWithConfig(, { provider: () => new Map([[key, '1']]) }) screen.getByText('1:2') }) @@ -144,7 +124,7 @@ describe('useSWR - cache provider', () => { ) } - render() + renderWithConfig() screen.getByText('1:2') }) @@ -155,32 +135,23 @@ describe('useSWR - cache provider', () => { const unsubscribeReconnectFn = jest.fn() let value = 1 - function Foo() { + function Page() { const { data } = useSWR(key, () => value++, { dedupingInterval: 0 }) return <>{String(data)} } - function Page() { - return ( - new Map([[key, 0]]), - initFocus() { - focusFn() - return unsubscribeFocusFn - }, - initReconnect() { - /* do nothing */ - return unsubscribeReconnectFn - } - }} - > - - - ) - } - const { unmount } = render() + const { unmount } = renderWithConfig(, { + provider: () => new Map([[key, 0]]), + initFocus() { + focusFn() + return unsubscribeFocusFn + }, + initReconnect() { + /* do nothing */ + return unsubscribeReconnectFn + } + }) screen.getByText('0') // mount @@ -199,20 +170,14 @@ describe('useSWR - cache provider', () => { it('should work with revalidateOnFocus', async () => { const key = createKey() let value = 0 - function Foo() { + function Page() { const { data } = useSWR(key, () => value++, { dedupingInterval: 0 }) return <>{String(data)} } - function Page() { - return ( - provider }}> - - - ) - } - render() + + renderWithConfig(, { provider: () => provider }) screen.getByText('undefined') await screen.findByText('0') @@ -223,54 +188,36 @@ describe('useSWR - cache provider', () => { it('should support fallback values with custom provider', async () => { const key = createKey() - function Foo() { + function Page() { const { data } = useSWR(key, async () => { await sleep(10) return 'data' }) return <>{String(data)} } - function Page() { - return ( - provider, - fallback: { [key]: 'fallback' } - }} - > - - - ) - } - render() + renderWithConfig(, { + provider: () => provider, + fallback: { [key]: 'fallback' } + }) screen.getByText('fallback') // no `undefined`, directly fallback await screen.findByText('data') }) it('should not return the fallback if cached', async () => { const key = createKey() - function Foo() { + function Page() { const { data } = useSWR(key, async () => { await sleep(10) return 'data' }) return <>{String(data)} } - function Page() { - return ( - new Map([[key, 'cache']]), - fallback: { [key]: 'fallback' } - }} - > - - - ) - } - render() + renderWithConfig(, { + provider: () => new Map([[key, 'cache']]), + fallback: { [key]: 'fallback' } + }) screen.getByText('cache') // no `undefined`, directly from cache await screen.findByText('data') }) @@ -279,38 +226,29 @@ describe('useSWR - cache provider', () => { let parentCache const key = createKey() - function Foo() { + function Page() { const { data } = useSWR(key, async () => { await sleep(10) return 'data' }) return <>{String(data)} } - function Page() { - return ( - { - parentCache = parentCache_ - return { - set: (k, v) => parentCache_.set(k, v), - get: k => { - // We append `-extended` to the value returned by the parent cache. - const v = parentCache_.get(k) - if (typeof v === 'undefined') return v - return v + '-extended' - }, - delete: k => parentCache_.delete(k) - } - } - }} - > - - - ) - } - render() + renderWithConfig(, { + provider: parentCache_ => { + parentCache = parentCache_ + return { + set: (k, v) => parentCache_.set(k, v), + get: k => { + // We append `-extended` to the value returned by the parent cache. + const v = parentCache_.get(k) + if (typeof v === 'undefined') return v + return v + '-extended' + }, + delete: k => parentCache_.delete(k) + } + } + }) expect(parentCache).toBe(SWRConfig.default.cache) screen.getByText('undefined') @@ -319,19 +257,12 @@ describe('useSWR - cache provider', () => { it('should return the cache instance from the useSWRConfig', async () => { let cache - function Foo() { + function Page() { cache = useSWRConfig().cache return null } - function Page() { - return ( - provider }}> - - - ) - } - render() + renderWithConfig(, { provider: () => provider }) expect(provider).toBe(cache) }) @@ -364,7 +295,7 @@ describe('useSWR - cache provider', () => { ) } - render() + renderWithConfig() screen.getByText('undefined,fallback,undefined') await screen.findByText('data,data,data') }) @@ -387,7 +318,7 @@ describe('useSWR - cache provider', () => { ) } - render() + renderWithConfig() expect(createCacheProvider).toBeCalledTimes(1) act(() => rerender({})) expect(createCacheProvider).toBeCalledTimes(1) @@ -404,7 +335,7 @@ describe('useSWR - global cache', () => { return null } - render() + renderWithGlobalCache() expect(localCache).toBe(SWRConfig.default.cache) expect(localMutate).toBe(globalMutate) }) @@ -414,7 +345,7 @@ describe('useSWR - global cache', () => { const keys = [createKey(), createKey()] let cache - function Section() { + function Page() { const [index, setIndex] = useState(0) cache = useSWRConfig().cache const { data } = useSWR(keys[index], fetcher) @@ -422,11 +353,11 @@ describe('useSWR - global cache', () => { return
setIndex(1)}>{data}
} - const { container } = render(
) + renderWithGlobalCache() await screen.findByText(fetcher(keys[0])) expect(cache.get(keys[1])).toBe(undefined) - fireEvent.click(container.firstElementChild) + fireEvent.click(screen.getByText(fetcher(keys[0]))) await act(() => sleep(10)) expect(cache.get(keys[0])).toBe(fetcher(keys[0])) @@ -444,7 +375,7 @@ describe('useSWR - global cache', () => { return
data:{data}
} - render() + renderWithGlobalCache() screen.getByText('data:') await act(() => mutate(key, 'mutated value', false)) await screen.findByText('data:mutated value') @@ -453,13 +384,13 @@ describe('useSWR - global cache', () => { it('should work with revalidateOnFocus', async () => { const key = createKey() let value = 0 - function Foo() { + function Page() { const { data } = useSWR(key, () => value++, { dedupingInterval: 0 }) return <>{String(data)} } - render() + renderWithGlobalCache() screen.getByText('undefined') await screen.findByText('0') @@ -470,26 +401,15 @@ describe('useSWR - global cache', () => { it('should support fallback values', async () => { const key = createKey() - function Foo() { + function Page() { const { data } = useSWR(key, async () => { await sleep(10) return 'data' }) return <>{String(data)} } - function Page() { - return ( - - - - ) - } - render() + renderWithGlobalCache(, { fallback: { [key]: 'fallback' } }) screen.getByText('fallback') // no `undefined`, directly fallback await screen.findByText('data') })