import { render } from '@testing-library/react-native' import BigNumber from 'bignumber.js' import React from 'react' import { Provider } from 'react-redux' import FeeInfoBottomSheet from 'src/swap/FeeInfoBottomSheet' import { createMockStore } from 'test/utils' import { mockCeloTokenBalance, mockCeloTokenId, mockCusdTokenBalance, mockCusdTokenId, mockTokenBalances, } from 'test/values' const mockNetworkFee = { amount: new BigNumber(0.01), token: mockCusdTokenBalance, maxAmount: new BigNumber(0.02), } const mockCrossChainFee = { amount: new BigNumber(1.3), token: mockCeloTokenBalance, maxAmount: new BigNumber(1.7), } const mockAppFee = { 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 describe('FeeInfoBottomSheet', () => { it('should display the expected fees information in both fiat and token units', () => { const { getByText, getByTestId } = render( ) expect(getByText('swapScreen.transactionDetails.fees')).toBeTruthy() expect(getByText('swapScreen.transactionDetails.feesBreakdown')).toBeTruthy() expect(getByText('swapScreen.transactionDetails.feesMoreInfoLabel')).toBeTruthy() expect( getByText( 'swapScreen.transactionDetails.feesInfo, {"context":"crossChainWithAppFee","appFeePercentage":"0.6"}' ) ).toBeTruthy() expect(getByText('swapScreen.transactionDetails.estimatedNetworkFee')).toBeTruthy() expect(getByTestId('SwapScreen/FeeInfoBottomSheet/EstimatedNetworkFee')).toHaveTextContent( 'swapScreen.transactionDetails.feeAmount, {"localCurrencySymbol":"₱","feeAmountInLocalCurrency":"0.013","tokenAmount":"0.01","tokenSymbol":"cUSD"}' ) expect(getByText('swapScreen.transactionDetails.maxNetworkFee')).toBeTruthy() expect(getByTestId('SwapScreen/FeeInfoBottomSheet/MaxNetworkFee')).toHaveTextContent( 'swapScreen.transactionDetails.feeAmount, {"localCurrencySymbol":"₱","feeAmountInLocalCurrency":"0.027","tokenAmount":"0.02","tokenSymbol":"cUSD"}' ) expect(getByText('swapScreen.transactionDetails.appFee')).toBeTruthy() expect(getByTestId('SwapScreen/FeeInfoBottomSheet/AppFee')).toHaveTextContent( 'swapScreen.transactionDetails.feeAmount, {"localCurrencySymbol":"₱","feeAmountInLocalCurrency":"0.047","tokenAmount":"0.07","tokenSymbol":"CELO"}' ) expect(getByText('swapScreen.transactionDetails.estimatedCrossChainFee')).toBeTruthy() expect(getByTestId('SwapScreen/FeeInfoBottomSheet/EstimatedCrossChainFee')).toHaveTextContent( 'swapScreen.transactionDetails.feeAmount, {"localCurrencySymbol":"₱","feeAmountInLocalCurrency":"0.86","tokenAmount":"1.30","tokenSymbol":"CELO"}' ) expect(getByText('swapScreen.transactionDetails.maxCrossChainFee')).toBeTruthy() expect(getByTestId('SwapScreen/FeeInfoBottomSheet/MaxCrossChainFee')).toHaveTextContent( 'swapScreen.transactionDetails.feeAmount, {"localCurrencySymbol":"₱","feeAmountInLocalCurrency":"1.13","tokenAmount":"1.70","tokenSymbol":"CELO"}' ) }) it('should display the expected fees information in token units if priceUsd is unavailable', () => { const { getByTestId } = render( ) expect(getByTestId('SwapScreen/FeeInfoBottomSheet/EstimatedNetworkFee')).toHaveTextContent( 'swapScreen.transactionDetails.feeAmount, {"context":"noFiatPrice","localCurrencySymbol":"₱","tokenAmount":"0.01","tokenSymbol":"cUSD"}' ) expect(getByTestId('SwapScreen/FeeInfoBottomSheet/MaxNetworkFee')).toHaveTextContent( 'swapScreen.transactionDetails.feeAmount, {"context":"noFiatPrice","localCurrencySymbol":"₱","tokenAmount":"0.02","tokenSymbol":"cUSD"}' ) }) it('should display a message if the app fee is 0', () => { const { getByText, getByTestId } = render( ) expect(getByText('swapScreen.transactionDetails.appFee')).toBeTruthy() expect(getByTestId('SwapScreen/FeeInfoBottomSheet/AppFee')).toHaveTextContent( 'swapScreen.transactionDetails.swapFeeWaived' ) }) it('should display unknown values if the token info is missing', () => { const { getByTestId } = render( ) expect(getByTestId('SwapScreen/FeeInfoBottomSheet/EstimatedNetworkFee')).toHaveTextContent( 'unknown' ) expect(getByTestId('SwapScreen/FeeInfoBottomSheet/MaxNetworkFee')).toHaveTextContent('unknown') }) it('should display correctly during quote refresh', () => { const { getByTestId } = render( ) expect(getByTestId('SwapScreen/FeeInfoBottomSheet/EstimatedNetworkFee')).toHaveTextContent( 'loading' ) expect(getByTestId('SwapScreen/FeeInfoBottomSheet/MaxNetworkFee')).toHaveTextContent('loading') expect(getByTestId('SwapScreen/FeeInfoBottomSheet/AppFee')).toHaveTextContent('loading') expect(getByTestId('SwapScreen/FeeInfoBottomSheet/EstimatedCrossChainFee')).toHaveTextContent( 'loading' ) expect(getByTestId('SwapScreen/FeeInfoBottomSheet/MaxCrossChainFee')).toHaveTextContent( 'loading' ) }) })