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 { HomeEvents } 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 ClaimRewardFeedItem from 'src/transactions/feed/ClaimRewardFeedItem'
import { NetworkId } from 'src/transactions/types'
import { createMockStore } from 'test/utils'
import {
mockAaveArbUsdcAddress,
mockAaveArbUsdcTokenId,
mockArbArbTokenId,
mockArbUsdcTokenId,
mockClaimRewardTransaction,
} 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('ClaimRewardFeedItem', () => {
beforeEach(() => {
jest.clearAllMocks()
})
it('should render correctly', () => {
const { getByText, getByTestId } = render(
)
expect(getByText('transactionFeed.claimRewardTitle')).toBeTruthy()
expect(getByText('transactionFeed.claimRewardSubtitle, {"txAppName":"Aave"}')).toBeTruthy()
expect(
within(getByTestId('ClaimRewardFeedItem/amount-crypto')).getByText('+1.50 ARB')
).toBeTruthy()
expect(within(getByTestId('ClaimRewardFeedItem/amount-local')).getByText('₱1.97')).toBeTruthy()
})
it('should display when app name is not available', () => {
const { getByText } = render(
)
expect(getByText('transactionFeed.claimRewardSubtitle, {"context":"noTxAppName"}')).toBeTruthy()
})
it('should navigate correctly on tap', () => {
const { getByTestId } = render(
)
fireEvent.press(
getByTestId(`ClaimRewardFeedItem/${mockClaimRewardTransaction.transactionHash}`)
)
expect(navigate).toHaveBeenCalledWith(Screens.TransactionDetailsScreen, {
transaction: mockClaimRewardTransaction,
})
})
it('should fire analytic event on tap', () => {
const { getByTestId } = render(
)
fireEvent.press(
getByTestId(`ClaimRewardFeedItem/${mockClaimRewardTransaction.transactionHash}`)
)
expect(AppAnalytics.track).toHaveBeenCalledWith(HomeEvents.transaction_feed_item_select, {
itemType: mockClaimRewardTransaction.type,
})
})
})