import React from 'react'; import PropTypes from 'prop-types'; import { mount } from 'enzyme'; import sinon from 'sinon'; import { Provider } from 'react-redux'; import configureMockStore from 'redux-mock-store'; import UnitInput from '../../ui/unit-input'; import CurrencyDisplay from '../../ui/currency-display'; import CurrencyInput from './currency-input'; describe('CurrencyInput Component', () => { describe('rendering', () => { it('should render properly without a suffix', () => { const mockStore = { metamask: { nativeCurrency: 'ETH', currentCurrency: 'usd', conversionRate: 231.06, provider: { chainId: '0x4', }, preferences: { showFiatInTestnets: true, }, }, }; const store = configureMockStore()(mockStore); const wrapper = mount( , ); expect(wrapper).toHaveLength(1); expect(wrapper.find(UnitInput)).toHaveLength(1); }); it('should render properly with a suffix', () => { const mockStore = { metamask: { nativeCurrency: 'ETH', currentCurrency: 'usd', conversionRate: 231.06, provider: { chainId: '0x4', }, preferences: { showFiatInTestnets: true, }, }, }; const store = configureMockStore()(mockStore); const wrapper = mount( , ); expect(wrapper).toHaveLength(1); expect(wrapper.find('.unit-input__suffix')).toHaveLength(1); expect(wrapper.find('.unit-input__suffix').text()).toStrictEqual('ETH'); expect(wrapper.find(CurrencyDisplay)).toHaveLength(1); }); it('should render properly with an ETH value', () => { const mockStore = { metamask: { nativeCurrency: 'ETH', currentCurrency: 'usd', conversionRate: 231.06, provider: { chainId: '0x4', }, preferences: { showFiatInTestnets: true, }, }, }; const store = configureMockStore()(mockStore); const wrapper = mount( , ); expect(wrapper).toHaveLength(1); expect(wrapper.find('.unit-input__suffix')).toHaveLength(1); expect(wrapper.find('.unit-input__suffix').text()).toStrictEqual('ETH'); expect(wrapper.find('.unit-input__input').props().value).toStrictEqual(1); expect(wrapper.find('.currency-display-component').text()).toStrictEqual( '$231.06USD', ); }); it('should render properly with a fiat value', () => { const mockStore = { metamask: { nativeCurrency: 'ETH', currentCurrency: 'usd', conversionRate: 231.06, provider: { chainId: '0x4', }, preferences: { showFiatInTestnets: true, }, }, }; const store = configureMockStore()(mockStore); const handleChangeSpy = sinon.spy(); const wrapper = mount( , ); expect(wrapper).toHaveLength(1); expect(wrapper.find('.unit-input__suffix')).toHaveLength(1); expect(wrapper.find('.unit-input__suffix').text()).toStrictEqual('USD'); expect(wrapper.find('.unit-input__input').props().value).toStrictEqual(1); expect(wrapper.find('.currency-display-component').text()).toStrictEqual( '0.00432788ETH', ); }); it('should render properly with a native value when hideSecondary is true', () => { const mockStore = { metamask: { nativeCurrency: 'ETH', currentCurrency: 'usd', conversionRate: 231.06, provider: { chainId: '0x4', }, preferences: { showFiatInTestnets: false, }, }, hideSecondary: true, }; const store = configureMockStore()(mockStore); const handleChangeSpy = sinon.spy(); const wrapper = mount( , { context: { t: (str) => `${str}_t` }, childContextTypes: { t: PropTypes.func }, }, ); expect(wrapper).toHaveLength(1); expect(wrapper.find('.unit-input__suffix')).toHaveLength(1); expect(wrapper.find('.unit-input__suffix').text()).toStrictEqual('ETH'); expect(wrapper.find('.unit-input__input').props().value).toStrictEqual( 0.00432788, ); expect( wrapper.find('.currency-input__conversion-component').text(), ).toStrictEqual('[noConversionRateAvailable]'); }); }); describe('handling actions', () => { const handleChangeSpy = sinon.spy(); const handleBlurSpy = sinon.spy(); const handleChangeToggle = sinon.spy(); afterEach(() => { handleChangeSpy.resetHistory(); handleBlurSpy.resetHistory(); handleChangeToggle.resetHistory(); }); it('should call onChange on input changes with the hex value for ETH', () => { const mockStore = { metamask: { nativeCurrency: 'ETH', currentCurrency: 'usd', conversionRate: 231.06, provider: { chainId: '0x4', }, preferences: { showFiatInTestnets: true, }, }, }; const store = configureMockStore()(mockStore); const wrapper = mount( , ); expect(wrapper).toHaveLength(1); expect(handleChangeSpy.callCount).toStrictEqual(0); expect(handleBlurSpy.callCount).toStrictEqual(0); const input = wrapper.find('input'); expect(input.props().value).toStrictEqual(0.00432788); input.simulate('change', { target: { value: 1 } }); expect(handleChangeSpy.callCount).toStrictEqual(1); expect(handleChangeSpy.calledWith('de0b6b3a7640000')).toStrictEqual(true); expect(wrapper.find('.currency-display-component').text()).toStrictEqual( '$231.06USD', ); }); it('should call onChange on input changes with the hex value for fiat', () => { const mockStore = { metamask: { nativeCurrency: 'ETH', currentCurrency: 'usd', conversionRate: 231.06, provider: { chainId: '0x4', }, preferences: { showFiatInTestnets: true, }, }, }; const store = configureMockStore()(mockStore); const wrapper = mount( , ); expect(wrapper).toHaveLength(1); expect(handleChangeSpy.callCount).toStrictEqual(1); expect(handleBlurSpy.callCount).toStrictEqual(0); expect(wrapper.find('.currency-display-component').text()).toStrictEqual( '0ETH', ); const input = wrapper.find('input'); expect(input.props().value).toStrictEqual(0); input.simulate('change', { target: { value: 1 } }); expect(handleChangeSpy.callCount).toStrictEqual(2); expect(handleChangeSpy.calledWith('f602f2234d0ea')).toStrictEqual(true); expect(wrapper.find('.currency-display-component').text()).toStrictEqual( '0.00432788ETH', ); }); it('should change the state and pass in a new decimalValue when props.value changes', () => { const mockStore = { metamask: { nativeCurrency: 'ETH', currentCurrency: 'usd', conversionRate: 231.06, provider: { chainId: '0x4', }, preferences: { showFiatInTestnets: true, }, }, }; const store = configureMockStore()(mockStore); const wrapper = mount( , ); expect(wrapper).toHaveLength(1); const input = wrapper.find('input'); expect(input.props().value).toStrictEqual(0); wrapper.setProps({ hexValue: '1ec05e43e72400' }); input.update(); expect(input.props().value).toStrictEqual(0); }); it('should swap selected currency when swap icon is clicked', () => { const mockStore = { metamask: { nativeCurrency: 'ETH', currentCurrency: 'usd', conversionRate: 231.06, provider: { chainId: '0x4', }, preferences: { showFiatInTestnets: true, }, }, }; const store = configureMockStore()(mockStore); const wrapper = mount( , ); expect(wrapper).toHaveLength(1); expect(handleChangeSpy.callCount).toStrictEqual(1); expect(handleBlurSpy.callCount).toStrictEqual(0); expect(wrapper.find('.currency-display-component').text()).toStrictEqual( '0ETH', ); const input = wrapper.find('input'); expect(input.props().value).toStrictEqual(0); input.simulate('change', { target: { value: 1 } }); expect(handleChangeSpy.callCount).toStrictEqual(2); expect(handleChangeSpy.calledWith('de0b6b3a7640000')).toStrictEqual( false, ); expect(wrapper.find('.currency-display-component').text()).toStrictEqual( '0.00432788ETH', ); const swap = wrapper.find('.currency-input__swap-component'); swap.simulate('click'); expect(wrapper.find('.currency-display-component').text()).toStrictEqual( '0.00432788ETH', ); }); }); });