@@ -4,7 +4,10 @@ import { WalletViewSelectorsIDs } from '../../../../../../e2e/selectors/wallet/W
4
4
import StakeButton from './index' ;
5
5
import Routes from '../../../../../constants/navigation/Routes' ;
6
6
import renderWithProvider from '../../../../../util/test/renderWithProvider' ;
7
- import { MOCK_ETH_MAINNET_ASSET } from '../../__mocks__/stakeMockData' ;
7
+ import {
8
+ MOCK_ETH_MAINNET_ASSET ,
9
+ MOCK_USDC_MAINNET_ASSET ,
10
+ } from '../../__mocks__/stakeMockData' ;
8
11
import { useMetrics } from '../../../../hooks/useMetrics' ;
9
12
import { MetricsEventBuilder } from '../../../../../core/Analytics/MetricsEventBuilder' ;
10
13
import { mockNetworkState } from '../../../../../util/test/network' ;
@@ -17,9 +20,32 @@ import {
17
20
selectPooledStakingEnabledFlag ,
18
21
selectStablecoinLendingEnabledFlag ,
19
22
} from '../../../Earn/selectors/featureFlags' ;
23
+ import { TokenI } from '../../../Tokens/types' ;
20
24
21
25
const mockNavigate = jest . fn ( ) ;
22
26
27
+ const MOCK_APR_VALUES : { [ symbol : string ] : string } = {
28
+ Ethereum : '2.3' ,
29
+ USDC : '4.5' ,
30
+ USDT : '4.1' ,
31
+ DAI : '5.0' ,
32
+ } ;
33
+
34
+ jest . mock ( '../../../Earn/hooks/useEarnTokenDetails' , ( ) => ( {
35
+ useEarnTokenDetails : ( ) => ( {
36
+ getTokenWithBalanceAndApr : ( token : TokenI ) => ( {
37
+ ...token ,
38
+ apr : MOCK_APR_VALUES [ token . symbol ] ?? '0.0' ,
39
+ balanceFormatted : token . symbol === 'USDC' ? '6.84314 USDC' : '0' ,
40
+ balanceFiat : token . symbol === 'USDC' ? '$6.84' : '$0.00' ,
41
+ balanceMinimalUnit : token . symbol === 'USDC' ? '6.84314' : '0' ,
42
+ balanceFiatNumber : token . symbol === 'USDC' ? 6.84314 : 0 ,
43
+ experience :
44
+ token . symbol === 'USDC' ? 'STABLECOIN_LENDING' : 'POOLED_STAKING' ,
45
+ } ) ,
46
+ } ) ,
47
+ } ) ) ;
48
+
23
49
jest . mock ( '@react-navigation/native' , ( ) => {
24
50
const actualReactNavigation = jest . requireActual ( '@react-navigation/native' ) ;
25
51
return {
@@ -148,103 +174,127 @@ describe('StakeButton', () => {
148
174
expect ( getByTestId ( WalletViewSelectorsIDs . STAKE_BUTTON ) ) . toBeDefined ( ) ;
149
175
} ) ;
150
176
151
- it ( 'navigates to Web view when stake button is pressed and user is not eligible' , async ( ) => {
152
- ( useStakingEligibility as jest . Mock ) . mockReturnValue ( {
153
- isEligible : false ,
154
- isLoadingEligibility : false ,
155
- refreshPooledStakingEligibility : jest
156
- . fn ( )
157
- . mockResolvedValue ( { isEligible : false } ) ,
158
- error : false ,
159
- } ) ;
160
- const { getByTestId } = renderComponent ( ) ;
177
+ describe ( 'Pooled-Staking' , ( ) => {
178
+ it ( 'navigates to Web view when earn button is pressed and user is not eligible' , async ( ) => {
179
+ ( useStakingEligibility as jest . Mock ) . mockReturnValue ( {
180
+ isEligible : false ,
181
+ isLoadingEligibility : false ,
182
+ refreshPooledStakingEligibility : jest
183
+ . fn ( )
184
+ . mockResolvedValue ( { isEligible : false } ) ,
185
+ error : false ,
186
+ } ) ;
187
+ const { getByTestId } = renderComponent ( ) ;
161
188
162
- fireEvent . press ( getByTestId ( WalletViewSelectorsIDs . STAKE_BUTTON ) ) ;
163
- await waitFor ( ( ) => {
164
- expect ( mockNavigate ) . toHaveBeenCalledWith ( Routes . BROWSER . HOME , {
165
- params : {
166
- newTabUrl : `${ AppConstants . STAKE . URL } ?metamaskEntry=mobile` ,
167
- timestamp : expect . any ( Number ) ,
168
- } ,
169
- screen : Routes . BROWSER . VIEW ,
189
+ fireEvent . press ( getByTestId ( WalletViewSelectorsIDs . STAKE_BUTTON ) ) ;
190
+ await waitFor ( ( ) => {
191
+ expect ( mockNavigate ) . toHaveBeenCalledWith ( Routes . BROWSER . HOME , {
192
+ params : {
193
+ newTabUrl : `${ AppConstants . STAKE . URL } ?metamaskEntry=mobile` ,
194
+ timestamp : expect . any ( Number ) ,
195
+ } ,
196
+ screen : Routes . BROWSER . VIEW ,
197
+ } ) ;
170
198
} ) ;
171
199
} ) ;
172
- } ) ;
173
200
174
- it ( 'navigates to Stake Input screen when stake button is pressed and user is eligible' , async ( ) => {
175
- ( useStakingEligibility as jest . Mock ) . mockReturnValue ( {
176
- isEligible : true ,
177
- isLoadingEligibility : false ,
178
- refreshPooledStakingEligibility : jest
179
- . fn ( )
180
- . mockResolvedValue ( { isEligible : true } ) ,
181
- error : false ,
182
- } ) ;
183
- const { getByTestId } = renderComponent ( ) ;
201
+ it ( 'navigates to Stake Input screen when stake button is pressed and user is eligible' , async ( ) => {
202
+ ( useStakingEligibility as jest . Mock ) . mockReturnValue ( {
203
+ isEligible : true ,
204
+ isLoadingEligibility : false ,
205
+ refreshPooledStakingEligibility : jest
206
+ . fn ( )
207
+ . mockResolvedValue ( { isEligible : true } ) ,
208
+ error : false ,
209
+ } ) ;
210
+ const { getByTestId } = renderComponent ( ) ;
184
211
185
- fireEvent . press ( getByTestId ( WalletViewSelectorsIDs . STAKE_BUTTON ) ) ;
186
- await waitFor ( ( ) => {
187
- expect ( mockNavigate ) . toHaveBeenCalledWith ( 'StakeScreens' , {
188
- screen : Routes . STAKING . STAKE ,
189
- params : {
190
- token : MOCK_ETH_MAINNET_ASSET ,
191
- } ,
212
+ fireEvent . press ( getByTestId ( WalletViewSelectorsIDs . STAKE_BUTTON ) ) ;
213
+ await waitFor ( ( ) => {
214
+ expect ( mockNavigate ) . toHaveBeenCalledWith ( 'StakeScreens' , {
215
+ screen : Routes . STAKING . STAKE ,
216
+ params : {
217
+ token : MOCK_ETH_MAINNET_ASSET ,
218
+ } ,
219
+ } ) ;
192
220
} ) ;
193
221
} ) ;
194
- } ) ;
195
222
196
- it ( 'navigates to Stake Input screen when on unsupported network' , async ( ) => {
197
- // Update the mock for this specific test
198
- useStakingChain . mockImplementation ( ( ) => ( {
199
- isStakingSupportedChain : false ,
200
- } ) ) ;
201
-
202
- const UNSUPPORTED_NETWORK_STATE = {
203
- engine : {
204
- backgroundState : {
205
- NetworkController : {
206
- ...mockNetworkState ( {
207
- chainId : '0x89' , // Polygon
208
- } ) ,
209
- } ,
210
- MultichainNetworkController : {
211
- isEvmSelected : true ,
212
- selectedMultichainNetworkChainId : SolScope . Mainnet ,
213
-
214
- multichainNetworkConfigurationsByChainId : {
215
- 'bip122:000000000019d6689c085ae165831e93' : {
216
- chainId : 'bip122:000000000019d6689c085ae165831e93' ,
217
- name : 'Bitcoin Mainnet' ,
218
- nativeCurrency :
219
- 'bip122:000000000019d6689c085ae165831e93/slip44:0' ,
220
- isEvm : false ,
221
- } ,
222
- 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' : {
223
- chainId : 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' ,
224
- name : 'Solana Mainnet' ,
225
- nativeCurrency :
226
- 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v' ,
227
- isEvm : false ,
223
+ it ( 'navigates to Stake Input screen when on unsupported network' , async ( ) => {
224
+ // Update the mock for this specific test
225
+ useStakingChain . mockImplementation ( ( ) => ( {
226
+ isStakingSupportedChain : false ,
227
+ } ) ) ;
228
+
229
+ const UNSUPPORTED_NETWORK_STATE = {
230
+ engine : {
231
+ backgroundState : {
232
+ NetworkController : {
233
+ ...mockNetworkState ( {
234
+ chainId : '0x89' , // Polygon
235
+ } ) ,
236
+ } ,
237
+ MultichainNetworkController : {
238
+ isEvmSelected : true ,
239
+ selectedMultichainNetworkChainId : SolScope . Mainnet ,
240
+
241
+ multichainNetworkConfigurationsByChainId : {
242
+ 'bip122:000000000019d6689c085ae165831e93' : {
243
+ chainId : 'bip122:000000000019d6689c085ae165831e93' ,
244
+ name : 'Bitcoin Mainnet' ,
245
+ nativeCurrency :
246
+ 'bip122:000000000019d6689c085ae165831e93/slip44:0' ,
247
+ isEvm : false ,
248
+ } ,
249
+ 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' : {
250
+ chainId : 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' ,
251
+ name : 'Solana Mainnet' ,
252
+ nativeCurrency :
253
+ 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v' ,
254
+ isEvm : false ,
255
+ } ,
228
256
} ,
229
257
} ,
230
258
} ,
231
259
} ,
232
- } ,
233
- } as unknown as RootState ;
234
-
235
- const spySetActiveNetwork = jest . spyOn (
236
- Engine . context . MultichainNetworkController ,
237
- 'setActiveNetwork' ,
238
- ) ;
239
- const { getByTestId } = renderComponent ( UNSUPPORTED_NETWORK_STATE ) ;
240
- fireEvent . press ( getByTestId ( WalletViewSelectorsIDs . STAKE_BUTTON ) ) ;
241
- await waitFor ( ( ) => {
242
- expect ( spySetActiveNetwork ) . toHaveBeenCalled ( ) ;
243
- expect ( mockNavigate ) . toHaveBeenCalledWith ( 'StakeScreens' , {
244
- screen : Routes . STAKING . STAKE ,
245
- params : {
246
- token : MOCK_ETH_MAINNET_ASSET ,
260
+ } as unknown as RootState ;
261
+
262
+ const spySetActiveNetwork = jest . spyOn (
263
+ Engine . context . MultichainNetworkController ,
264
+ 'setActiveNetwork' ,
265
+ ) ;
266
+ const { getByTestId } = renderComponent ( UNSUPPORTED_NETWORK_STATE ) ;
267
+ fireEvent . press ( getByTestId ( WalletViewSelectorsIDs . STAKE_BUTTON ) ) ;
268
+ await waitFor ( ( ) => {
269
+ expect ( spySetActiveNetwork ) . toHaveBeenCalled ( ) ;
270
+ expect ( mockNavigate ) . toHaveBeenCalledWith ( 'StakeScreens' , {
271
+ screen : Routes . STAKING . STAKE ,
272
+ params : {
273
+ token : MOCK_ETH_MAINNET_ASSET ,
274
+ } ,
275
+ } ) ;
276
+ } ) ;
277
+ } ) ;
278
+ } ) ;
279
+
280
+ describe ( 'Stablecoin Lending' , ( ) => {
281
+ it ( 'navigates to Lending Input View when earn button is pressed' , async ( ) => {
282
+ const { getByTestId } = renderWithProvider (
283
+ < StakeButton asset = { MOCK_USDC_MAINNET_ASSET } /> ,
284
+ {
285
+ state : STATE_MOCK ,
247
286
} ,
287
+ ) ;
288
+
289
+ fireEvent . press ( getByTestId ( WalletViewSelectorsIDs . STAKE_BUTTON ) ) ;
290
+
291
+ await waitFor ( ( ) => {
292
+ expect ( mockNavigate ) . toHaveBeenCalledWith ( 'StakeScreens' , {
293
+ screen : Routes . STAKING . STAKE ,
294
+ params : {
295
+ token : MOCK_USDC_MAINNET_ASSET ,
296
+ } ,
297
+ } ) ;
248
298
} ) ;
249
299
} ) ;
250
300
} ) ;
0 commit comments