import { FiatAccountType } from '@fiatconnect/fiatconnect-types' import { fireEvent, render } from '@testing-library/react-native' import React from 'react' import { Provider } from 'react-redux' import { KycStatus } from 'src/account/reducer' import AppAnalytics from 'src/analytics/AppAnalytics' import { CICOEvents } from 'src/analytics/Events' import { FiatConnectQuoteSuccess } from 'src/fiatconnect' import KycLanding from 'src/fiatconnect/KycLanding' import { personaFinished, personaStarted, postKyc } from 'src/fiatconnect/slice' import FiatConnectQuote from 'src/fiatExchanges/quotes/FiatConnectQuote' import { CICOFlow } from 'src/fiatExchanges/types' import { Screens } from 'src/navigator/Screens' import { createMockStore, getMockStackScreenProps } from 'test/utils' import { mockCusdTokenId, mockFiatConnectQuotes } from 'test/values' jest.mock('src/account/Persona') jest.mock('src/analytics/AppAnalytics') describe('KycLanding', () => { const normalizedQuote = new FiatConnectQuote({ quote: mockFiatConnectQuotes[1] as FiatConnectQuoteSuccess, fiatAccountType: FiatAccountType.BankAccount, flow: CICOFlow.CashOut, tokenId: mockCusdTokenId, }) const store = createMockStore({ fiatConnect: { personaInProgress: false, }, }) store.dispatch = jest.fn() beforeEach(() => { jest.clearAllMocks() }) describe('step one', () => { const props = getMockStackScreenProps(Screens.KycLanding, { flow: CICOFlow.CashOut, quote: normalizedQuote, personaKycStatus: KycStatus.Completed, step: 'one', }) it('shows step two greyed out when in step one mode', () => { const { queryByTestId, getByTestId } = render( ) expect(queryByTestId('step-one-grey')).toBeFalsy() expect(queryByTestId('step-two-grey')).toBeTruthy() expect(getByTestId('checkbox/unchecked')).toBeTruthy() expect(getByTestId('continueButton')).toBeDisabled() }) it('only lets you click on the persona button after accepting the privacy policy', async () => { const { getByTestId } = render( ) expect(getByTestId('PersonaButton')).toBeDisabled() fireEvent.press(getByTestId('checkbox/unchecked')) expect(getByTestId('PersonaButton')).not.toBeDisabled() }) it('triggers analytics and dispatches persona started when persona button is pressed', () => { AppAnalytics.track = jest.fn() const { getByTestId } = render( ) fireEvent.press(getByTestId('checkbox/unchecked')) fireEvent.press(getByTestId('PersonaButton')) jest.advanceTimersByTime(600) expect(AppAnalytics.track).toHaveBeenCalledWith(CICOEvents.persona_kyc_start) expect(store.dispatch).toHaveBeenCalledWith(personaStarted()) }) it('dispatches post kyc when persona succeeds', () => { const { getByTestId } = render( ) fireEvent.press(getByTestId('checkbox/unchecked')) // 'PersonaSuccessButton' is a mock that calls onSuccess when pressed fireEvent.press(getByTestId('PersonaSuccessButton')) expect(store.dispatch).toHaveBeenCalledWith(postKyc({ quote: normalizedQuote })) }) it('dispatches persona finished when persona flow errors', () => { const { getByTestId } = render( ) fireEvent.press(getByTestId('checkbox/unchecked')) fireEvent.press(getByTestId('PersonaErrorButton')) expect(store.dispatch).toHaveBeenCalledWith(personaFinished()) }) it('dispatches persona finished when persona flow is canceled', () => { const { getByTestId } = render( ) fireEvent.press(getByTestId('checkbox/unchecked')) // 'PersonaCancelButton' is a mock that calls onCanceled when pressed fireEvent.press(getByTestId('PersonaCancelButton')) expect(store.dispatch).toHaveBeenCalledWith(personaFinished()) }) it('shows loading screen if persona is in progress', () => { const store = createMockStore({ fiatConnect: { personaInProgress: true, }, }) const { getByTestId } = render( ) expect(getByTestId('personaInProgress')).toBeTruthy() }) }) describe('step two', () => { const props = getMockStackScreenProps(Screens.KycLanding, { flow: CICOFlow.CashOut, quote: normalizedQuote, personaKycStatus: undefined, step: 'two', }) it('shows step one greyed out when in step two mode', () => { const { queryByTestId, getByTestId } = render( ) expect(queryByTestId('step-one-grey')).toBeTruthy() expect(queryByTestId('step-two-grey')).toBeFalsy() expect(getByTestId('checkbox/checked')).toBeTruthy() expect(getByTestId('continueButton')).not.toBeDisabled() expect(getByTestId('PersonaButton')).toBeDisabled() }) }) })