@@ -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,48 @@ 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 ( ) ;
7281
7382 expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 1 ) ;
7483 expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledWith (
7584 expect . any ( String ) ,
7685 GAS_FEE_TOKEN_MOCK . tokenAddress ,
7786 ) ;
87+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledTimes ( 1 ) ;
88+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledWith ( store ! . dispatch ) ;
7889 } ) ;
7990
80- it ( 'does not select first gas fee token if gas fee token already selected' , ( ) => {
91+ it ( 'does not select first gas fee token if gas fee token already selected' , async ( ) => {
8192 runHook ( { selectedGasFeeToken : GAS_FEE_TOKEN_MOCK . tokenAddress } ) ;
93+
94+ await flushAsyncUpdates ( ) ;
95+
8296 expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 0 ) ;
97+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledTimes ( 0 ) ;
8398 } ) ;
8499
85- it ( 'does not select first gas fee token if no gas fee tokens' , ( ) => {
100+ it ( 'does not select first gas fee token if no gas fee tokens' , async ( ) => {
86101 runHook ( { gasFeeTokens : [ ] } ) ;
102+
103+ await flushAsyncUpdates ( ) ;
104+
87105 expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 0 ) ;
106+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledTimes ( 0 ) ;
88107 } ) ;
89108
90- it ( 'does not select first gas fee token if not first load' , ( ) => {
91- const { rerender, state } = runHook ( {
109+ it ( 'selects first gas fee token on rerender when selection becomes eligible' , async ( ) => {
110+ const { rerender, state, store } = runHook ( {
92111 selectedGasFeeToken : GAS_FEE_TOKEN_MOCK . tokenAddress ,
93112 } ) ;
94113
114+ await flushAsyncUpdates ( ) ;
115+
116+ expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 0 ) ;
117+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledTimes ( 0 ) ;
118+
95119 const transactionMeta = state . metamask
96120 . transactions [ 0 ] as unknown as TransactionMeta ;
97121
@@ -101,41 +125,92 @@ describe('useAutomaticGasFeeTokenSelect', () => {
101125
102126 rerender ( ) ;
103127
104- expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 0 ) ;
128+ await flushAsyncUpdates ( ) ;
129+
130+ expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 1 ) ;
131+ expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledWith (
132+ expect . any ( String ) ,
133+ GAS_FEE_TOKEN_MOCK . tokenAddress ,
134+ ) ;
135+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledTimes ( 1 ) ;
136+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledWith ( store ! . dispatch ) ;
105137 } ) ;
106138
107- it ( 'does not select first gas fee token if gasless not supported' , ( ) => {
139+ it ( 'does not select first gas fee token if gasless not supported' , async ( ) => {
108140 useIsGaslessSupportedMock . mockReturnValue ( {
109141 isSupported : false ,
110142 isSmartTransaction : false ,
111143 } ) ;
112144
113145 runHook ( ) ;
114146
147+ await flushAsyncUpdates ( ) ;
148+
115149 expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 0 ) ;
150+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledTimes ( 0 ) ;
116151 } ) ;
117152
118- it ( 'does not select first gas fee token if sufficient balance' , ( ) => {
153+ it ( 'does not select first gas fee token if sufficient balance' , async ( ) => {
119154 useInsufficientBalanceAlertsMock . mockReturnValue ( [ ] ) ;
120155
121156 runHook ( ) ;
122157
158+ await flushAsyncUpdates ( ) ;
159+
160+ expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 0 ) ;
161+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledTimes ( 0 ) ;
162+ } ) ;
163+
164+ it ( 'selects first gas fee token when insufficient balance appears after first render' , async ( ) => {
165+ let alerts : Alert [ ] = [ ] ;
166+ useInsufficientBalanceAlertsMock . mockImplementation ( ( ) => alerts ) ;
167+
168+ const { rerender, store } = runHook ( {
169+ selectedGasFeeToken : undefined ,
170+ } ) ;
171+
172+ await flushAsyncUpdates ( ) ;
173+
123174 expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 0 ) ;
175+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledTimes ( 0 ) ;
176+
177+ alerts = [ { } as Alert ] ;
178+
179+ rerender ( ) ;
180+
181+ await flushAsyncUpdates ( ) ;
182+
183+ expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 1 ) ;
184+ expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledWith (
185+ expect . any ( String ) ,
186+ GAS_FEE_TOKEN_MOCK . tokenAddress ,
187+ ) ;
188+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledTimes ( 1 ) ;
189+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledWith ( store ! . dispatch ) ;
124190 } ) ;
125191
126- it ( 'does not select first gas fee token after firstCheck is set to false' , ( ) => {
127- const { rerender, state } = runHook ( ) ;
192+ it ( 'does not select first gas fee token after firstCheck is set to false' , async ( ) => {
193+ const { rerender, state, store } = runHook ( ) ;
194+
195+ await flushAsyncUpdates ( ) ;
196+
128197 // Simulate a rerender with new state that would otherwise trigger selection
129198 act ( ( ) => {
130199 (
131200 state . metamask . transactions [ 0 ] as unknown as TransactionMeta
132201 ) . selectedGasFeeToken = undefined ;
133202 } ) ;
203+
134204 rerender ( ) ;
205+
206+ await flushAsyncUpdates ( ) ;
207+
135208 expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 1 ) ; // Only first run
209+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledTimes ( 1 ) ;
210+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledWith ( store ! . dispatch ) ;
136211 } ) ;
137212
138- it ( 'does not select if transactionId is falsy' , ( ) => {
213+ it ( 'does not select if transactionId is falsy' , async ( ) => {
139214 const state = getMockConfirmStateForTransaction (
140215 genUnapprovedContractInteractionConfirmation ( {
141216 gasFeeTokens : [ GAS_FEE_TOKEN_MOCK ] ,
@@ -145,15 +220,23 @@ describe('useAutomaticGasFeeTokenSelect', () => {
145220 // Remove transactionId
146221 state . metamask . transactions = [ ] ;
147222 renderHookWithConfirmContextProvider ( useAutomaticGasFeeTokenSelect , state ) ;
223+
224+ await flushAsyncUpdates ( ) ;
225+
148226 expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 0 ) ;
227+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledTimes ( 0 ) ;
149228 } ) ;
150229
151- it ( 'does not select if gasFeeTokens is falsy' , ( ) => {
230+ it ( 'does not select if gasFeeTokens is falsy' , async ( ) => {
152231 runHook ( { gasFeeTokens : [ ] } ) ;
232+
233+ await flushAsyncUpdates ( ) ;
234+
153235 expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 0 ) ;
236+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledTimes ( 0 ) ;
154237 } ) ;
155238
156- it ( 'does not select first gas fee token if 7702 and future native token' , ( ) => {
239+ it ( 'does not select first gas fee token if 7702 and future native token' , async ( ) => {
157240 useIsGaslessSupportedMock . mockReturnValue ( {
158241 isSupported : true ,
159242 isSmartTransaction : false ,
@@ -168,16 +251,19 @@ describe('useAutomaticGasFeeTokenSelect', () => {
168251 ] ,
169252 } ) ;
170253
254+ await flushAsyncUpdates ( ) ;
255+
171256 expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 0 ) ;
257+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledTimes ( 0 ) ;
172258 } ) ;
173259
174- it ( 'selects second gas fee token if 7702 and future native token' , ( ) => {
260+ it ( 'selects second gas fee token if 7702 and future native token' , async ( ) => {
175261 useIsGaslessSupportedMock . mockReturnValue ( {
176262 isSupported : true ,
177263 isSmartTransaction : false ,
178264 } ) ;
179265
180- runHook ( {
266+ const { store } = runHook ( {
181267 gasFeeTokens : [
182268 {
183269 ...GAS_FEE_TOKEN_MOCK ,
@@ -187,6 +273,14 @@ describe('useAutomaticGasFeeTokenSelect', () => {
187273 ] ,
188274 } ) ;
189275
276+ await flushAsyncUpdates ( ) ;
277+
190278 expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledTimes ( 1 ) ;
279+ expect ( updateSelectedGasFeeTokenMock ) . toHaveBeenCalledWith (
280+ expect . any ( String ) ,
281+ GAS_FEE_TOKEN_MOCK . tokenAddress ,
282+ ) ;
283+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledTimes ( 1 ) ;
284+ expect ( forceUpdateMetamaskStateMock ) . toHaveBeenCalledWith ( store ! . dispatch ) ;
191285 } ) ;
192286} ) ;
0 commit comments