import { fireEvent, render, waitFor } from '@testing-library/react-native' import * as React from 'react' import 'react-native' import { Provider } from 'react-redux' import { recoveryPhraseInOnboardingStarted } from 'src/account/actions' import { RecoveryPhraseInOnboardingStatus } from 'src/account/reducer' import { OnboardingEvents } from 'src/analytics/Events' import AppAnalytics from 'src/analytics/AppAnalytics' import { navigate } from 'src/navigator/NavigationService' import { Screens } from 'src/navigator/Screens' import ProtectWallet from 'src/onboarding/registration/ProtectWallet' import { createMockStore, getMockStackScreenProps } from 'test/utils' import { mockOnboardingProps } from 'test/values' jest.mock('src/analytics/AppAnalytics') jest.mock('src/pincode/authentication', () => ({ getPassword: jest.fn(), })) jest.mock('src/web3/contracts', () => ({ getWalletAsync: jest.fn().mockResolvedValue({ unlockAccount: jest.fn(), }), })) const mockOnboardingPropsSelector = jest.fn(() => mockOnboardingProps) jest.mock('src/onboarding/steps', () => ({ getOnboardingStepValues: () => ({ step: 3, totalSteps: 3 }), onboardingPropsSelector: () => mockOnboardingPropsSelector(), })) jest.mock('src/navigator/NavigationService', () => { const originalModule = jest.requireActual('src/navigator/NavigationService') return { ...originalModule, navigate: jest.fn(), ensurePincode: jest.fn().mockResolvedValue(true), } }) const mockScreenProps = getMockStackScreenProps(Screens.ProtectWallet) describe('ProtectWalletScreen', () => { const store = createMockStore({ web3: { account: '0xaccount', }, }) store.dispatch = jest.fn() beforeEach(() => { jest.clearAllMocks() }) it('Shows recovery phrase option', async () => { const { getByTestId } = render( ) expect(store.dispatch).toHaveBeenCalledWith(recoveryPhraseInOnboardingStarted()) await waitFor(() => { expect(getByTestId('recoveryPhraseCard')).toBeTruthy() }) }) it('does not dispatch event if recoveryPhraseInOnboardingStatus is not NotStarted', async () => { const mockStore = createMockStore({ web3: { account: '0xaccount', }, account: { recoveryPhraseInOnboardingStatus: RecoveryPhraseInOnboardingStatus.InProgress, }, }) const { getByTestId } = render( ) expect(store.dispatch).not.toHaveBeenCalled() await waitFor(() => { expect(getByTestId('recoveryPhraseCard')).toBeTruthy() }) }) it('navigates when recovery phrase is selected', async () => { const { getByTestId } = render( ) await waitFor(() => { expect(getByTestId('recoveryPhraseCard')).toBeTruthy() }) fireEvent.press(getByTestId('recoveryPhraseCard')) await waitFor(() => { expect(AppAnalytics.track).toHaveBeenCalledTimes(1) expect(AppAnalytics.track).toHaveBeenCalledWith(OnboardingEvents.protect_wallet_use_recovery) expect(navigate).toHaveBeenCalledWith(Screens.OnboardingRecoveryPhrase) }) }) })