@@ -1091,4 +1091,56 @@ describe('ReactQueryDevtools', () => {
1091
1091
expect ( screen . getByText ( 'No error, success' ) ) . toBeInTheDocument ( )
1092
1092
} )
1093
1093
} )
1094
+
1095
+ it ( 'should not refetch when already restoring a query' , async ( ) => {
1096
+ const { queryClient } = createQueryClient ( )
1097
+
1098
+ let count = 0
1099
+ let resolvePromise : ( value : unknown ) => void = ( ) => undefined
1100
+
1101
+ function App ( ) {
1102
+ const { data } = useQuery ( [ 'key' ] , ( ) => {
1103
+ count ++
1104
+
1105
+ // Resolve the promise immediately when
1106
+ // the query is fetched for the first time
1107
+ if ( count === 1 ) {
1108
+ return Promise . resolve ( 'test' )
1109
+ }
1110
+
1111
+ return new Promise ( ( resolve ) => {
1112
+ // Do not resolve immediately and store the
1113
+ // resolve function to resolve the promise later
1114
+ resolvePromise = resolve
1115
+ } )
1116
+ } )
1117
+
1118
+ return (
1119
+ < div >
1120
+ < h1 > { typeof data === 'string' ? data : 'No data' } </ h1 >
1121
+ </ div >
1122
+ )
1123
+ }
1124
+
1125
+ renderWithClient ( queryClient , < App /> , {
1126
+ initialIsOpen : true ,
1127
+ } )
1128
+
1129
+ const loadingButton = await screen . findByRole ( 'button' , {
1130
+ name : 'Trigger loading' ,
1131
+ } )
1132
+ fireEvent . click ( loadingButton )
1133
+
1134
+ await waitFor ( ( ) => {
1135
+ expect ( screen . getByText ( 'Restore loading' ) ) . toBeInTheDocument ( )
1136
+ } )
1137
+
1138
+ // Click the restore loading button twice and only resolve query promise
1139
+ // after the second click.
1140
+ fireEvent . click ( screen . getByRole ( 'button' , { name : / r e s t o r e l o a d i n g / i } ) )
1141
+ fireEvent . click ( screen . getByRole ( 'button' , { name : / r e s t o r e l o a d i n g / i } ) )
1142
+ resolvePromise ( 'test' )
1143
+
1144
+ expect ( count ) . toBe ( 2 )
1145
+ } )
1094
1146
} )
0 commit comments