Skip to content

Commit b0ca15b

Browse files
authored
fix(devtools): make sure that sort function is properly read from localStorage (#3703)
* fix(devtools): make sure that sort function is properly read from localStorage * test(devtools): wrap getByRole queries with explicit expect statements when the returned element is not used for assertions * chore(devtools): apply prettier formatting
1 parent b25e964 commit b0ca15b

File tree

2 files changed

+100
-7
lines changed

2 files changed

+100
-7
lines changed

packages/react-query-devtools/src/__tests__/devtools.test.tsx

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { fireEvent, screen, waitFor, act } from '@testing-library/react'
33
import { ErrorBoundary } from 'react-error-boundary'
44
import '@testing-library/jest-dom'
55
import { useQuery, QueryClient } from '@tanstack/react-query'
6+
import { sortFns } from '../devtools'
67
import {
78
getByTextContent,
89
renderWithClient,
@@ -552,6 +553,104 @@ describe('ReactQueryDevtools', () => {
552553
expect(queries[2]?.textContent).toEqual(query3Hash)
553554
})
554555

556+
it('should initialize filtering and sorting values with defaults when they are not stored in localstorage', () => {
557+
localStorage.removeItem('reactQueryDevtoolsSortDesc')
558+
localStorage.removeItem('reactQueryDevtoolsSortFn')
559+
localStorage.removeItem('reactQueryDevtoolsFilter')
560+
561+
const { queryClient } = createQueryClient()
562+
563+
function Page() {
564+
const { data = 'default' } = useQuery(['check'], async () => {
565+
await sleep(10)
566+
return 'test'
567+
})
568+
569+
return (
570+
<div>
571+
<h1>{data}</h1>
572+
</div>
573+
)
574+
}
575+
576+
renderWithClient(queryClient, <Page />, {
577+
initialIsOpen: true,
578+
})
579+
580+
const filterInput: HTMLInputElement =
581+
screen.getByLabelText(/Filter by queryhash/i)
582+
expect(filterInput.value).toEqual('')
583+
584+
const sortCombobox: HTMLSelectElement =
585+
screen.getByLabelText(/Sort queries/i)
586+
expect(sortCombobox.value).toEqual(Object.keys(sortFns)[0])
587+
588+
expect(screen.getByRole('button', { name: /Asc/i })).toBeInTheDocument()
589+
590+
const detailsPanel = screen.queryByText(/Query Details/i)
591+
expect(detailsPanel).not.toBeInTheDocument()
592+
})
593+
594+
it('should initialize sorting values with ones stored in localstorage', async () => {
595+
localStorage.setItem('reactQueryDevtoolsSortDesc', 'true')
596+
localStorage.setItem(
597+
'reactQueryDevtoolsSortFn',
598+
JSON.stringify(Object.keys(sortFns)[1]),
599+
)
600+
601+
const { queryClient } = createQueryClient()
602+
603+
function Page() {
604+
const { data = 'default' } = useQuery(['check'], async () => {
605+
await sleep(10)
606+
return 'test'
607+
})
608+
609+
return (
610+
<div>
611+
<h1>{data}</h1>
612+
</div>
613+
)
614+
}
615+
616+
renderWithClient(queryClient, <Page />, {
617+
initialIsOpen: true,
618+
})
619+
620+
const sortCombobox: HTMLSelectElement =
621+
screen.getByLabelText(/Sort queries/i)
622+
expect(sortCombobox.value).toEqual(Object.keys(sortFns)[1])
623+
624+
expect(screen.getByRole('button', { name: /Desc/i })).toBeInTheDocument()
625+
})
626+
627+
it('should initialize filter value with one stored in localstorage', () => {
628+
localStorage.setItem('reactQueryDevtoolsFilter', JSON.stringify('posts'))
629+
630+
const { queryClient } = createQueryClient()
631+
632+
function Page() {
633+
const { data = 'default' } = useQuery(['check'], async () => {
634+
await sleep(10)
635+
return 'test'
636+
})
637+
638+
return (
639+
<div>
640+
<h1>{data}</h1>
641+
</div>
642+
)
643+
}
644+
645+
renderWithClient(queryClient, <Page />, {
646+
initialIsOpen: true,
647+
})
648+
649+
const filterInput: HTMLInputElement =
650+
screen.getByLabelText(/Filter by queryhash/i)
651+
expect(filterInput.value).toEqual('posts')
652+
})
653+
555654
it('style should have a nonce', async () => {
556655
const { queryClient } = createQueryClient()
557656

packages/react-query-devtools/src/devtools.tsx

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@ const getStatusRank = (q: Query) =>
384384
? 2
385385
: 1
386386

387-
const sortFns: Record<string, (a: Query, b: Query) => number> = {
387+
export const sortFns: Record<string, (a: Query, b: Query) => number> = {
388388
'Status > Last Updated': (a, b) =>
389389
getStatusRank(a) === getStatusRank(b)
390390
? (sortFns['Last Updated']?.(a, b) as number)
@@ -441,12 +441,6 @@ export const ReactQueryDevtoolsPanel = React.forwardRef<
441441

442442
const sortFn = React.useMemo(() => sortFns[sort as string], [sort])
443443

444-
React[isServer ? 'useEffect' : 'useLayoutEffect'](() => {
445-
if (!sortFn) {
446-
setSort(Object.keys(sortFns)[0] as string)
447-
}
448-
}, [setSort, sortFn])
449-
450444
const queriesCount = useSubscribeToQueryCache(
451445
queryCache,
452446
() => queryCache.getAll().length,

0 commit comments

Comments
 (0)