import React from 'react'; import sinon from 'sinon'; import { shallowWithContext } from '../../../../../test/lib/render-helpers'; import { GAS_ESTIMATE_TYPES } from '../../../../helpers/constants/common'; import ButtonGroup from '../../../ui/button-group'; import GasPriceButtonGroup from './gas-price-button-group.component'; describe('GasPriceButtonGroup Component', () => { let mockButtonPropsAndFlags; let mockGasPriceButtonGroupProps; let wrapper; beforeEach(() => { mockGasPriceButtonGroupProps = { buttonDataLoading: false, className: 'gas-price-button-group', gasButtonInfo: [ { gasEstimateType: GAS_ESTIMATE_TYPES.SLOW, feeInPrimaryCurrency: '$0.52', feeInSecondaryCurrency: '0.0048 ETH', timeEstimate: '~ 1 min 0 sec', priceInHexWei: '0xa1b2c3f', }, { gasEstimateType: GAS_ESTIMATE_TYPES.AVERAGE, feeInPrimaryCurrency: '$0.39', feeInSecondaryCurrency: '0.004 ETH', timeEstimate: '~ 1 min 30 sec', priceInHexWei: '0xa1b2c39', }, { gasEstimateType: GAS_ESTIMATE_TYPES.FAST, feeInPrimaryCurrency: '$0.30', feeInSecondaryCurrency: '0.00354 ETH', timeEstimate: '~ 2 min 1 sec', priceInHexWei: '0xa1b2c30', }, ], handleGasPriceSelection: sinon.spy(), noButtonActiveByDefault: true, defaultActiveButtonIndex: 2, showCheck: true, }; mockButtonPropsAndFlags = { className: mockGasPriceButtonGroupProps.className, handleGasPriceSelection: mockGasPriceButtonGroupProps.handleGasPriceSelection, showCheck: mockGasPriceButtonGroupProps.showCheck, }; sinon.spy(GasPriceButtonGroup.prototype, 'renderButton'); sinon.spy(GasPriceButtonGroup.prototype, 'renderButtonContent'); wrapper = shallowWithContext( , ); }); afterEach(() => { sinon.restore(); }); describe('render', () => { it('should render a ButtonGroup', () => { expect(wrapper.is(ButtonGroup)).toStrictEqual(true); }); it('should render the correct props on the ButtonGroup', () => { const { className, defaultActiveButtonIndex, noButtonActiveByDefault, } = wrapper.props(); expect(className).toStrictEqual('gas-price-button-group'); expect(defaultActiveButtonIndex).toStrictEqual(2); expect(noButtonActiveByDefault).toStrictEqual(true); }); function renderButtonArgsTest(i, mockPropsAndFlags) { expect( GasPriceButtonGroup.prototype.renderButton.getCall(i).args, ).toStrictEqual([ { ...mockGasPriceButtonGroupProps.gasButtonInfo[i] }, mockPropsAndFlags, i, ]); } it('should call this.renderButton 3 times, with the correct args', () => { expect( GasPriceButtonGroup.prototype.renderButton.callCount, ).toStrictEqual(3); renderButtonArgsTest(0, mockButtonPropsAndFlags); renderButtonArgsTest(1, mockButtonPropsAndFlags); renderButtonArgsTest(2, mockButtonPropsAndFlags); }); it('should show loading if buttonDataLoading', () => { wrapper.setProps({ buttonDataLoading: true }); expect(wrapper.is('div')).toStrictEqual(true); expect( wrapper.hasClass('gas-price-button-group__loading-container'), ).toStrictEqual(true); expect(wrapper.text()).toStrictEqual('loading'); }); }); describe('renderButton', () => { let wrappedRenderButtonResult; beforeEach(() => { GasPriceButtonGroup.prototype.renderButtonContent.resetHistory(); const renderButtonResult = wrapper .instance() .renderButton( { ...mockGasPriceButtonGroupProps.gasButtonInfo[0] }, mockButtonPropsAndFlags, ); wrappedRenderButtonResult = shallowWithContext(renderButtonResult); }); it('should render a button', () => { expect(wrappedRenderButtonResult.type()).toStrictEqual('button'); }); it('should call the correct method when clicked', () => { expect( mockGasPriceButtonGroupProps.handleGasPriceSelection.callCount, ).toStrictEqual(0); wrappedRenderButtonResult.props().onClick(); expect( mockGasPriceButtonGroupProps.handleGasPriceSelection.callCount, ).toStrictEqual(1); expect( mockGasPriceButtonGroupProps.handleGasPriceSelection.getCall(0).args, ).toStrictEqual([ { gasPrice: mockGasPriceButtonGroupProps.gasButtonInfo[0].priceInHexWei, gasEstimateType: mockGasPriceButtonGroupProps.gasButtonInfo[0].gasEstimateType, }, ]); }); it('should call this.renderButtonContent with the correct args', () => { expect( GasPriceButtonGroup.prototype.renderButtonContent.callCount, ).toStrictEqual(1); const { feeInPrimaryCurrency, feeInSecondaryCurrency, timeEstimate, gasEstimateType, } = mockGasPriceButtonGroupProps.gasButtonInfo[0]; const { showCheck, className } = mockGasPriceButtonGroupProps; expect( GasPriceButtonGroup.prototype.renderButtonContent.getCall(0).args, ).toStrictEqual([ { gasEstimateType, feeInPrimaryCurrency, feeInSecondaryCurrency, timeEstimate, }, { showCheck, className, }, ]); }); }); describe('renderButtonContent', () => { it('should render a label if passed a gasEstimateType', () => { const renderButtonContentResult = wrapper.instance().renderButtonContent( { gasEstimateType: 'SLOW', }, { className: 'someClass', }, ); const wrappedRenderButtonContentResult = shallowWithContext( renderButtonContentResult, ); expect( wrappedRenderButtonContentResult.childAt(0).children(), ).toHaveLength(1); expect( wrappedRenderButtonContentResult.find('.someClass__label').text(), ).toStrictEqual('slow'); }); it('should render a feeInPrimaryCurrency if passed a feeInPrimaryCurrency', () => { const renderButtonContentResult = GasPriceButtonGroup.prototype.renderButtonContent( { feeInPrimaryCurrency: 'mockFeeInPrimaryCurrency', }, { className: 'someClass', }, ); const wrappedRenderButtonContentResult = shallowWithContext( renderButtonContentResult, ); expect( wrappedRenderButtonContentResult.childAt(0).children(), ).toHaveLength(1); expect( wrappedRenderButtonContentResult .find('.someClass__primary-currency') .text(), ).toStrictEqual('mockFeeInPrimaryCurrency'); }); it('should render a feeInSecondaryCurrency if passed a feeInSecondaryCurrency', () => { const renderButtonContentResult = GasPriceButtonGroup.prototype.renderButtonContent( { feeInSecondaryCurrency: 'mockFeeInSecondaryCurrency', }, { className: 'someClass', }, ); const wrappedRenderButtonContentResult = shallowWithContext( renderButtonContentResult, ); expect( wrappedRenderButtonContentResult.childAt(0).children(), ).toHaveLength(1); expect( wrappedRenderButtonContentResult .find('.someClass__secondary-currency') .text(), ).toStrictEqual('mockFeeInSecondaryCurrency'); }); it('should render a timeEstimate if passed a timeEstimate', () => { const renderButtonContentResult = GasPriceButtonGroup.prototype.renderButtonContent( { timeEstimate: 'mockTimeEstimate', }, { className: 'someClass', }, ); const wrappedRenderButtonContentResult = shallowWithContext( renderButtonContentResult, ); expect( wrappedRenderButtonContentResult.childAt(0).children(), ).toHaveLength(1); expect( wrappedRenderButtonContentResult .find('.someClass__time-estimate') .text(), ).toStrictEqual('mockTimeEstimate'); }); it('should render a check if showCheck is true', () => { const renderButtonContentResult = GasPriceButtonGroup.prototype.renderButtonContent( {}, { className: 'someClass', showCheck: true, }, ); const wrappedRenderButtonContentResult = shallowWithContext( renderButtonContentResult, ); expect(wrappedRenderButtonContentResult.find('.fa-check')).toHaveLength( 1, ); }); it('should render all elements if all args passed', () => { const renderButtonContentResult = wrapper.instance().renderButtonContent( { gasEstimateType: 'SLOW', feeInPrimaryCurrency: 'mockFeeInPrimaryCurrency', feeInSecondaryCurrency: 'mockFeeInSecondaryCurrency', timeEstimate: 'mockTimeEstimate', }, { className: 'someClass', showCheck: true, }, ); const wrappedRenderButtonContentResult = shallowWithContext( renderButtonContentResult, ); expect(wrappedRenderButtonContentResult.children()).toHaveLength(5); }); it('should render no elements if all args passed', () => { const renderButtonContentResult = GasPriceButtonGroup.prototype.renderButtonContent( {}, {}, ); const wrappedRenderButtonContentResult = shallowWithContext( renderButtonContentResult, ); expect(wrappedRenderButtonContentResult.children()).toHaveLength(0); }); }); });