import { fireEvent, render, waitFor } from '@testing-library/react-native'
import { FetchMock } from 'jest-fetch-mock/types'
import * as React from 'react'
import { Provider } from 'react-redux'
import AppAnalytics from 'src/analytics/AppAnalytics'
import { FiatExchangeEvents } from 'src/analytics/Events'
import SimplexScreen from 'src/fiatExchanges/SimplexScreen'
import { SimplexQuote } from 'src/fiatExchanges/types'
import { LocalCurrencyCode } from 'src/localCurrency/consts'
import { Screens } from 'src/navigator/Screens'
import { CiCoCurrency } from 'src/utils/currencies'
import { createMockStore, getMockStackScreenProps } from 'test/utils'
import { mockAccount, mockCusdTokenId, mockE164Number } from 'test/values'
import { v4 as uuidv4 } from 'uuid'
const mockUserIpAddress = '1.1.1.1.1.1.0'
const MOCK_SIMPLEX_PAYMENT_REQUEST_RESPONSE = JSON.stringify({
is_kyc_update_required: false,
paymentId: '123',
})
const mockStore = createMockStore({
web3: {
account: mockAccount,
},
account: {
e164PhoneNumber: mockE164Number,
defaultCountryCode: '+1',
},
localCurrency: {
preferredCurrencyCode: LocalCurrencyCode.USD,
},
networkInfo: {
userLocationData: {
ipAddress: mockUserIpAddress,
},
},
})
const MOCK_SIMPLEX_QUOTE = {
user_id: mockAccount,
quote_id: uuidv4(),
wallet_id: 'appname',
digital_money: {
currency: 'CUSD',
amount: 25,
},
fiat_money: {
currency: 'USD',
base_amount: 19,
total_amount: 26,
},
valid_until: new Date().toISOString(),
supported_digital_currencies: ['CUSD', 'CELO'],
tokenId: mockCusdTokenId,
}
const mockScreenProps = () =>
getMockStackScreenProps(Screens.Simplex, {
simplexQuote: MOCK_SIMPLEX_QUOTE as SimplexQuote,
tokenId: mockCusdTokenId,
})
describe('SimplexScreen', () => {
const mockFetch = fetch as FetchMock
beforeEach(() => {
jest.useRealTimers()
jest.clearAllMocks()
mockFetch.resetMocks()
})
it('renders correctly', async () => {
const tree = render(
)
expect(tree).toMatchSnapshot()
mockFetch.mockResponseOnce(MOCK_SIMPLEX_PAYMENT_REQUEST_RESPONSE)
await waitFor(() => tree.getByText(/continueToProvider/))
tree.rerender(
)
expect(tree).toMatchSnapshot()
})
it('fires an analytics event', async () => {
mockFetch.mockResponseOnce(MOCK_SIMPLEX_PAYMENT_REQUEST_RESPONSE)
const tree = render(
)
await waitFor(() => tree.getByText(/continueToProvider/))
fireEvent.press(tree.getByText(/continueToProvider/))
expect(AppAnalytics.track).toHaveBeenCalledWith(FiatExchangeEvents.cico_simplex_open_webview, {
amount: 25,
cryptoCurrency: CiCoCurrency.cUSD,
feeInFiat: 7,
fiatCurrency: 'USD',
})
})
})