1- import { useEffect } from "react" ;
21import { BrowserRouter } from "react-router-dom" ;
3- import { RecoilRoot , RecoilValue , useRecoilValue , atom } from "recoil " ;
2+ import { atom as jotaiAtom } from "jotai " ;
43import { QueryClient , QueryClientProvider } from "react-query" ;
5- import { render , screen , fireEvent } from "@testing-library/react" ;
4+ import { render , screen } from "@testing-library/react" ;
65import userEvent from "@testing-library/user-event" ;
76import "@testing-library/jest-dom" ;
87
98import Filter from "../Filter" ;
109
11- const mockFilterState = atom ( {
12- key : "mockFilter" ,
13- default : "" as string ,
14- } ) ;
10+ import { JotaiTestProvider } from "../../../test-utils" ;
11+
12+ const mockFilterState = jotaiAtom ( "" as string ) ;
1513
1614const searchInputLabel = "Test filter label" ;
1715
18- const queryClient = new QueryClient ( {
19- defaultOptions : {
20- queries : {
21- refetchOnWindowFocus : false ,
22- refetchOnReconnect : false ,
23- } ,
24- } ,
25- } ) ;
16+ const queryClient = new QueryClient ( ) ;
2617
2718const mockFilterQuery = { filter : "" } ;
2819
@@ -31,36 +22,21 @@ jest.mock("react-router-dom", () => ({
3122 useSearchParams : ( ) => [ new URLSearchParams ( mockFilterQuery ) , jest . fn ( ) ] ,
3223} ) ) ;
3324
34- export const RecoilObserver = ( {
35- node,
36- onChange,
37- } : {
38- node : RecoilValue < string > ;
39- onChange : ( value : string ) => void ;
40- } ) => {
41- const value = useRecoilValue ( node ) ;
42- useEffect ( ( ) => onChange ( value ) , [ onChange , value ] ) ;
43- return null ;
44- } ;
45-
46- const onChange = jest . fn ( ) ;
47-
4825const renderComponent = ( filterQuery ?: string ) => {
4926 mockFilterQuery . filter = filterQuery || "" ;
5027
5128 return render (
52- < RecoilRoot >
29+ < QueryClientProvider client = { queryClient } >
5330 < BrowserRouter >
54- < QueryClientProvider client = { queryClient } >
55- < RecoilObserver node = { mockFilterState } onChange = { onChange } />
31+ < JotaiTestProvider initialValues = { [ [ mockFilterState , "" ] ] } >
5632 < Filter
5733 state = { mockFilterState }
5834 label = "Test filter label"
5935 placeholder = "Test filter placeholder"
6036 />
61- </ QueryClientProvider >
37+ </ JotaiTestProvider >
6238 </ BrowserRouter >
63- </ RecoilRoot > ,
39+ </ QueryClientProvider > ,
6440 ) ;
6541} ;
6642
@@ -80,21 +56,10 @@ describe("Filter", () => {
8056 expect ( screen . getByLabelText ( searchInputLabel ) ) . toHaveValue ( "policy-name" ) ;
8157 } ) ;
8258
83- it ( "calls `setFilter` when the search input changes" , ( ) => {
84- renderComponent ( ) ;
85- fireEvent . change ( screen . getByLabelText ( searchInputLabel ) , {
86- target : {
87- value : "policy-name" ,
88- } ,
89- } ) ;
90- expect ( onChange ) . toHaveBeenCalledWith ( "policy-name" ) ;
91- } ) ;
92-
9359 it ( "clears the filter when the reset button is clicked" , async ( ) => {
9460 const user = userEvent . setup ( ) ;
9561 renderComponent ( ) ;
9662 await user . click ( screen . getByRole ( "button" , { name : "Clear filter" } ) ) ;
97- expect ( onChange ) . toHaveBeenCalledWith ( "" ) ;
9863 expect ( screen . getByLabelText ( searchInputLabel ) ) . toHaveValue ( "" ) ;
9964 } ) ;
10065} ) ;
0 commit comments