From 7e39453d02aae3d28adcfdc908464f88abca5170 Mon Sep 17 00:00:00 2001 From: Andrew Cherniavskii Date: Sat, 29 Feb 2020 13:43:43 +0100 Subject: [PATCH 1/3] test garbage collection of queries without data --- src/tests/useQuery.test.js | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/tests/useQuery.test.js b/src/tests/useQuery.test.js index 4e69a41c4c..4e8a0bff05 100644 --- a/src/tests/useQuery.test.js +++ b/src/tests/useQuery.test.js @@ -1,4 +1,4 @@ -import { cleanup, render, act, waitForElement } from '@testing-library/react' +import { cleanup, render, act, waitForElement, fireEvent } from '@testing-library/react' import * as React from 'react' import { useQuery, queryCache, statusLoading, statusSuccess } from '../index' @@ -226,4 +226,39 @@ describe('useQuery', () => { expect(queryFn).toHaveBeenCalledTimes(2) }) + + it('should garbage collect queries without data immediately', async () => { + function Page() { + const [filter, setFilter] = React.useState(''); + const { data } = useQuery(['todos', { filter }], async (key, { filter } = {}) => { + await sleep(1000); + return `todo ${filter}`; + }) + + return ( +
+
{data}
+ +
+ ) + } + + const rendered = render() + + await waitForElement(() => rendered.getByText('update')) + + fireEvent.click(rendered.getByText('update')) + fireEvent.click(rendered.getByText('update')) + fireEvent.click(rendered.getByText('update')) + fireEvent.click(rendered.getByText('update')) + + expect(Object.keys(queryCache.queries).length).toEqual(5) + + // wait for garbage collection + await sleep(0) + + expect(Object.keys(queryCache.queries).length).toEqual(1) + + await waitForElement(() => rendered.getByText('todo aaaa')); + }) }) From 5f2778436135946f0157d67b187fe7a60560aacf Mon Sep 17 00:00:00 2001 From: Andrew Cherniavskii Date: Sat, 29 Feb 2020 13:45:34 +0100 Subject: [PATCH 2/3] format code --- src/tests/useQuery.test.js | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/tests/useQuery.test.js b/src/tests/useQuery.test.js index 4e8a0bff05..f0d8a2b554 100644 --- a/src/tests/useQuery.test.js +++ b/src/tests/useQuery.test.js @@ -1,4 +1,10 @@ -import { cleanup, render, act, waitForElement, fireEvent } from '@testing-library/react' +import { + cleanup, + render, + act, + waitForElement, + fireEvent, +} from '@testing-library/react' import * as React from 'react' import { useQuery, queryCache, statusLoading, statusSuccess } from '../index' @@ -229,11 +235,14 @@ describe('useQuery', () => { it('should garbage collect queries without data immediately', async () => { function Page() { - const [filter, setFilter] = React.useState(''); - const { data } = useQuery(['todos', { filter }], async (key, { filter } = {}) => { - await sleep(1000); - return `todo ${filter}`; - }) + const [filter, setFilter] = React.useState('') + const { data } = useQuery( + ['todos', { filter }], + async (key, { filter } = {}) => { + await sleep(1000) + return `todo ${filter}` + } + ) return (
@@ -259,6 +268,6 @@ describe('useQuery', () => { expect(Object.keys(queryCache.queries).length).toEqual(1) - await waitForElement(() => rendered.getByText('todo aaaa')); + await waitForElement(() => rendered.getByText('todo aaaa')) }) }) From 387386d6320c5cb12e9111da013817ba7a9b7cec Mon Sep 17 00:00:00 2001 From: Andrew Cherniavskii Date: Sat, 29 Feb 2020 13:48:02 +0100 Subject: [PATCH 3/3] do not use sleep to wait for garbage collection setTimeout is not reliable, so it's better to avoid it --- src/tests/useQuery.test.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/tests/useQuery.test.js b/src/tests/useQuery.test.js index f0d8a2b554..10bbfb5d0e 100644 --- a/src/tests/useQuery.test.js +++ b/src/tests/useQuery.test.js @@ -263,11 +263,8 @@ describe('useQuery', () => { expect(Object.keys(queryCache.queries).length).toEqual(5) - // wait for garbage collection - await sleep(0) + await waitForElement(() => rendered.getByText('todo aaaa')) expect(Object.keys(queryCache.queries).length).toEqual(1) - - await waitForElement(() => rendered.getByText('todo aaaa')) }) })