import { fireEvent, render, within } from '@testing-library/react-native'
import React from 'react'
import { Provider } from 'react-redux'
import AppAnalytics from 'src/analytics/AppAnalytics'
import { EarnEvents } from 'src/analytics/Events'
import { navigate } from 'src/navigator/NavigationService'
import { Screens } from 'src/navigator/Screens'
import { getFeatureGate } from 'src/statsig'
import { StatsigFeatureGates } from 'src/statsig/types'
import EarnFeedItem from 'src/transactions/feed/EarnFeedItem'
import { NetworkId, TokenTransactionTypeV2 } from 'src/transactions/types'
import { createMockStore } from 'test/utils'
import {
mockAaveArbUsdcAddress,
mockAaveArbUsdcTokenId,
mockArbArbTokenId,
mockArbUsdcTokenId,
mockEarnClaimRewardTransaction,
mockEarnDepositTransaction,
mockEarnSwapDeposit,
mockEarnWithdrawTransaction,
} from 'test/values'
jest.mock('src/statsig')
jest
.mocked(getFeatureGate)
.mockImplementation((featureGateName) => featureGateName === StatsigFeatureGates.SHOW_POSITIONS)
const store = createMockStore({
tokens: {
tokenBalances: {
[mockArbUsdcTokenId]: {
tokenId: mockArbUsdcTokenId,
symbol: 'USDC',
priceUsd: '1',
priceFetchedAt: Date.now(),
networkId: NetworkId['arbitrum-sepolia'],
},
[mockArbArbTokenId]: {
tokenId: mockArbArbTokenId,
symbol: 'ARB',
priceUsd: '0.9898',
priceFetchedAt: Date.now(),
networkId: NetworkId['arbitrum-sepolia'],
},
[mockAaveArbUsdcTokenId]: {
networkId: NetworkId['arbitrum-sepolia'],
address: mockAaveArbUsdcAddress,
tokenId: mockAaveArbUsdcTokenId,
symbol: 'aArbSepUSDC',
priceUsd: '1',
priceFetchedAt: Date.now(),
},
},
},
positions: {
positions: [
{
type: 'app-token',
networkId: NetworkId['arbitrum-sepolia'],
address: '0x460b97bd498e1157530aeb3086301d5225b91216',
tokenId: 'arbitrum-sepolia:0x460b97bd498e1157530aeb3086301d5225b91216',
positionId: 'arbitrum-sepolia:0x460b97bd498e1157530aeb3086301d5225b91216',
appId: 'aave',
appName: 'Aave',
symbol: 'aArbSepUSDC',
decimals: 6,
displayProps: {
title: 'USDC',
description: 'Supplied (APY: 1.92%)',
imageUrl: 'https://raw.githubusercontent.com/valora-inc/dapp-list/main/assets/aave.png',
},
dataProps: {
yieldRates: [
{
percentage: 1.9194202601763743,
label: 'Earnings APY',
tokenId: 'arbitrum-sepolia:0x75faf114eafb1bdbe2f0316df893fd58ce46aa4d',
},
],
earningItems: [],
depositTokenId: 'arbitrum-sepolia:0x75faf114eafb1bdbe2f0316df893fd58ce46aa4d',
withdrawTokenId: 'arbitrum-sepolia:0x460b97bd498e1157530aeb3086301d5225b91216',
},
tokens: [
{
tokenId: 'arbitrum-sepolia:0x75faf114eafb1bdbe2f0316df893fd58ce46aa4d',
networkId: NetworkId['arbitrum-sepolia'],
address: '0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d',
symbol: 'USDC',
decimals: 6,
priceUsd: '0',
type: 'base-token',
balance: '0',
},
],
pricePerShare: ['1'],
priceUsd: '0.999',
balance: '10',
supply: '190288.768509',
availableShortcutIds: ['deposit', 'withdraw'],
},
],
earnPositionIds: ['arbitrum-sepolia:0x460b97bd498e1157530aeb3086301d5225b91216'],
},
})
describe.each([
{
type: TokenTransactionTypeV2.EarnWithdraw,
transaction: mockEarnWithdrawTransaction,
expectedTitle: 'earnFlow.transactionFeed.earnWithdrawTitle',
expectedSubTitle: 'earnFlow.transactionFeed.earnWithdrawSubtitle, {"providerName":"Aave"}',
expectedTotal: '+1.00 USDC',
expectedTotalLocal: '₱1.33',
},
{
type: TokenTransactionTypeV2.EarnDeposit,
transaction: mockEarnDepositTransaction,
expectedTitle: 'earnFlow.transactionFeed.earnDepositTitle',
expectedSubTitle: 'earnFlow.transactionFeed.earnDepositSubtitle, {"providerName":"Aave"}',
expectedTotal: '-10.00 USDC',
expectedTotalLocal: '₱13.30',
},
{
type: TokenTransactionTypeV2.EarnSwapDeposit,
transaction: mockEarnSwapDeposit,
expectedTitle: 'earnFlow.transactionFeed.earnDepositTitle',
expectedSubTitle: 'earnFlow.transactionFeed.earnDepositSubtitle, {"providerName":"Aave"}',
expectedTotal: '-10.00 USDC',
expectedTotalLocal: '₱13.30',
},
{
type: TokenTransactionTypeV2.EarnClaimReward,
transaction: mockEarnClaimRewardTransaction,
expectedTitle: 'earnFlow.transactionFeed.earnClaimTitle',
expectedSubTitle: 'earnFlow.transactionFeed.earnClaimSubtitle, {"providerName":"Aave"}',
expectedTotal: '+1.50 ARB',
expectedTotalLocal: '₱1.97',
},
])(
`$type`,
({ type, transaction, expectedTitle, expectedSubTitle, expectedTotal, expectedTotalLocal }) => {
beforeEach(() => {
jest.clearAllMocks()
})
it('Should render correctly', () => {
const { getByText, getByTestId } = render(
)
expect(getByText(expectedTitle)).toBeTruthy()
expect(getByText(expectedSubTitle)).toBeTruthy()
expect(
within(getByTestId(`EarnFeedItem/${type}-amount-crypto`)).getByText(expectedTotal)
).toBeTruthy()
expect(
within(getByTestId(`EarnFeedItem/${type}-amount-local`)).getByText(expectedTotalLocal)
).toBeTruthy()
})
it('Should navigate correctly on tap', () => {
const { getByTestId } = render(
)
fireEvent.press(getByTestId(`EarnFeedItem/${transaction.transactionHash}`))
expect(navigate).toHaveBeenCalledWith(Screens.TransactionDetailsScreen, { transaction })
})
it('Should fire analytic event on tap', () => {
const { getByTestId } = render(
)
fireEvent.press(getByTestId(`EarnFeedItem/${transaction.transactionHash}`))
expect(AppAnalytics.track).toHaveBeenCalledWith(EarnEvents.earn_feed_item_select, {
origin: type,
})
})
}
)