import { render } from '@testing-library/react-native'
import BigNumber from 'bignumber.js'
import React from 'react'
import { Provider } from 'react-redux'
import SwapTransactionDetails from 'src/swap/SwapTransactionDetails'
import { AppFeeAmount, SwapFeeAmount } from 'src/swap/types'
import { createMockStore } from 'test/utils'
import {
mockCeloTokenBalance,
mockCusdTokenBalance,
mockCusdTokenId,
mockTokenBalances,
} from 'test/values'
const defaultProps = {
feeInfoBottomSheetRef: { current: null },
slippageInfoBottomSheetRef: { current: null },
exchangeRateInfoBottomSheetRef: { current: null },
estimatedDurationBottomSheetRef: { current: null },
slippagePercentage: '0.5',
fetchingSwapQuote: false,
fromToken: {
...mockTokenBalances[mockCusdTokenId],
lastKnownPriceUsd: null,
balance: BigNumber('10'),
priceUsd: BigNumber('1'),
},
toToken: mockCeloTokenBalance,
exchangeRatePrice: '0.5837',
}
describe('SwapTransactionDetails', () => {
it('should render the correct exchange rate and estimated value', () => {
const { getByText, getByTestId } = render(
)
expect(getByText('swapScreen.transactionDetails.exchangeRate')).toBeTruthy()
expect(getByTestId('SwapTransactionDetails/ExchangeRate')).toHaveTextContent(
'1 cUSD ≈ 0.58370 CELO'
)
expect(getByTestId('SwapTransactionDetails/ExchangeRate/MoreInfo/Icon')).toBeTruthy()
expect(getByTestId('SwapTransactionDetails/ExchangeRate/MoreInfo')).not.toBeDisabled()
})
it('should render correctly with estimated duration', () => {
const { getByText } = render(
)
expect(getByText('swapScreen.transactionDetails.estimatedTransactionTime')).toBeTruthy()
expect(
getByText('swapScreen.transactionDetails.estimatedTransactionTimeInMinutes, {"minutes":14}')
).toBeTruthy()
})
describe('total fees', () => {
const mockNetworkFee: SwapFeeAmount = {
amount: new BigNumber(0.01),
token: mockCusdTokenBalance,
maxAmount: new BigNumber(0.02),
}
const mockCrossChainFee: SwapFeeAmount = {
amount: new BigNumber(1.3),
token: mockCeloTokenBalance,
maxAmount: new BigNumber(1.7),
}
const mockAppFee: AppFeeAmount = {
amount: new BigNumber(0.07),
token: mockCeloTokenBalance,
percentage: new BigNumber(0.6),
}
// the fee components are calculated from the mock fee objects. the
// calculation is amount * token price usd * local currency exchange rate
// (1.33).
// expectedNetworkFeeInLocalCurrency = 0.01 * 1.001 * 1.33 = 0.0133133
// expectedCrossChainFeeInLocalCurrency = 1.3 * 0.5 * 1.33 = 0.8645
// expectedAppFeeInLocalCurrency = 0.07 * 0.5 * 1.33 = 0.04655
it.each`
feeName | feeValue
${'networkFee'} | ${{ ...mockNetworkFee, token: undefined }}
${'appFee'} | ${{ ...mockAppFee, token: undefined }}
${'crossChainFee'} | ${{ ...mockCrossChainFee, token: undefined }}
`(
'should render a fallback message if the $feeName token info is missing',
({ feeName, feeValue }) => {
const testProps = { [feeName]: feeValue }
const { getByTestId } = render(
)
expect(getByTestId('SwapTransactionDetails/Fees')).toHaveTextContent(
'swapScreen.transactionDetails.feesCalculationError'
)
}
)
it('should render the total fees in fiat', () => {
const { getByTestId } = render(
)
expect(getByTestId('SwapTransactionDetails/Fees')).toHaveTextContent('≈ ₱0.92')
})
it('should render the total fees with fiat and token values when priceUsd is missing', () => {
const { getByTestId } = render(
)
expect(getByTestId('SwapTransactionDetails/Fees')).toHaveTextContent('≈ ₱0.013 + 0.07 CELO')
})
it('should render the total fees in only token values when all priceUsd is missing', () => {
const { getByTestId } = render(
)
expect(getByTestId('SwapTransactionDetails/Fees')).toHaveTextContent(
'≈ 1.37 CELO + 0.01 cUSD'
)
})
it.each`
feeName | expectedTotalFee
${'appFee'} | ${`≈ ₱0.88`}
${'crossChainFee'} | ${`≈ ₱0.06`}
`(
'should render the total fees when the $feeName is undefined',
({ feeName, expectedTotalFee }) => {
const testProps = { [feeName]: undefined }
const { getByTestId } = render(
)
expect(getByTestId('SwapTransactionDetails/Fees')).toHaveTextContent(expectedTotalFee)
}
)
})
})