From 4b9c5d886f9c1febe55adf15c38096bf4aaec994 Mon Sep 17 00:00:00 2001 From: Dominik Dorfmeister Date: Mon, 16 Dec 2024 18:22:07 +0100 Subject: [PATCH] test: startTransition --- .../src/__tests__/transition.test.tsx | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 packages/react-query/src/__tests__/transition.test.tsx diff --git a/packages/react-query/src/__tests__/transition.test.tsx b/packages/react-query/src/__tests__/transition.test.tsx new file mode 100644 index 0000000000..c79ce27f7d --- /dev/null +++ b/packages/react-query/src/__tests__/transition.test.tsx @@ -0,0 +1,97 @@ +import { afterAll, beforeAll, describe, expect, it } from 'vitest' +import * as React from 'react' +import { + createRenderStream, + useTrackRenders, +} from '@testing-library/react-render-stream' +import { QueryClientProvider, useQuery } from '..' +import { QueryCache } from '../index' +import { createQueryClient, queryKey, sleep } from './utils' + +describe('react transitions', () => { + const queryCache = new QueryCache() + const queryClient = createQueryClient({ + queryCache, + }) + + beforeAll(() => { + queryClient.setDefaultOptions({ + queries: { experimental_prefetchInRender: true }, + }) + }) + afterAll(() => { + queryClient.setDefaultOptions({ + queries: { experimental_prefetchInRender: false }, + }) + }) + + it('should keep values of old key around with startTransition', async () => { + const key = queryKey() + + const renderStream = createRenderStream({ snapshotDOM: true }) + + function Loading() { + useTrackRenders() + return <>loading.. + } + + function Page() { + useTrackRenders() + const [count, setCount] = React.useState(0) + const query = useQuery({ + queryKey: [key, count], + queryFn: async () => { + await sleep(10) + return 'test' + count + }, + }) + + const data = React.use(query.promise) + + return ( +
+ +
data: {data}
+
+ ) + } + + const rendered = await renderStream.render( + + }> + + + , + ) + + { + const { renderedComponents, withinDOM } = await renderStream.takeRender() + withinDOM().getByText('loading..') + expect(renderedComponents).toEqual([Loading]) + } + + { + const { renderedComponents, withinDOM } = await renderStream.takeRender() + withinDOM().getByText('data: test0') + expect(renderedComponents).toEqual([Page]) + } + + rendered.getByRole('button', { name: 'increment' }).click() + + { + const { renderedComponents, withinDOM } = await renderStream.takeRender() + withinDOM().getByText('data: test0') + expect(renderedComponents).toEqual([Page]) + } + + { + const { renderedComponents, withinDOM } = await renderStream.takeRender() + withinDOM().getByText('data: test1') + expect(renderedComponents).toEqual([Page]) + } + }) +})