@@ -6,6 +6,7 @@ import { NATIVE_TOKEN_ADDRESS } from '../../../../shared/constants/transaction';
66import { genUnapprovedContractInteractionConfirmation } from '../../../../test/data/confirmations/contract-interaction' ;
77import { getMockConfirmStateForTransaction } from '../../../../test/data/confirmations/helper' ;
88import { renderHookWithConfirmContextProvider } from '../../../../test/lib/confirmations/render-helpers' ;
9+ import { flushPromises } from '../../../../test/lib/timer-helpers' ;
910import { updateSelectedGasFeeToken } from '../../../store/controller-actions/transaction-controller' ;
1011import { Alert } from '../../../ducks/confirm-alerts/confirm-alerts' ;
1112import { forceUpdateMetamaskState } from '../../../store/actions' ;
@@ -46,6 +47,12 @@ function runHook({
4647 return { ...result , state } ;
4748}
4849
50+ async function flushAsyncUpdates ( ) {
51+ await act ( async ( ) => {
52+ await flushPromises ( ) ;
53+ } ) ;
54+ }
55+
4956describe ( 'useAutomaticGasFeeTokenSelect' , ( ) => {
5057 const updateSelectedGasFeeTokenMock = jest . mocked ( updateSelectedGasFeeToken ) ;
5158 const forceUpdateMetamaskStateMock = jest . mocked ( forceUpdateMetamaskState ) ;
@@ -67,31 +74,56 @@ describe('useAutomaticGasFeeTokenSelect', () => {
6774 } ) ;
6875 } ) ;
6976
70- it ( 'selects first gas fee token' , ( ) => {
71- runHook ( ) ;
77+ it ( 'selects first gas fee token' , async ( ) => {
78+ const { store } = runHook ( ) ;
79+
80+ await flushAsyncUpdates ( ) ;
81+
82+ if ( ! store ) {
83+ throw new Error ( 'Expected store to be defined' ) ;
84+ }
7285
7386 expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 1 ) ;
7487 expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledWith (
7588 expect . any ( String ) ,
7689 GAS_FEE_TOKEN_MOCK . tokenAddress ,
7790 ) ;
91+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledTimes ( 1 ) ;
92+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledWith ( store . dispatch ) ;
7893 } ) ;
7994
80- it ( 'does not select first gas fee token if gas fee token already selected' , ( ) => {
95+ it ( 'does not select first gas fee token if gas fee token already selected' , async ( ) => {
8196 runHook ( { selectedGasFeeToken : GAS_FEE_TOKEN_MOCK . tokenAddress } ) ;
97+
98+ await flushAsyncUpdates ( ) ;
99+
82100 expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 0 ) ;
101+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledTimes ( 0 ) ;
83102 } ) ;
84103
85- it ( 'does not select first gas fee token if no gas fee tokens' , ( ) => {
104+ it ( 'does not select first gas fee token if no gas fee tokens' , async ( ) => {
86105 runHook ( { gasFeeTokens : [ ] } ) ;
106+
107+ await flushAsyncUpdates ( ) ;
108+
87109 expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 0 ) ;
110+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledTimes ( 0 ) ;
88111 } ) ;
89112
90- it ( 'does not select first gas fee token if not first load' , ( ) => {
91- const { rerender, state } = runHook ( {
113+ it ( 'selects first gas fee token on rerender when selection becomes eligible' , async ( ) => {
114+ const { rerender, state, store } = runHook ( {
92115 selectedGasFeeToken : GAS_FEE_TOKEN_MOCK . tokenAddress ,
93116 } ) ;
94117
118+ if ( ! store ) {
119+ throw new Error ( 'Expected store to be defined' ) ;
120+ }
121+
122+ await flushAsyncUpdates ( ) ;
123+
124+ expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 0 ) ;
125+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledTimes ( 0 ) ;
126+
95127 const transactionMeta = state . metamask
96128 . transactions [ 0 ] as unknown as TransactionMeta ;
97129
@@ -101,41 +133,100 @@ describe('useAutomaticGasFeeTokenSelect', () => {
101133
102134 rerender ( ) ;
103135
104- expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 0 ) ;
136+ await flushAsyncUpdates ( ) ;
137+
138+ expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 1 ) ;
139+ expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledWith (
140+ expect . any ( String ) ,
141+ GAS_FEE_TOKEN_MOCK . tokenAddress ,
142+ ) ;
143+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledTimes ( 1 ) ;
144+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledWith ( store . dispatch ) ;
105145 } ) ;
106146
107- it ( 'does not select first gas fee token if gasless not supported' , ( ) => {
147+ it ( 'does not select first gas fee token if gasless not supported' , async ( ) => {
108148 useIsGaslessSupportedMock . mockReturnValue ( {
109149 isSupported : false ,
110150 isSmartTransaction : false ,
111151 } ) ;
112152
113153 runHook ( ) ;
114154
155+ await flushAsyncUpdates ( ) ;
156+
115157 expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 0 ) ;
158+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledTimes ( 0 ) ;
116159 } ) ;
117160
118- it ( 'does not select first gas fee token if sufficient balance' , ( ) => {
161+ it ( 'does not select first gas fee token if sufficient balance' , async ( ) => {
119162 useInsufficientBalanceAlertsMock . mockReturnValue ( [ ] ) ;
120163
121164 runHook ( ) ;
122165
166+ await flushAsyncUpdates ( ) ;
167+
123168 expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 0 ) ;
169+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledTimes ( 0 ) ;
124170 } ) ;
125171
126- it ( 'does not select first gas fee token after firstCheck is set to false' , ( ) => {
127- const { rerender, state } = runHook ( ) ;
172+ it ( 'selects first gas fee token when insufficient balance appears after first render' , async ( ) => {
173+ let alerts : Alert [ ] = [ ] ;
174+ useInsufficientBalanceAlertsMock . mockImplementation ( ( ) => alerts ) ;
175+
176+ const { rerender, store } = runHook ( {
177+ selectedGasFeeToken : undefined ,
178+ } ) ;
179+
180+ if ( ! store ) {
181+ throw new Error ( 'Expected store to be defined' ) ;
182+ }
183+
184+ await flushAsyncUpdates ( ) ;
185+
186+ expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 0 ) ;
187+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledTimes ( 0 ) ;
188+
189+ alerts = [ { } as Alert ] ;
190+
191+ rerender ( ) ;
192+
193+ await flushAsyncUpdates ( ) ;
194+
195+ expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 1 ) ;
196+ expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledWith (
197+ expect . any ( String ) ,
198+ GAS_FEE_TOKEN_MOCK . tokenAddress ,
199+ ) ;
200+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledTimes ( 1 ) ;
201+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledWith ( store . dispatch ) ;
202+ } ) ;
203+
204+ it ( 'does not select first gas fee token after firstCheck is set to false' , async ( ) => {
205+ const { rerender, state, store } = runHook ( ) ;
206+
207+ if ( ! store ) {
208+ throw new Error ( 'Expected store to be defined' ) ;
209+ }
210+
211+ await flushAsyncUpdates ( ) ;
212+
128213 // Simulate a rerender with new state that would otherwise trigger selection
129214 act ( ( ) => {
130215 (
131216 state . metamask . transactions [ 0 ] as unknown as TransactionMeta
132217 ) . selectedGasFeeToken = undefined ;
133218 } ) ;
219+
134220 rerender ( ) ;
221+
222+ await flushAsyncUpdates ( ) ;
223+
135224 expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 1 ) ; // Only first run
225+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledTimes ( 1 ) ;
226+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledWith ( store . dispatch ) ;
136227 } ) ;
137228
138- it ( 'does not select if transactionId is falsy' , ( ) => {
229+ it ( 'does not select if transactionId is falsy' , async ( ) => {
139230 const state = getMockConfirmStateForTransaction (
140231 genUnapprovedContractInteractionConfirmation ( {
141232 gasFeeTokens : [ GAS_FEE_TOKEN_MOCK ] ,
@@ -145,15 +236,23 @@ describe('useAutomaticGasFeeTokenSelect', () => {
145236 // Remove transactionId
146237 state . metamask . transactions = [ ] ;
147238 renderHookWithConfirmContextProvider ( useAutomaticGasFeeTokenSelect , state ) ;
239+
240+ await flushAsyncUpdates ( ) ;
241+
148242 expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 0 ) ;
243+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledTimes ( 0 ) ;
149244 } ) ;
150245
151- it ( 'does not select if gasFeeTokens is falsy' , ( ) => {
246+ it ( 'does not select if gasFeeTokens is falsy' , async ( ) => {
152247 runHook ( { gasFeeTokens : [ ] } ) ;
248+
249+ await flushAsyncUpdates ( ) ;
250+
153251 expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 0 ) ;
252+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledTimes ( 0 ) ;
154253 } ) ;
155254
156- it ( 'does not select first gas fee token if 7702 and future native token' , ( ) => {
255+ it ( 'does not select first gas fee token if 7702 and future native token' , async ( ) => {
157256 useIsGaslessSupportedMock . mockReturnValue ( {
158257 isSupported : true ,
159258 isSmartTransaction : false ,
@@ -168,16 +267,19 @@ describe('useAutomaticGasFeeTokenSelect', () => {
168267 ] ,
169268 } ) ;
170269
270+ await flushAsyncUpdates ( ) ;
271+
171272 expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 0 ) ;
273+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledTimes ( 0 ) ;
172274 } ) ;
173275
174- it ( 'selects second gas fee token if 7702 and future native token' , ( ) => {
276+ it ( 'selects second gas fee token if 7702 and future native token' , async ( ) => {
175277 useIsGaslessSupportedMock . mockReturnValue ( {
176278 isSupported : true ,
177279 isSmartTransaction : false ,
178280 } ) ;
179281
180- runHook ( {
282+ const { store } = runHook ( {
181283 gasFeeTokens : [
182284 {
183285 ...GAS_FEE_TOKEN_MOCK ,
@@ -187,6 +289,18 @@ describe('useAutomaticGasFeeTokenSelect', () => {
187289 ] ,
188290 } ) ;
189291
292+ if ( ! store ) {
293+ throw new Error ( 'Expected store to be defined' ) ;
294+ }
295+
296+ await flushAsyncUpdates ( ) ;
297+
190298 expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 1 ) ;
299+ expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledWith (
300+ expect . any ( String ) ,
301+ GAS_FEE_TOKEN_MOCK . tokenAddress ,
302+ ) ;
303+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledTimes ( 1 ) ;
304+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledWith ( store . dispatch ) ;
191305 } ) ;
192306} ) ;
0 commit comments