@@ -37,6 +37,11 @@ import { delay } from '../../utils'
37
37
// This can be used to test how many renders happen due to data changes or
38
38
// the refetching behavior of components.
39
39
let amount = 0
40
+ let nextItemId = 0
41
+
42
+ interface Item {
43
+ id : number
44
+ }
40
45
41
46
const api = createApi ( {
42
47
baseQuery : async ( arg : any ) => {
@@ -54,6 +59,15 @@ const api = createApi({
54
59
}
55
60
}
56
61
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
+
57
71
return {
58
72
data : arg ?. body ? { ...arg . body , ...( amount ? { amount } : { } ) } : { } ,
59
73
}
@@ -85,6 +99,23 @@ const api = createApi({
85
99
getError : build . query ( {
86
100
query : ( query ) => '/error' ,
87
101
} ) ,
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
+ } ) ,
88
119
} ) ,
89
120
} )
90
121
@@ -589,6 +620,35 @@ describe('hooks tests', () => {
589
620
)
590
621
} )
591
622
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
+
592
652
describe ( 'api.util.resetApiState resets hook' , ( ) => {
593
653
test ( 'without `selectFromResult`' , async ( ) => {
594
654
const { result } = renderHook ( ( ) => api . endpoints . getUser . useQuery ( 5 ) , {
0 commit comments