import { fireEvent, render } from '@testing-library/react-native'
import React from 'react'
import { Provider } from 'react-redux'
import { JumpstartEvents } from 'src/analytics/Events'
import AppAnalytics from 'src/analytics/AppAnalytics'
import JumpstartSendConfirmation from 'src/jumpstart/JumpstartSendConfirmation'
import { depositErrorDismissed, depositTransactionStarted } from 'src/jumpstart/slice'
import { navigate } from 'src/navigator/NavigationService'
import { Screens } from 'src/navigator/Screens'
import { getSerializablePreparedTransactions } from 'src/viem/preparedTransactionSerialization'
import MockedNavigator from 'test/MockedNavigator'
import { createMockStore } from 'test/utils'
import { mockCusdTokenBalance, mockCusdTokenId, mockTokenBalances } from 'test/values'
const serializablePreparedTransactions = getSerializablePreparedTransactions([
{
from: '0xa',
to: '0xb',
value: BigInt(0),
data: '0x0',
gas: BigInt(59_480),
},
{
from: '0xa',
to: '0xc',
value: BigInt(0),
data: '0x0',
gas: BigInt(1_325_000),
},
])
const mockBeneficiaryAddress = '0x2CEc3C5e83eE37261F9f9BB050B2Fbf59d13eEc0'
describe('JumpstartSendConfirmation', () => {
beforeEach(() => {
jest.clearAllMocks()
})
it('should render the correct information', () => {
const { getByText } = render(
)
expect(getByText('jumpstartSendConfirmationScreen.title')).toBeTruthy()
expect(getByText('12.35 cUSD')).toBeTruthy() // correct rounding
expect(getByText('₱16.42')).toBeTruthy() // local amount parsedAmount (12.345) *exchangeRate (1.33)
expect(getByText('jumpstartSendConfirmationScreen.info')).toBeTruthy()
expect(getByText('jumpstartSendConfirmationScreen.confirmButton')).toBeEnabled()
})
it('should execute the correct actions on press continue', () => {
const store = createMockStore({
tokens: {
tokenBalances: mockTokenBalances,
},
})
const { getByText } = render(
)
fireEvent.press(getByText('jumpstartSendConfirmationScreen.confirmButton'))
expect(AppAnalytics.track).toHaveBeenCalledWith(JumpstartEvents.jumpstart_send_confirm, {
amountInUsd: '12.36',
localCurrency: 'PHP',
localCurrencyExchangeRate: '1.33',
networkId: mockCusdTokenBalance.networkId,
tokenAmount: '12.345',
tokenId: mockCusdTokenBalance.tokenId,
tokenSymbol: mockCusdTokenBalance.symbol,
})
expect(store.getActions()).toEqual([
depositTransactionStarted({
sendAmount: '12.345',
sendToken: mockCusdTokenBalance,
serializablePreparedTransactions,
beneficiaryAddress: mockBeneficiaryAddress,
}),
])
})
it('should dispatch the correct action after successful transaction', async () => {
const navParams = {
tokenId: mockCusdTokenId,
sendAmount: '12.345',
serializablePreparedTransactions,
link: 'https://some.link',
}
const store = createMockStore({
jumpstart: {
depositStatus: 'idle',
},
})
const { rerender, getByTestId } = render(
)
const updatedStoreLoading = createMockStore({
jumpstart: {
depositStatus: 'loading',
},
})
rerender(
)
expect(navigate).not.toHaveBeenCalled()
expect(getByTestId('JumpstartSendConfirmation/ConfirmButton')).toBeDisabled()
const updatedStoreCompleted = createMockStore({
jumpstart: {
depositStatus: 'success',
},
})
rerender(
)
expect(navigate).toHaveBeenCalledWith(Screens.JumpstartShareLink, {
link: 'https://some.link',
sendAmount: '12.345',
tokenId: mockCusdTokenId,
})
})
it('should render a dismissable error notification if the transaction is unsuccessful', async () => {
const { rerender, queryByText, getByText } = render(
)
expect(queryByText('jumpstartSendConfirmationScreen.sendError.title')).toBeFalsy()
const updatedMockStore = createMockStore({
jumpstart: {
depositStatus: 'error',
},
})
rerender(
)
expect(getByText('jumpstartSendConfirmationScreen.sendError.title')).toBeTruthy()
fireEvent.press(getByText('jumpstartSendConfirmationScreen.sendError.ctaLabel'))
expect(updatedMockStore.getActions()).toEqual([depositErrorDismissed()])
})
it('should dismiss the send status error when entering the screen', () => {
const store = createMockStore({
jumpstart: {
depositStatus: 'error',
},
})
render(
)
expect(store.getActions()).toEqual([depositErrorDismissed()])
})
})