import { fireEvent, render } from '@testing-library/react-native'
import BigNumber from 'bignumber.js'
import React from 'react'
import AppAnalytics from 'src/analytics/AppAnalytics'
import { AssetsEvents } from 'src/analytics/Events'
import SwapArrows from 'src/icons/SwapArrows'
import QuickActionsAdd from 'src/icons/quick-actions/Add'
import QuickActionsSend from 'src/icons/quick-actions/Send'
import TokenDetailsMoreActions from 'src/tokens/TokenDetailsMoreActions'
import { StoredTokenBalance, TokenBalance } from 'src/tokens/slice'
import { TokenAction, TokenActionName } from 'src/tokens/types'
import { NetworkId } from 'src/transactions/types'
import { mockCeloAddress, mockCeloTokenId } from 'test/values'
const mockStoredCeloTokenBalance: StoredTokenBalance = {
tokenId: mockCeloTokenId,
priceUsd: '1.16',
address: mockCeloAddress,
isNative: true,
symbol: 'CELO',
imageUrl:
'https://raw.githubusercontent.com/ubeswap/default-token-list/master/assets/asset_CELO.png',
name: 'Celo',
decimals: 18,
balance: '5',
isFeeCurrency: true,
canTransferWithComment: true,
priceFetchedAt: Date.now(),
networkId: NetworkId['celo-alfajores'],
isSwappable: true,
isCashInEligible: true,
isCashOutEligible: true,
}
const mockCeloBalance: TokenBalance = {
...mockStoredCeloTokenBalance,
balance: new BigNumber(mockStoredCeloTokenBalance.balance!),
lastKnownPriceUsd: new BigNumber(mockStoredCeloTokenBalance.priceUsd!),
priceUsd: new BigNumber(mockStoredCeloTokenBalance.priceUsd!),
}
const mockActions: TokenAction[] = [
{
name: TokenActionName.Send,
title: 'tokenDetails.actions.send',
details: 'tokenDetails.actions.sendDetails',
iconComponent: QuickActionsSend,
onPress: jest.fn(),
visible: true,
},
{
name: TokenActionName.Swap,
title: 'tokenDetails.actions.swap',
details: 'tokenDetails.actions.swapDetails',
iconComponent: SwapArrows,
onPress: jest.fn(),
visible: true,
},
{
name: TokenActionName.Add,
title: 'tokenDetails.actions.add',
details: 'tokenDetails.actions.addDetails',
iconComponent: QuickActionsAdd,
onPress: jest.fn(),
visible: true,
},
{
name: TokenActionName.Withdraw,
title: 'tokenDetails.actions.withdraw',
details: 'tokenDetails.actions.withdrawDetails',
iconComponent: QuickActionsSend,
onPress: jest.fn(),
visible: true,
},
]
describe('TokenDetailsMoreActions', () => {
it('Renders correct actions', () => {
const { getByText } = render(
)
expect(getByText('tokenDetails.actions.send')).toBeTruthy()
expect(getByText('tokenDetails.actions.swap')).toBeTruthy()
expect(getByText('tokenDetails.actions.add')).toBeTruthy()
expect(getByText('tokenDetails.actions.withdraw')).toBeTruthy()
})
it.each(mockActions)(
'triggers the correct analytics and navigation for $buttonText',
async ({ name, title, onPress }) => {
const { getByText } = render(
)
fireEvent.press(getByText(title))
expect(AppAnalytics.track).toHaveBeenCalledWith(
AssetsEvents.tap_token_details_bottom_sheet_action,
{
action: name,
address: mockCeloAddress,
balanceUsd: 5.8,
networkId: mockCeloBalance.networkId,
symbol: mockCeloBalance.symbol,
tokenId: mockCeloTokenId,
}
)
expect(onPress).toHaveBeenCalled()
}
)
})