@@ -37,6 +37,11 @@ import { delay } from '../../utils'
3737// This can be used to test how many renders happen due to data changes or
3838// the refetching behavior of components.
3939let amount = 0
40+ let nextItemId = 0
41+
42+ interface Item {
43+ id : number
44+ }
4045
4146const api = createApi ( {
4247 baseQuery : async ( arg : any ) => {
@@ -54,6 +59,15 @@ const api = createApi({
5459 }
5560 }
5661
62+ if ( arg ?. body && 'listItems' in arg . body ) {
63+ const items : Item [ ] = [ ]
64+ for ( let i = 0 ; i < 3 ; i ++ ) {
65+ const item = { id : nextItemId ++ }
66+ items . push ( item )
67+ }
68+ return { data : items }
69+ }
70+
5771 return {
5872 data : arg ?. body ? { ...arg . body , ...( amount ? { amount } : { } ) } : { } ,
5973 }
@@ -85,6 +99,23 @@ const api = createApi({
8599 getError : build . query ( {
86100 query : ( query ) => '/error' ,
87101 } ) ,
102+ listItems : build . query < Item [ ] , { pageNumber : number } > ( {
103+ serializeQueryArgs : ( { endpointName } ) => {
104+ return endpointName
105+ } ,
106+ query : ( { pageNumber } ) => ( {
107+ url : `items?limit=1&offset=${ pageNumber } ` ,
108+ body : {
109+ listItems : true ,
110+ } ,
111+ } ) ,
112+ merge : ( currentCache , newItems ) => {
113+ currentCache . push ( ...newItems )
114+ } ,
115+ forceRefetch : ( { currentArg, previousArg } ) => {
116+ return true
117+ } ,
118+ } ) ,
88119 } ) ,
89120} )
90121
@@ -589,6 +620,35 @@ describe('hooks tests', () => {
589620 )
590621 } )
591622
623+ test ( `useQuery refetches when query args object changes even if serialized args don't change` , async ( ) => {
624+ function ItemList ( ) {
625+ const [ pageNumber , setPageNumber ] = React . useState ( 0 )
626+ const { data = [ ] } = api . useListItemsQuery ( { pageNumber } )
627+
628+ const renderedItems = data . map ( ( item ) => (
629+ < li key = { item . id } > ID: { item . id } </ li >
630+ ) )
631+ return (
632+ < div >
633+ < button onClick = { ( ) => setPageNumber ( pageNumber + 1 ) } >
634+ Next Page
635+ </ button >
636+ < ul > { renderedItems } </ ul >
637+ </ div >
638+ )
639+ }
640+
641+ render ( < ItemList /> , { wrapper : storeRef . wrapper } )
642+
643+ await screen . findByText ( 'ID: 0' )
644+
645+ await act ( async ( ) => {
646+ screen . getByText ( 'Next Page' ) . click ( )
647+ } )
648+
649+ await screen . findByText ( 'ID: 3' )
650+ } )
651+
592652 describe ( 'api.util.resetApiState resets hook' , ( ) => {
593653 test ( 'without `selectFromResult`' , async ( ) => {
594654 const { result } = renderHook ( ( ) => api . endpoints . getUser . useQuery ( 5 ) , {
0 commit comments