import { FiatAccountType, KycStatus as FiatConnectKycStatus } from '@fiatconnect/fiatconnect-types' import { fireEvent, render } from '@testing-library/react-native' import React from 'react' import { Provider } from 'react-redux' import AppAnalytics from 'src/analytics/AppAnalytics' import { FiatExchangeEvents } from 'src/analytics/Events' import FiatConnectQuote from 'src/fiatExchanges/quotes/FiatConnectQuote' import { CICOFlow } from 'src/fiatExchanges/types' import { FiatConnectQuoteSuccess } from 'src/fiatconnect' import KycExpired from 'src/fiatconnect/kyc/KycExpired' import getNavigationOptions from 'src/fiatconnect/kyc/getNavigationOptions' import { kycTryAgain } from 'src/fiatconnect/slice' import { navigate } from 'src/navigator/NavigationService' import { Screens } from 'src/navigator/Screens' import { createMockStore, getMockStackScreenProps } from 'test/utils' import { mockCusdTokenId, mockFiatConnectQuotes } from 'test/values' jest.mock('src/analytics/AppAnalytics') jest.mock('src/fiatconnect/kyc/getNavigationOptions') describe('KycExpired', () => { const mockStore = (overrides: any = {}) => { const store = createMockStore({ fiatConnect: { kycTryAgainLoading: false, ...overrides, }, }) store.dispatch = jest.fn() return store } const mockQuote = new FiatConnectQuote({ flow: CICOFlow.CashOut, fiatAccountType: FiatAccountType.BankAccount, quote: mockFiatConnectQuotes[1] as FiatConnectQuoteSuccess, tokenId: mockCusdTokenId, }) const mockScreenProps = () => getMockStackScreenProps(Screens.KycExpired, { flow: CICOFlow.CashOut, quote: mockQuote, }) beforeEach(() => { jest.clearAllMocks() }) it('sets header options', () => { const store = mockStore() const mockProps = mockScreenProps() render( ) expect(mockProps.navigation.setOptions).toBeCalledWith( getNavigationOptions({ fiatConnectKycStatus: FiatConnectKycStatus.KycExpired, quote: mockQuote, }) ) }) it('shows spinner if loading', () => { const store = mockStore({ kycTryAgainLoading: true }) const mockProps = mockScreenProps() const { queryByTestId } = render( ) expect(queryByTestId('spinnerContainer')).toBeTruthy() }) it('pressing switch button navigates to select provider', () => { const store = mockStore() const mockProps = mockScreenProps() const { queryByTestId, getByTestId } = render( ) expect(queryByTestId('switchButton')).toBeTruthy() fireEvent.press(getByTestId('switchButton')) expect(AppAnalytics.track).toHaveBeenCalledTimes(1) expect(AppAnalytics.track).toHaveBeenCalledWith( FiatExchangeEvents.cico_fc_kyc_status_switch_method, { provider: mockQuote.getProviderId(), flow: CICOFlow.CashOut, fiatConnectKycStatus: FiatConnectKycStatus.KycExpired, } ) expect(navigate).toHaveBeenCalledTimes(1) expect(navigate).toHaveBeenCalledWith(Screens.SelectProvider, { flow: CICOFlow.CashOut, amount: { crypto: Number(mockQuote.getCryptoAmount()), fiat: Number(mockQuote.getFiatAmount()), }, tokenId: mockCusdTokenId, }) }) it('pressing try again button dispatches action', () => { const store = mockStore() const mockProps = mockScreenProps() const { queryByTestId, getByTestId } = render( ) expect(queryByTestId('tryAgainButton')).toBeTruthy() fireEvent.press(getByTestId('tryAgainButton')) expect(AppAnalytics.track).toHaveBeenCalledTimes(1) expect(AppAnalytics.track).toHaveBeenCalledWith( FiatExchangeEvents.cico_fc_kyc_status_try_again, { provider: mockQuote.getProviderId(), flow: CICOFlow.CashOut, fiatConnectKycStatus: FiatConnectKycStatus.KycExpired, } ) expect(store.dispatch).toHaveBeenCalledTimes(1) expect(store.dispatch).toHaveBeenCalledWith( kycTryAgain({ quote: mockQuote, flow: CICOFlow.CashOut }) ) }) })