parent
35670e9261
commit
f9aa5a70de
@ -0,0 +1,79 @@ |
|||||||
|
import React, { Component } from 'react' |
||||||
|
import PropTypes from 'prop-types' |
||||||
|
import PageContainer from '../../page-container' |
||||||
|
import { Tabs, Tab } from '../../tabs' |
||||||
|
|
||||||
|
export default class GasModalPageContainer extends Component { |
||||||
|
static contextTypes = { |
||||||
|
t: PropTypes.func, |
||||||
|
} |
||||||
|
|
||||||
|
static propTypes = { |
||||||
|
hideModal: PropTypes.func, |
||||||
|
} |
||||||
|
|
||||||
|
state = {} |
||||||
|
|
||||||
|
renderBasicTabContent () { |
||||||
|
return ( |
||||||
|
<div className="basic-tab"/> |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
renderAdvancedTabContent () { |
||||||
|
return ( |
||||||
|
<div className="advanced-tab"/> |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
renderInfoRow (className, totalLabelKey, fiatTotal, cryptoTotal) { |
||||||
|
return ( |
||||||
|
<div className={className}> |
||||||
|
<div className="total-info"> |
||||||
|
<span className="total-label">{`${this.context.t(totalLabelKey)}:`}</span><span className="total-value">{fiatTotal}</span> |
||||||
|
</div> |
||||||
|
<div className="sum-info"> |
||||||
|
<span className="sum-label">{`${this.context.t('amountPlusTxFee')}`}</span><span className="sum-value">{cryptoTotal}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
renderTabContent (mainTabContent) { |
||||||
|
return ( |
||||||
|
<div className="gas-modal-content"> |
||||||
|
{ mainTabContent() } |
||||||
|
{ this.renderInfoRow('info-row--fade', 'originalTotal', '$20.02 USD', '0.06685 ETH') } |
||||||
|
{ this.renderInfoRow('info-row', 'newTotal', '$20.02 USD', '0.06685 ETH') } |
||||||
|
</div> |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
renderTabs () { |
||||||
|
return ( |
||||||
|
<Tabs> |
||||||
|
<Tab name={this.context.t('basic')}> |
||||||
|
{ this.renderTabContent(this.renderBasicTabContent) } |
||||||
|
</Tab> |
||||||
|
<Tab name={this.context.t('advanced')}> |
||||||
|
{ this.renderTabContent(this.renderAdvancedTabContent) } |
||||||
|
</Tab> |
||||||
|
</Tabs> |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
render () { |
||||||
|
const { hideModal } = this.props |
||||||
|
|
||||||
|
return ( |
||||||
|
<PageContainer |
||||||
|
title={this.context.t('customGas')} |
||||||
|
subtitle={this.context.t('customGasSpeedUp')} |
||||||
|
tabsComponent={this.renderTabs()} |
||||||
|
disabled={false} |
||||||
|
onCancel={() => hideModal()} |
||||||
|
onClose={() => hideModal()} |
||||||
|
/> |
||||||
|
) |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,11 @@ |
|||||||
|
import { connect } from 'react-redux' |
||||||
|
import GasModalPageContainer from './gas-modal-page-container.component' |
||||||
|
import { hideModal } from '../../../actions' |
||||||
|
|
||||||
|
const mapDispatchToProps = dispatch => { |
||||||
|
return { |
||||||
|
hideModal: () => dispatch(hideModal()), |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
export default connect(null, mapDispatchToProps)(GasModalPageContainer) |
@ -0,0 +1 @@ |
|||||||
|
export { default } from './gas-modal-page-container.container' |
@ -0,0 +1,50 @@ |
|||||||
|
.gas-modal-content { |
||||||
|
.basic-tab { |
||||||
|
height: 219px; |
||||||
|
} |
||||||
|
|
||||||
|
.advanced-tab { |
||||||
|
height: 475px; |
||||||
|
} |
||||||
|
|
||||||
|
.info-row, .info-row--fade { |
||||||
|
width: 100%; |
||||||
|
background: $polar; |
||||||
|
padding: 15px 21px; |
||||||
|
display: flex; |
||||||
|
flex-flow: column; |
||||||
|
color: $scorpion; |
||||||
|
|
||||||
|
.total-info, .sum-info { |
||||||
|
display: flex; |
||||||
|
flex-flow: row; |
||||||
|
justify-content: space-between; |
||||||
|
} |
||||||
|
|
||||||
|
.total-info { |
||||||
|
.total-label { |
||||||
|
font-size: 16px; |
||||||
|
} |
||||||
|
|
||||||
|
.total-value { |
||||||
|
font-size: 16px; |
||||||
|
font-weight: bold; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.sum-info { |
||||||
|
.sum-label { |
||||||
|
font-size: 12px; |
||||||
|
} |
||||||
|
|
||||||
|
.sum-value { |
||||||
|
font-size: 14px; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.info-row--fade { |
||||||
|
background: white; |
||||||
|
color: $dusty-gray; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,156 @@ |
|||||||
|
import React from 'react' |
||||||
|
import assert from 'assert' |
||||||
|
import { shallow } from 'enzyme' |
||||||
|
import sinon from 'sinon' |
||||||
|
import GasModalPageContainer from '../gas-modal-page-container.component.js' |
||||||
|
|
||||||
|
import PageContainer from '../../../page-container' |
||||||
|
import { Tab } from '../../../tabs' |
||||||
|
|
||||||
|
const propsMethodSpies = { |
||||||
|
hideModal: sinon.spy(), |
||||||
|
} |
||||||
|
|
||||||
|
describe('GasModalPageContainer Component', function () { |
||||||
|
let wrapper |
||||||
|
|
||||||
|
beforeEach(() => { |
||||||
|
wrapper = shallow(<GasModalPageContainer |
||||||
|
hideModal={propsMethodSpies.hideModal} |
||||||
|
/>, { context: { t: (str1, str2) => str2 ? str1 + str2 : str1 } }) |
||||||
|
}) |
||||||
|
|
||||||
|
afterEach(() => { |
||||||
|
propsMethodSpies.hideModal.resetHistory() |
||||||
|
}) |
||||||
|
|
||||||
|
describe('render', () => { |
||||||
|
it('should render a PageContainer compenent', () => { |
||||||
|
assert.equal(wrapper.find(PageContainer).length, 1) |
||||||
|
}) |
||||||
|
|
||||||
|
it('should pass correct props to PageContainer', () => { |
||||||
|
const { |
||||||
|
title, |
||||||
|
subtitle, |
||||||
|
disabled, |
||||||
|
} = wrapper.find(PageContainer).props() |
||||||
|
assert.equal(title, 'customGas') |
||||||
|
assert.equal(subtitle, 'customGasSpeedUp') |
||||||
|
assert.equal(disabled, false) |
||||||
|
}) |
||||||
|
|
||||||
|
it('should pass the correct onCancel and onClose methods to PageContainer', () => { |
||||||
|
const { |
||||||
|
onCancel, |
||||||
|
onClose, |
||||||
|
} = wrapper.find(PageContainer).props() |
||||||
|
assert.equal(propsMethodSpies.hideModal.callCount, 0) |
||||||
|
onCancel() |
||||||
|
assert.equal(propsMethodSpies.hideModal.callCount, 1) |
||||||
|
onClose() |
||||||
|
assert.equal(propsMethodSpies.hideModal.callCount, 2) |
||||||
|
}) |
||||||
|
|
||||||
|
it('should pass the correct renderTabs property to PageContainer', () => { |
||||||
|
sinon.stub(GasModalPageContainer.prototype, 'renderTabs').returns('mockTabs') |
||||||
|
const renderTabsWrapperTester = shallow(<GasModalPageContainer />, { context: { t: (str1, str2) => str2 ? str1 + str2 : str1 } }) |
||||||
|
const { tabsComponent } = renderTabsWrapperTester.find(PageContainer).props() |
||||||
|
assert.equal(tabsComponent, 'mockTabs') |
||||||
|
GasModalPageContainer.prototype.renderTabs.restore() |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
describe('renderTabs', () => { |
||||||
|
it('should render a Tabs component with "Basic" and "Advanced" tabs', () => { |
||||||
|
const renderTabsResult = wrapper.instance().renderTabs() |
||||||
|
const renderedTabs = shallow(renderTabsResult) |
||||||
|
assert.equal(renderedTabs.props().className, 'tabs') |
||||||
|
|
||||||
|
const tabs = renderedTabs.find(Tab) |
||||||
|
assert.equal(tabs.length, 2) |
||||||
|
|
||||||
|
assert.equal(tabs.at(0).props().name, 'basic') |
||||||
|
assert.equal(tabs.at(1).props().name, 'advanced') |
||||||
|
|
||||||
|
assert.equal(tabs.at(0).childAt(0).props().className, 'gas-modal-content') |
||||||
|
assert.equal(tabs.at(1).childAt(0).props().className, 'gas-modal-content') |
||||||
|
}) |
||||||
|
|
||||||
|
it('should render the expected children of each tab', () => { |
||||||
|
const GP = GasModalPageContainer.prototype |
||||||
|
sinon.spy(GP, 'renderTabContent') |
||||||
|
assert.equal(GP.renderTabContent.callCount, 0) |
||||||
|
|
||||||
|
wrapper.instance().renderTabs() |
||||||
|
|
||||||
|
assert.equal(GP.renderTabContent.callCount, 2) |
||||||
|
|
||||||
|
assert.deepEqual(GP.renderTabContent.firstCall.args, [wrapper.instance().renderBasicTabContent]) |
||||||
|
assert.deepEqual(GP.renderTabContent.secondCall.args, [wrapper.instance().renderAdvancedTabContent]) |
||||||
|
|
||||||
|
GP.renderTabContent.restore() |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
describe('renderTabContent', () => { |
||||||
|
it('should render a root gas-modal-content div', () => { |
||||||
|
const renderTabContentResult = wrapper.instance().renderTabContent(() => {}) |
||||||
|
const renderedTabContent = shallow(renderTabContentResult) |
||||||
|
assert.equal(renderedTabContent.props().className, 'gas-modal-content') |
||||||
|
}) |
||||||
|
|
||||||
|
it('should render the element returned by the passed func as its first child', () => { |
||||||
|
const renderTabContentResult = wrapper.instance().renderTabContent(() => <span>Mock content</span>) |
||||||
|
const renderedTabContent = shallow(renderTabContentResult) |
||||||
|
assert(renderedTabContent.childAt(0).equals(<span>Mock content</span>)) |
||||||
|
}) |
||||||
|
|
||||||
|
it('should render the element results of renderInfoRow calls as second and third childs', () => { |
||||||
|
const GP = GasModalPageContainer.prototype |
||||||
|
sinon.stub(GP, 'renderInfoRow').callsFake((...args) => args.join(',')) |
||||||
|
|
||||||
|
const renderTabContentResult = wrapper.instance().renderTabContent(() => <span>Mock content</span>) |
||||||
|
const renderedTabContent = shallow(renderTabContentResult) |
||||||
|
assert.equal(renderedTabContent.childAt(1).text(), 'info-row--fade,originalTotal,$20.02 USD,0.06685 ETH') |
||||||
|
assert.equal(renderedTabContent.childAt(2).text(), 'info-row,newTotal,$20.02 USD,0.06685 ETH') |
||||||
|
|
||||||
|
GP.renderInfoRow.restore() |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
describe('renderInfoRow', () => { |
||||||
|
it('should render a div with the passed className and two children, each with the expected text', () => { |
||||||
|
const renderInfoRowResult = wrapper.instance().renderInfoRow('mockClassName', 'mockLabelKey', 'mockFiatAmount', 'mockCryptoAmount') |
||||||
|
const renderedInfoRow = shallow(renderInfoRowResult) |
||||||
|
assert.equal(renderedInfoRow.props().className, 'mockClassName') |
||||||
|
|
||||||
|
const firstChild = renderedInfoRow.childAt(0) |
||||||
|
const secondhild = renderedInfoRow.childAt(1) |
||||||
|
|
||||||
|
assert.equal(firstChild.props().className, 'total-info') |
||||||
|
assert.equal(secondhild.props().className, 'sum-info') |
||||||
|
|
||||||
|
assert.equal(firstChild.childAt(0).text(), 'mockLabelKey:') |
||||||
|
assert.equal(firstChild.childAt(1).text(), 'mockFiatAmount') |
||||||
|
assert.equal(secondhild.childAt(0).text(), 'amountPlusTxFee') |
||||||
|
assert.equal(secondhild.childAt(1).text(), 'mockCryptoAmount') |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
describe('renderBasicTabContent', () => { |
||||||
|
it('should render', () => { |
||||||
|
const renderBasicTabContentResult = wrapper.instance().renderBasicTabContent() |
||||||
|
const renderedBasicTabContent = shallow(renderBasicTabContentResult) |
||||||
|
assert.equal(renderedBasicTabContent.props().className, 'basic-tab') |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
describe('renderAdvancedTabContent', () => { |
||||||
|
it('should render', () => { |
||||||
|
const renderAdvancedTabContentResult = wrapper.instance().renderAdvancedTabContent() |
||||||
|
const renderedAdvancedTabContent = shallow(renderAdvancedTabContentResult) |
||||||
|
assert.equal(renderedAdvancedTabContent.props().className, 'advanced-tab') |
||||||
|
}) |
||||||
|
}) |
||||||
|
}) |
@ -0,0 +1,44 @@ |
|||||||
|
import assert from 'assert' |
||||||
|
import proxyquire from 'proxyquire' |
||||||
|
import sinon from 'sinon' |
||||||
|
|
||||||
|
// let mapStateToProps
|
||||||
|
let mapDispatchToProps |
||||||
|
|
||||||
|
const actionSpies = { |
||||||
|
hideModal: sinon.spy(), |
||||||
|
} |
||||||
|
|
||||||
|
proxyquire('../gas-modal-page-container.container.js', { |
||||||
|
'react-redux': { |
||||||
|
connect: (ms, md) => { |
||||||
|
// mapStateToProps = ms
|
||||||
|
mapDispatchToProps = md |
||||||
|
return () => ({}) |
||||||
|
}, |
||||||
|
}, |
||||||
|
'../../../actions': actionSpies, |
||||||
|
}) |
||||||
|
|
||||||
|
describe('gas-modal-page-container container', () => { |
||||||
|
|
||||||
|
describe('mapDispatchToProps()', () => { |
||||||
|
let dispatchSpy |
||||||
|
let mapDispatchToPropsObject |
||||||
|
|
||||||
|
beforeEach(() => { |
||||||
|
dispatchSpy = sinon.spy() |
||||||
|
mapDispatchToPropsObject = mapDispatchToProps(dispatchSpy) |
||||||
|
}) |
||||||
|
|
||||||
|
describe('hideModal()', () => { |
||||||
|
it('should dispatch a hideModal action', () => { |
||||||
|
mapDispatchToPropsObject.hideModal() |
||||||
|
assert(dispatchSpy.calledOnce) |
||||||
|
assert(actionSpies.hideModal.calledOnce) |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
}) |
||||||
|
|
||||||
|
}) |
Loading…
Reference in new issue