import { fireEvent, render } from '@testing-library/react-native'
import * as React from 'react'
import { Provider } from 'react-redux'
import AppAnalytics from 'src/analytics/AppAnalytics'
import { HomeEvents } from 'src/analytics/Events'
import DepositOrWithdrawFeedItem from 'src/transactions/feed/DepositOrWithdrawFeedItem'
import { NetworkId, TokenTransactionTypeV2, TransactionStatus } from 'src/transactions/types'
import { createMockStore } from 'test/utils'
import { mockCeloTokenId, mockCusdTokenId, mockUSDCTokenId } from 'test/values'
describe('DepositOrWithdrawFeedItem', () => {
const store = createMockStore()
const depositTransaction = {
type: TokenTransactionTypeV2.Deposit as const,
networkId: NetworkId['celo-mainnet'],
timestamp: 1234567890,
block: '123456',
transactionHash: '0x123',
fees: [],
appName: 'Some Dapp',
inAmount: {
value: '50',
tokenId: mockCeloTokenId,
},
outAmount: {
value: '100',
tokenId: mockCusdTokenId,
},
status: TransactionStatus.Complete,
}
const withdrawTransaction = {
...depositTransaction,
type: TokenTransactionTypeV2.Withdraw as const,
}
const crossChainDepositTransaction = {
...depositTransaction,
type: TokenTransactionTypeV2.CrossChainDeposit as const,
swap: {
inAmount: {
value: '100',
tokenId: mockCusdTokenId,
},
outAmount: {
value: '100',
tokenId: mockUSDCTokenId,
},
},
}
it('renders deposit correctly', () => {
const { getByText, getByTestId } = render(
)
expect(getByText('transactionFeed.depositTitle')).toBeTruthy()
expect(getByText('transactionFeed.depositSubtitle, {"txAppName":"Some Dapp"}')).toBeTruthy()
expect(getByTestId('DepositOrWithdrawFeedItem/DEPOSIT-amount-crypto')).toBeTruthy()
expect(getByTestId('DepositOrWithdrawFeedItem/DEPOSIT-amount-local')).toBeTruthy()
expect(getByTestId('DepositOrWithdrawFeedItem/DEPOSIT-amount-crypto')).toHaveTextContent(
'-100.00 cUSD'
)
})
it('renders withdraw correctly', () => {
const { getByText, getByTestId } = render(
)
expect(getByText('transactionFeed.withdrawTitle')).toBeTruthy()
expect(getByText('transactionFeed.withdrawSubtitle, {"txAppName":"Some Dapp"}')).toBeTruthy()
expect(getByTestId('DepositOrWithdrawFeedItem/WITHDRAW-amount-crypto')).toBeTruthy()
expect(getByTestId('DepositOrWithdrawFeedItem/WITHDRAW-amount-local')).toBeTruthy()
expect(getByTestId('DepositOrWithdrawFeedItem/WITHDRAW-amount-crypto')).toHaveTextContent(
'+50.00 CELO'
)
})
it('renders cross chain deposit correctly', () => {
const { getByText, getByTestId } = render(
)
expect(getByText('transactionFeed.depositTitle')).toBeTruthy()
expect(getByText('transactionFeed.depositSubtitle, {"txAppName":"Some Dapp"}')).toBeTruthy()
expect(getByTestId('DepositOrWithdrawFeedItem/CROSS_CHAIN_DEPOSIT-amount-crypto')).toBeTruthy()
expect(getByTestId('DepositOrWithdrawFeedItem/CROSS_CHAIN_DEPOSIT-amount-local')).toBeTruthy()
expect(
getByTestId('DepositOrWithdrawFeedItem/CROSS_CHAIN_DEPOSIT-amount-crypto')
).toHaveTextContent('-100.00 cUSD')
})
it('displays app name when available', () => {
const { getByText } = render(
)
expect(getByText('transactionFeed.depositSubtitle, {"txAppName":"Some Dapp"}')).toBeTruthy()
})
it('displays when app name is not available', () => {
const { queryByText } = render(
)
expect(queryByText('transactionFeed.depositSubtitle, {"context":"noTxAppName"}')).toBeTruthy()
})
it('should fire analytic event on tap', () => {
const { getByTestId } = render(
)
fireEvent.press(getByTestId(`DepositOrWithdrawFeedItem/${depositTransaction.transactionHash}`))
expect(AppAnalytics.track).toHaveBeenCalledWith(HomeEvents.transaction_feed_item_select, {
itemType: depositTransaction.type,
})
})
})