aboutsummaryrefslogtreecommitdiffstats
path: root/ui/app/pages/send/send-content/add-recipient/tests
diff options
context:
space:
mode:
Diffstat (limited to 'ui/app/pages/send/send-content/add-recipient/tests')
-rw-r--r--ui/app/pages/send/send-content/add-recipient/tests/add-recipient-component.test.js202
-rw-r--r--ui/app/pages/send/send-content/add-recipient/tests/add-recipient-container.test.js72
-rw-r--r--ui/app/pages/send/send-content/add-recipient/tests/add-recipient-selectors.test.js59
-rw-r--r--ui/app/pages/send/send-content/add-recipient/tests/add-recipient-utils.test.js107
4 files changed, 440 insertions, 0 deletions
diff --git a/ui/app/pages/send/send-content/add-recipient/tests/add-recipient-component.test.js b/ui/app/pages/send/send-content/add-recipient/tests/add-recipient-component.test.js
new file mode 100644
index 000000000..7570e7fcb
--- /dev/null
+++ b/ui/app/pages/send/send-content/add-recipient/tests/add-recipient-component.test.js
@@ -0,0 +1,202 @@
+import React from 'react'
+import assert from 'assert'
+import { shallow } from 'enzyme'
+import sinon from 'sinon'
+import AddRecipient from '../add-recipient.component'
+import Dialog from '../../../../../components/ui/dialog'
+
+const propsMethodSpies = {
+ closeToDropdown: sinon.spy(),
+ openToDropdown: sinon.spy(),
+ updateGas: sinon.spy(),
+ updateSendTo: sinon.spy(),
+ updateSendToError: sinon.spy(),
+ updateSendToWarning: sinon.spy(),
+}
+
+describe('AddRecipient Component', function () {
+ let wrapper
+ let instance
+
+ beforeEach(() => {
+ wrapper = shallow(<AddRecipient
+ closeToDropdown={propsMethodSpies.closeToDropdown}
+ inError={false}
+ inWarning={false}
+ network={'mockNetwork'}
+ openToDropdown={propsMethodSpies.openToDropdown}
+ to={'mockTo'}
+ toAccounts={['mockAccount']}
+ toDropdownOpen={false}
+ updateGas={propsMethodSpies.updateGas}
+ updateSendTo={propsMethodSpies.updateSendTo}
+ updateSendToError={propsMethodSpies.updateSendToError}
+ updateSendToWarning={propsMethodSpies.updateSendToWarning}
+ addressBook={[{ address: '0x80F061544cC398520615B5d3e7A3BedD70cd4510', name: 'Fav 5' }]}
+ nonContacts={[{ address: '0x70F061544cC398520615B5d3e7A3BedD70cd4510', name: 'Fav 7' }]}
+ contacts={[{ address: '0x60F061544cC398520615B5d3e7A3BedD70cd4510', name: 'Fav 6' }]}
+ />, { context: { t: str => str + '_t' } })
+ instance = wrapper.instance()
+ })
+
+ afterEach(() => {
+ propsMethodSpies.closeToDropdown.resetHistory()
+ propsMethodSpies.openToDropdown.resetHistory()
+ propsMethodSpies.updateSendTo.resetHistory()
+ propsMethodSpies.updateSendToError.resetHistory()
+ propsMethodSpies.updateSendToWarning.resetHistory()
+ propsMethodSpies.updateGas.resetHistory()
+ })
+
+ describe('selectRecipient', () => {
+
+ it('should call updateSendTo', () => {
+ assert.equal(propsMethodSpies.updateSendTo.callCount, 0)
+ instance.selectRecipient('mockTo2', 'mockNickname')
+ assert.equal(propsMethodSpies.updateSendTo.callCount, 1)
+ assert.deepEqual(
+ propsMethodSpies.updateSendTo.getCall(0).args,
+ ['mockTo2', 'mockNickname']
+ )
+ })
+
+ it('should call updateGas if there is no to error', () => {
+ assert.equal(propsMethodSpies.updateGas.callCount, 0)
+ instance.selectRecipient(false)
+ assert.equal(propsMethodSpies.updateGas.callCount, 1)
+ })
+ })
+
+ describe('render', () => {
+ it('should render a component', () => {
+ assert.equal(wrapper.find('.send__select-recipient-wrapper').length, 1)
+ })
+
+ it('should render no content if there are no recents, transfers, and contacts', () => {
+ wrapper.setProps({
+ ownedAccounts: [],
+ addressBook: [],
+ })
+
+ assert.equal(wrapper.find('.send__select-recipient-wrapper__list__link').length, 0)
+ assert.equal(wrapper.find('.send__select-recipient-wrapper__group').length, 0)
+ })
+
+ it('should render transfer', () => {
+ wrapper.setProps({
+ ownedAccounts: [{ address: '0x123', name: '123' }, { address: '0x124', name: '124' }],
+ addressBook: [{ address: '0x456', name: 'test-name' }],
+ })
+ wrapper.setState({ isShowingTransfer: true })
+
+ const xferLink = wrapper.find('.send__select-recipient-wrapper__list__link')
+ assert.equal(xferLink.length, 1)
+
+
+ const groups = wrapper.find('RecipientGroup')
+ assert.equal(groups.shallow().find('.send__select-recipient-wrapper__group').length, 1)
+ })
+
+ it('should render ContactList', () => {
+ wrapper.setProps({
+ ownedAccounts: [{ address: '0x123', name: '123' }, { address: '0x124', name: '124' }],
+ addressBook: [{ address: '0x125' }],
+ })
+
+ const contactList = wrapper.find('ContactList')
+
+ assert.equal(contactList.length, 1)
+ })
+
+ it('should render contacts', () => {
+ wrapper.setProps({
+ addressBook: [
+ { address: '0x125', name: 'alice' },
+ { address: '0x126', name: 'alex' },
+ { address: '0x127', name: 'catherine' },
+ ],
+ })
+ wrapper.setState({ isShowingTransfer: false })
+
+ const xferLink = wrapper.find('.send__select-recipient-wrapper__list__link')
+ assert.equal(xferLink.length, 0)
+
+ const groups = wrapper.find('ContactList')
+ assert.equal(groups.length, 1)
+
+ assert.equal(groups.find('.send__select-recipient-wrapper__group-item').length, 0)
+ })
+
+ it('should render error when query has no results', () => {
+ wrapper.setProps({
+ addressBook: [],
+ toError: 'bad',
+ contacts: [],
+ nonContacts: [],
+ })
+
+ const dialog = wrapper.find(Dialog)
+
+ assert.equal(dialog.props().type, 'error')
+ assert.equal(dialog.props().children, 'bad_t')
+ assert.equal(dialog.length, 1)
+ })
+
+ it('should render error when query has ens does not resolve', () => {
+ wrapper.setProps({
+ addressBook: [],
+ toError: 'bad',
+ ensResolutionError: 'very bad',
+ contacts: [],
+ nonContacts: [],
+ })
+
+ const dialog = wrapper.find(Dialog)
+
+ assert.equal(dialog.props().type, 'error')
+ assert.equal(dialog.props().children, 'very bad')
+ assert.equal(dialog.length, 1)
+ })
+
+ it('should render warning', () => {
+ wrapper.setProps({
+ addressBook: [],
+ query: 'yo',
+ toWarning: 'watchout',
+ })
+
+ const dialog = wrapper.find(Dialog)
+
+ assert.equal(dialog.props().type, 'warning')
+ assert.equal(dialog.props().children, 'watchout_t')
+ assert.equal(dialog.length, 1)
+ })
+
+ it('should not render error when ens resolved', () => {
+ wrapper.setProps({
+ addressBook: [],
+ toError: 'bad',
+ ensResolution: '0x128',
+ })
+
+ const dialog = wrapper.find(Dialog)
+
+ assert.equal(dialog.length, 0)
+ })
+
+ it('should not render error when query has results', () => {
+ wrapper.setProps({
+ addressBook: [
+ { address: '0x125', name: 'alice' },
+ { address: '0x126', name: 'alex' },
+ { address: '0x127', name: 'catherine' },
+ ],
+ toError: 'bad',
+ })
+
+ const dialog = wrapper.find(Dialog)
+
+ assert.equal(dialog.length, 0)
+ })
+ })
+})
diff --git a/ui/app/pages/send/send-content/add-recipient/tests/add-recipient-container.test.js b/ui/app/pages/send/send-content/add-recipient/tests/add-recipient-container.test.js
new file mode 100644
index 000000000..5ca0b2c23
--- /dev/null
+++ b/ui/app/pages/send/send-content/add-recipient/tests/add-recipient-container.test.js
@@ -0,0 +1,72 @@
+import assert from 'assert'
+import proxyquire from 'proxyquire'
+import sinon from 'sinon'
+
+let mapStateToProps
+let mapDispatchToProps
+
+const actionSpies = {
+ updateSendTo: sinon.spy(),
+}
+
+proxyquire('../add-recipient.container.js', {
+ 'react-redux': {
+ connect: (ms, md) => {
+ mapStateToProps = ms
+ mapDispatchToProps = md
+ return () => ({})
+ },
+ },
+ '../../send.selectors.js': {
+ getSendEnsResolution: (s) => `mockSendEnsResolution:${s}`,
+ getSendEnsResolutionError: (s) => `mockSendEnsResolutionError:${s}`,
+ accountsWithSendEtherInfoSelector: (s) => `mockAccountsWithSendEtherInfoSelector:${s}`,
+ },
+ '../../../../selectors/selectors': {
+ getAddressBook: (s) => [{ name: `mockAddressBook:${s}` }],
+ getAddressBookEntry: (s) => `mockAddressBookEntry:${s}`,
+ },
+ '../../../../store/actions': actionSpies,
+})
+
+describe('add-recipient container', () => {
+
+ describe('mapStateToProps()', () => {
+
+ it('should map the correct properties to props', () => {
+ assert.deepEqual(mapStateToProps('mockState'), {
+ addressBook: [{ name: 'mockAddressBook:mockState' }],
+ contacts: [{ name: 'mockAddressBook:mockState' }],
+ ensResolution: 'mockSendEnsResolution:mockState',
+ ensResolutionError: 'mockSendEnsResolutionError:mockState',
+ ownedAccounts: 'mockAccountsWithSendEtherInfoSelector:mockState',
+ addressBookEntryName: undefined,
+ nonContacts: [],
+ })
+ })
+
+ })
+
+ describe('mapDispatchToProps()', () => {
+ let dispatchSpy
+ let mapDispatchToPropsObject
+
+ beforeEach(() => {
+ dispatchSpy = sinon.spy()
+ mapDispatchToPropsObject = mapDispatchToProps(dispatchSpy)
+ })
+
+ describe('updateSendTo()', () => {
+ it('should dispatch an action', () => {
+ mapDispatchToPropsObject.updateSendTo('mockTo', 'mockNickname')
+ assert(dispatchSpy.calledOnce)
+ assert(actionSpies.updateSendTo.calledOnce)
+ assert.deepEqual(
+ actionSpies.updateSendTo.getCall(0).args,
+ ['mockTo', 'mockNickname']
+ )
+ })
+ })
+ })
+
+})
diff --git a/ui/app/pages/send/send-content/add-recipient/tests/add-recipient-selectors.test.js b/ui/app/pages/send/send-content/add-recipient/tests/add-recipient-selectors.test.js
new file mode 100644
index 000000000..82f481187
--- /dev/null
+++ b/ui/app/pages/send/send-content/add-recipient/tests/add-recipient-selectors.test.js
@@ -0,0 +1,59 @@
+import assert from 'assert'
+import {
+ getToDropdownOpen,
+ getTokens,
+ sendToIsInError,
+} from '../add-recipient.selectors.js'
+
+describe('add-recipient selectors', () => {
+
+ describe('getToDropdownOpen()', () => {
+ it('should return send.getToDropdownOpen', () => {
+ const state = {
+ send: {
+ toDropdownOpen: false,
+ },
+ }
+
+ assert.equal(getToDropdownOpen(state), false)
+ })
+ })
+
+ describe('sendToIsInError()', () => {
+ it('should return true if send.errors.to is truthy', () => {
+ const state = {
+ send: {
+ errors: {
+ to: 'abc',
+ },
+ },
+ }
+
+ assert.equal(sendToIsInError(state), true)
+ })
+
+ it('should return false if send.errors.to is falsy', () => {
+ const state = {
+ send: {
+ errors: {
+ to: null,
+ },
+ },
+ }
+
+ assert.equal(sendToIsInError(state), false)
+ })
+ })
+
+ describe('getTokens()', () => {
+ it('should return empty array if no tokens in state', () => {
+ const state = {
+ metamask: {
+ tokens: [],
+ },
+ }
+
+ assert.deepStrictEqual(getTokens(state), [])
+ })
+ })
+})
diff --git a/ui/app/pages/send/send-content/add-recipient/tests/add-recipient-utils.test.js b/ui/app/pages/send/send-content/add-recipient/tests/add-recipient-utils.test.js
new file mode 100644
index 000000000..182504c5d
--- /dev/null
+++ b/ui/app/pages/send/send-content/add-recipient/tests/add-recipient-utils.test.js
@@ -0,0 +1,107 @@
+import assert from 'assert'
+import proxyquire from 'proxyquire'
+import sinon from 'sinon'
+
+import {
+ REQUIRED_ERROR,
+ INVALID_RECIPIENT_ADDRESS_ERROR,
+ KNOWN_RECIPIENT_ADDRESS_ERROR,
+} from '../../../send.constants'
+
+const stubs = {
+ isValidAddress: sinon.stub().callsFake(to => Boolean(to.match(/^[0xabcdef123456798]+$/))),
+}
+
+const toRowUtils = proxyquire('../add-recipient.js', {
+ '../../../../helpers/utils/util': {
+ isValidAddress: stubs.isValidAddress,
+ },
+})
+const {
+ getToErrorObject,
+ getToWarningObject,
+} = toRowUtils
+
+describe('add-recipient utils', () => {
+
+ describe('getToErrorObject()', () => {
+ it('should return a required error if to is falsy', () => {
+ assert.deepEqual(getToErrorObject(null), {
+ to: REQUIRED_ERROR,
+ })
+ })
+
+ it('should return null if to is falsy and hexData is truthy', () => {
+ assert.deepEqual(getToErrorObject(null, undefined, true), {
+ to: null,
+ })
+ })
+
+ it('should return an invalid recipient error if to is truthy but invalid', () => {
+ assert.deepEqual(getToErrorObject('mockInvalidTo'), {
+ to: INVALID_RECIPIENT_ADDRESS_ERROR,
+ })
+ })
+
+ it('should return null if to is truthy and valid', () => {
+ assert.deepEqual(getToErrorObject('0xabc123'), {
+ to: null,
+ })
+ })
+
+ it('should return the passed error if to is truthy but invalid if to is truthy and valid', () => {
+ assert.deepEqual(getToErrorObject('invalid #$ 345878', 'someExplicitError'), {
+ to: 'someExplicitError',
+ })
+ })
+
+ it('should return null if to is truthy but part of state tokens', () => {
+ assert.deepEqual(getToErrorObject('0xabc123', undefined, false, [{'address': '0xabc123'}], {'address': '0xabc123'}), {
+ to: null,
+ })
+ })
+
+ it('should null if to is truthy part of tokens but selectedToken falsy', () => {
+ assert.deepEqual(getToErrorObject('0xabc123', undefined, false, [{'address': '0xabc123'}]), {
+ to: null,
+ })
+ })
+
+ it('should return null if to is truthy but part of contract metadata', () => {
+ assert.deepEqual(getToErrorObject('0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359', undefined, false, [{'address': '0xabc123'}], {'address': '0xabc123'}), {
+ to: null,
+ })
+ })
+ it('should null if to is truthy part of contract metadata but selectedToken falsy', () => {
+ assert.deepEqual(getToErrorObject('0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359', undefined, false, [{'address': '0xabc123'}], {'address': '0xabc123'}), {
+ to: null,
+ })
+ })
+ })
+
+ describe('getToWarningObject()', () => {
+ it('should return a known address recipient if to is truthy but part of state tokens', () => {
+ assert.deepEqual(getToWarningObject('0xabc123', undefined, [{'address': '0xabc123'}], {'address': '0xabc123'}), {
+ to: KNOWN_RECIPIENT_ADDRESS_ERROR,
+ })
+ })
+
+ it('should null if to is truthy part of tokens but selectedToken falsy', () => {
+ assert.deepEqual(getToWarningObject('0xabc123', undefined, [{'address': '0xabc123'}]), {
+ to: null,
+ })
+ })
+
+ it('should return a known address recipient if to is truthy but part of contract metadata', () => {
+ assert.deepEqual(getToWarningObject('0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359', undefined, [{'address': '0xabc123'}], {'address': '0xabc123'}), {
+ to: KNOWN_RECIPIENT_ADDRESS_ERROR,
+ })
+ })
+ it('should null if to is truthy part of contract metadata but selectedToken falsy', () => {
+ assert.deepEqual(getToWarningObject('0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359', undefined, [{'address': '0xabc123'}], {'address': '0xabc123'}), {
+ to: KNOWN_RECIPIENT_ADDRESS_ERROR,
+ })
+ })
+ })
+
+})