import { fireEvent, render } from '@testing-library/react-native'
import * as React from 'react'
import { Provider } from 'react-redux'
import { SendOrigin } from 'src/analytics/types'
import { AddressValidationType } from 'src/identity/reducer'
import { navigate } from 'src/navigator/NavigationService'
import { Screens } from 'src/navigator/Screens'
import ValidateRecipientAccount from 'src/send/ValidateRecipientAccount'
import { createMockStore, getMockStackScreenProps } from 'test/utils'
import {
mockAccountInvite,
mockCusdAddress,
mockE164NumberInvite,
mockInvitableRecipient2,
} from 'test/values'
describe('ValidateRecipientAccount', () => {
beforeEach(() => {
jest.clearAllMocks()
})
it('renders correctly when full validation required', () => {
const store = createMockStore({
identity: {
secureSendPhoneNumberMapping: {
[mockE164NumberInvite]: {
addressValidationType: AddressValidationType.FULL,
validationSuccessful: false,
},
},
},
})
const tree = render(
)
expect(tree).toMatchSnapshot()
})
it('renders correctly when partial validation required', () => {
const store = createMockStore({
identity: {
secureSendPhoneNumberMapping: {
[mockE164NumberInvite]: {
addressValidationType: AddressValidationType.PARTIAL,
validationSuccessful: false,
},
},
},
})
const tree = render(
)
expect(tree).toMatchSnapshot()
})
it('typing correct last four of account enables submit button', () => {
const store = createMockStore({
identity: {
secureSendPhoneNumberMapping: {
[mockE164NumberInvite]: {
addressValidationType: AddressValidationType.PARTIAL,
validationSuccessful: false,
},
},
},
})
const tree = render(
)
expect(tree.getByTestId('ConfirmAccountButton')).toBeDisabled()
fireEvent.changeText(tree.getByTestId('SingleDigitInput/digit0'), mockCusdAddress[38])
fireEvent.changeText(tree.getByTestId('SingleDigitInput/digit1'), mockCusdAddress[39])
fireEvent.changeText(tree.getByTestId('SingleDigitInput/digit2'), mockCusdAddress[40])
fireEvent.changeText(tree.getByTestId('SingleDigitInput/digit3'), mockCusdAddress[41])
expect(tree.getByTestId('ConfirmAccountButton')).not.toBeDisabled()
})
it('enables submit button for full validation', () => {
const store = createMockStore({
identity: {
secureSendPhoneNumberMapping: {
[mockE164NumberInvite]: {
addressValidationType: AddressValidationType.FULL,
validationSuccessful: false,
},
},
},
})
const tree = render(
)
expect(tree.getByTestId('ConfirmAccountButton')).toBeDisabled()
fireEvent.changeText(
tree.getByTestId('ValidateRecipientAccount/TextInput'),
mockCusdAddress[38]
)
expect(tree.getByTestId('ConfirmAccountButton')).not.toBeDisabled()
})
it('navigates to send enter amount with validated address when validation is successful', () => {
const store = createMockStore({
identity: {
secureSendPhoneNumberMapping: {
[mockE164NumberInvite]: {
addressValidationType: AddressValidationType.NONE,
validationSuccessful: false,
},
},
},
})
const props = getMockStackScreenProps(Screens.ValidateRecipientAccount, {
recipient: mockInvitableRecipient2,
origin: SendOrigin.AppSendFlow,
})
const tree = render(
)
const updatedStore = createMockStore({
identity: {
secureSendPhoneNumberMapping: {
[mockE164NumberInvite]: {
addressValidationType: AddressValidationType.NONE,
address: mockAccountInvite,
validationSuccessful: true,
},
},
},
})
tree.rerender(
)
expect(navigate).toHaveBeenCalledWith(Screens.SendEnterAmount, {
origin: SendOrigin.AppSendFlow,
isFromScan: false,
defaultTokenIdOverride: undefined,
forceTokenId: undefined,
recipient: {
...mockInvitableRecipient2,
address: mockAccountInvite,
},
})
})
})