import sinon from 'sinon'; import { hideModal } from '../../../../store/actions'; import { setCustomGasPrice, setCustomGasLimit, resetCustomData, } from '../../../../ducks/gas/gas.duck'; import { useCustomGas, updateGasLimit, updateGasPrice, } from '../../../../ducks/send'; let mapDispatchToProps; let mergeProps; jest.mock('react-redux', () => ({ connect: (_, md, mp) => { mapDispatchToProps = md; mergeProps = mp; return () => ({}); }, })); jest.mock('../../../../selectors', () => ({ getBasicGasEstimateLoadingStatus: (s) => `mockBasicGasEstimateLoadingStatus:${Object.keys(s).length}`, getRenderableBasicEstimateData: (s) => `mockRenderableBasicEstimateData:${Object.keys(s).length}`, getDefaultActiveButtonIndex: (a, b) => a + b, getCurrentEthBalance: (state) => state.metamask.balance || '0x0', getCustomGasPrice: (state) => state.gas.customData.price || '0x0', getCustomGasLimit: (state) => state.gas.customData.limit || '0x0', getCurrentCurrency: jest.fn().mockReturnValue('usd'), conversionRateSelector: jest.fn().mockReturnValue(50), getSendMaxModeState: jest.fn().mockReturnValue(false), getPreferences: jest.fn(() => ({ showFiatInTestnets: false, })), getIsMainnet: jest.fn().mockReturnValue(false), isCustomPriceSafe: jest.fn().mockReturnValue(true), })); jest.mock('../../../../store/actions', () => ({ hideModal: jest.fn(), updateTransaction: jest.fn(), })); jest.mock('../../../../ducks/metamask/metamask.js', () => ({ updateTransactionGasFees: jest.fn(), })); jest.mock('../../../../ducks/gas/gas.duck', () => ({ setCustomGasPrice: jest.fn(), setCustomGasLimit: jest.fn(), resetCustomData: jest.fn(), })); jest.mock('../../../../ducks/send', () => { const { ASSET_TYPES } = jest.requireActual('../../../../ducks/send'); return { useCustomGas: jest.fn(), updateGasLimit: jest.fn(), updateGasPrice: jest.fn(), getSendAsset: jest.fn(() => ({ type: ASSET_TYPES.NATIVE })), }; }); require('./gas-modal-page-container.container'); describe('gas-modal-page-container container', () => { describe('mapDispatchToProps()', () => { let dispatchSpy; let mapDispatchToPropsObject; beforeEach(() => { dispatchSpy = sinon.spy(); mapDispatchToPropsObject = mapDispatchToProps(dispatchSpy); }); afterEach(() => { dispatchSpy.resetHistory(); jest.clearAllMocks(); }); describe('useCustomGas()', () => { it('should dispatch a useCustomGas action', () => { mapDispatchToPropsObject.useCustomGas(); expect(dispatchSpy.calledOnce).toStrictEqual(true); expect(useCustomGas).toHaveBeenCalled(); }); }); describe('cancelAndClose()', () => { it('should dispatch a hideModal action', () => { mapDispatchToPropsObject.cancelAndClose(); expect(dispatchSpy.calledTwice).toStrictEqual(true); expect(hideModal).toHaveBeenCalled(); expect(resetCustomData).toHaveBeenCalled(); }); }); describe('updateCustomGasPrice()', () => { it('should dispatch a setCustomGasPrice action with the arg passed to updateCustomGasPrice hex prefixed', () => { mapDispatchToPropsObject.updateCustomGasPrice('ffff'); expect(dispatchSpy.calledOnce).toStrictEqual(true); expect(setCustomGasPrice).toHaveBeenCalled(); expect(setCustomGasPrice).toHaveBeenCalledWith('0xffff'); // expect( // setCustomGasPrice.getCall(0).args[0], // '0xffff', // ); }); it('should dispatch a setCustomGasPrice action', () => { mapDispatchToPropsObject.updateCustomGasPrice('0xffff'); expect(dispatchSpy.calledOnce).toStrictEqual(true); expect(setCustomGasPrice).toHaveBeenCalled(); expect(setCustomGasPrice).toHaveBeenCalledWith('0xffff'); }); }); describe('updateCustomGasLimit()', () => { it('should dispatch a setCustomGasLimit action', () => { mapDispatchToPropsObject.updateCustomGasLimit('0x10'); expect(dispatchSpy.calledOnce).toStrictEqual(true); expect(setCustomGasLimit).toHaveBeenCalled(); expect(setCustomGasLimit).toHaveBeenCalledWith('0x10'); }); }); describe('setGasData()', () => { it('should dispatch a updateGasPrice and updateGasLimit action with the correct props', () => { mapDispatchToPropsObject.setGasData('ffff', 'aaaa'); expect(dispatchSpy.calledTwice).toStrictEqual(true); expect(updateGasPrice).toHaveBeenCalled(); expect(updateGasLimit).toHaveBeenCalled(); expect(updateGasLimit).toHaveBeenCalledWith('ffff'); expect(updateGasPrice).toHaveBeenCalledWith('aaaa'); }); }); }); describe('mergeProps', () => { let stateProps; let dispatchProps; let ownProps; beforeEach(() => { stateProps = { gasPriceButtonGroupProps: { someGasPriceButtonGroupProp: 'foo', anotherGasPriceButtonGroupProp: 'bar', }, isConfirm: true, someOtherStateProp: 'baz', transaction: {}, }; dispatchProps = { updateCustomGasPrice: sinon.spy(), useCustomGas: sinon.spy(), setGasData: sinon.spy(), updateTransactionGasFees: sinon.spy(), someOtherDispatchProp: sinon.spy(), createSpeedUpTransaction: sinon.spy(), hideModal: sinon.spy(), cancelAndClose: sinon.spy(), }; ownProps = { someOwnProp: 123 }; }); it('should return the expected props when isConfirm is true', () => { const result = mergeProps(stateProps, dispatchProps, ownProps); expect(result.isConfirm).toStrictEqual(true); expect(result.someOtherStateProp).toStrictEqual('baz'); expect( result.gasPriceButtonGroupProps.someGasPriceButtonGroupProp, ).toStrictEqual('foo'); expect( result.gasPriceButtonGroupProps.anotherGasPriceButtonGroupProp, ).toStrictEqual('bar'); expect(result.someOwnProp).toStrictEqual(123); expect(dispatchProps.updateTransactionGasFees.callCount).toStrictEqual(0); expect(dispatchProps.setGasData.callCount).toStrictEqual(0); expect(dispatchProps.useCustomGas.callCount).toStrictEqual(0); expect(dispatchProps.hideModal.callCount).toStrictEqual(0); result.onSubmit(); expect(dispatchProps.updateTransactionGasFees.callCount).toStrictEqual(1); expect(dispatchProps.setGasData.callCount).toStrictEqual(0); expect(dispatchProps.useCustomGas.callCount).toStrictEqual(0); expect(dispatchProps.hideModal.callCount).toStrictEqual(1); expect(dispatchProps.updateCustomGasPrice.callCount).toStrictEqual(0); result.gasPriceButtonGroupProps.handleGasPriceSelection({ gasPrice: '0x0', }); expect(dispatchProps.updateCustomGasPrice.callCount).toStrictEqual(1); expect(dispatchProps.someOtherDispatchProp.callCount).toStrictEqual(0); result.someOtherDispatchProp(); expect(dispatchProps.someOtherDispatchProp.callCount).toStrictEqual(1); }); it('should return the expected props when isConfirm is false', () => { const result = mergeProps( { ...stateProps, isConfirm: false }, dispatchProps, ownProps, ); expect(result.isConfirm).toStrictEqual(false); expect(result.someOtherStateProp).toStrictEqual('baz'); expect( result.gasPriceButtonGroupProps.someGasPriceButtonGroupProp, ).toStrictEqual('foo'); expect( result.gasPriceButtonGroupProps.anotherGasPriceButtonGroupProp, ).toStrictEqual('bar'); expect(result.someOwnProp).toStrictEqual(123); expect(dispatchProps.updateTransactionGasFees.callCount).toStrictEqual(0); expect(dispatchProps.setGasData.callCount).toStrictEqual(0); expect(dispatchProps.useCustomGas.callCount).toStrictEqual(0); expect(dispatchProps.cancelAndClose.callCount).toStrictEqual(0); result.onSubmit('mockNewLimit', 'mockNewPrice'); expect(dispatchProps.updateTransactionGasFees.callCount).toStrictEqual(0); expect(dispatchProps.setGasData.callCount).toStrictEqual(1); expect(dispatchProps.setGasData.getCall(0).args).toStrictEqual([ 'mockNewLimit', 'mockNewPrice', ]); expect(dispatchProps.useCustomGas.callCount).toStrictEqual(1); expect(dispatchProps.cancelAndClose.callCount).toStrictEqual(1); expect(dispatchProps.updateCustomGasPrice.callCount).toStrictEqual(0); result.gasPriceButtonGroupProps.handleGasPriceSelection({ gasPrice: '0x0', }); expect(dispatchProps.updateCustomGasPrice.callCount).toStrictEqual(1); expect(dispatchProps.someOtherDispatchProp.callCount).toStrictEqual(0); result.someOtherDispatchProp(); expect(dispatchProps.someOtherDispatchProp.callCount).toStrictEqual(1); }); it('should dispatch the expected actions from obSubmit when isConfirm is false and isSpeedUp is true', () => { const result = mergeProps( { ...stateProps, isSpeedUp: true, isConfirm: false }, dispatchProps, ownProps, ); result.onSubmit(); expect(dispatchProps.updateTransactionGasFees.callCount).toStrictEqual(0); expect(dispatchProps.setGasData.callCount).toStrictEqual(0); expect(dispatchProps.useCustomGas.callCount).toStrictEqual(0); expect(dispatchProps.cancelAndClose.callCount).toStrictEqual(1); expect(dispatchProps.createSpeedUpTransaction.callCount).toStrictEqual(1); }); }); });