import { FiatType, KycSchema } from '@fiatconnect/fiatconnect-types' import { render } from '@testing-library/react-native' import * as React from 'react' import { Provider } from 'react-redux' import FiatConnectRefetchQuoteScreen from 'src/fiatconnect/RefetchQuoteScreen' import { refetchQuote } from 'src/fiatconnect/slice' import { CICOFlow } from 'src/fiatExchanges/types' import { navigate, navigateHome } from 'src/navigator/NavigationService' import { Screens } from 'src/navigator/Screens' import { CiCoCurrency } from 'src/utils/currencies' import { createMockStore, getMockStackScreenProps } from 'test/utils' import { mockCusdTokenId } from 'test/values' const store = createMockStore() describe('RefetchQuoteScreen', () => { beforeEach(() => { store.dispatch = jest.fn() }) afterEach(() => { jest.clearAllMocks() }) it('navigates to CICO start when cached quote does not exist', () => { const props = getMockStackScreenProps(Screens.FiatConnectRefetchQuote, { providerId: 'some-provider', kycSchema: KycSchema.PersonalDataAndDocuments, }) render( ) expect(navigateHome).toHaveBeenCalledTimes(1) expect(navigateHome).toHaveBeenCalledWith() expect(store.dispatch).not.toHaveBeenCalled() }) it('navigates to CICO start on error during quote re-fetch', () => { const store = createMockStore({ fiatConnect: { quotesError: 'some error', cachedQuoteParams: { 'some-provider': { [KycSchema.PersonalDataAndDocuments]: { cryptoAmount: '10', fiatAmount: '10', flow: CICOFlow.CashOut, cryptoType: CiCoCurrency.cUSD, fiatType: FiatType.USD, }, }, }, }, }) store.dispatch = jest.fn() const props = getMockStackScreenProps(Screens.FiatConnectRefetchQuote, { providerId: 'some-provider', kycSchema: KycSchema.PersonalDataAndDocuments, }) render( ) expect(navigateHome).toHaveBeenCalledTimes(1) expect(navigateHome).toHaveBeenCalledWith() expect(store.dispatch).toHaveBeenCalledWith( refetchQuote({ flow: CICOFlow.CashOut, cryptoType: CiCoCurrency.cUSD, cryptoAmount: '10', fiatAmount: '10', providerId: 'some-provider', tokenId: mockCusdTokenId, }) ) }) it('dispatches an action and does not navigate on success', () => { // N.B: Navigation to the Review screen is handled in the background by the refetchQuote // action; testing that the action actually navigates there is beyond the scope of this unit test. const store = createMockStore({ fiatConnect: { cachedQuoteParams: { 'some-provider': { [KycSchema.PersonalDataAndDocuments]: { cryptoAmount: '10', fiatAmount: '10', flow: CICOFlow.CashOut, cryptoType: CiCoCurrency.cUSD, fiatType: FiatType.USD, }, }, }, }, }) store.dispatch = jest.fn() const props = getMockStackScreenProps(Screens.FiatConnectRefetchQuote, { providerId: 'some-provider', kycSchema: KycSchema.PersonalDataAndDocuments, }) render( ) expect(navigate).not.toHaveBeenCalled() expect(store.dispatch).toHaveBeenCalledWith( refetchQuote({ flow: CICOFlow.CashOut, cryptoType: CiCoCurrency.cUSD, cryptoAmount: '10', fiatAmount: '10', providerId: 'some-provider', tokenId: mockCusdTokenId, }) ) }) })