Use shallow-only rendering in all tests (#4087)

* Container/Title with shallow

* IdentityName with shallow

* IdentityIcon with shallow

* TypedInput to shallow

* DetailsStep to shallow
This commit is contained in:
Jaco Greeff 2017-01-09 12:40:29 +01:00 committed by Gav Wood
parent 4c94878cf7
commit 378739fae1
7 changed files with 61 additions and 83 deletions

View File

@ -14,15 +14,13 @@
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>. // along with Parity. If not, see <http://www.gnu.org/licenses/>.
import { mount } from 'enzyme'; import { shallow } from 'enzyme';
import React from 'react'; import React from 'react';
import sinon from 'sinon'; import sinon from 'sinon';
import { ContextProvider, muiTheme } from '~/ui';
import DetailsStep from './'; import DetailsStep from './';
import { createApi, STORE, CONTRACT } from '../executeContract.test.js'; import { CONTRACT } from '../executeContract.test.js';
let component; let component;
let onAmountChange; let onAmountChange;
@ -40,8 +38,7 @@ function render (props) {
onGasEditClick = sinon.stub(); onGasEditClick = sinon.stub();
onValueChange = sinon.stub(); onValueChange = sinon.stub();
component = mount( component = shallow(
<ContextProvider api={ createApi() } muiTheme={ muiTheme } store={ STORE }>
<DetailsStep <DetailsStep
{ ...props } { ...props }
contract={ CONTRACT } contract={ CONTRACT }
@ -51,7 +48,6 @@ function render (props) {
onFuncChange={ onFuncChange } onFuncChange={ onFuncChange }
onGasEditClick={ onGasEditClick } onGasEditClick={ onGasEditClick }
onValueChange={ onValueChange } /> onValueChange={ onValueChange } />
</ContextProvider>
); );
return component; return component;
@ -74,7 +70,7 @@ describe('modals/ExecuteContract/DetailsStep', () => {
describe('bool parameters', () => { describe('bool parameters', () => {
it('toggles from false to true', () => { it('toggles from false to true', () => {
component.find('DropDownMenu').last().simulate('change', { target: { value: 'true' } }); component.find('TypedInput').last().shallow().simulate('change', { target: { value: 'true' } });
expect(onValueChange).to.have.been.calledWith(null, 0, true); expect(onValueChange).to.have.been.calledWith(null, 0, true);
}); });

View File

@ -15,38 +15,32 @@
// along with Parity. If not, see <http://www.gnu.org/licenses/>. // along with Parity. If not, see <http://www.gnu.org/licenses/>.
import React from 'react'; import React from 'react';
import { mount, shallow } from 'enzyme'; import { shallow } from 'enzyme';
import Title from './title'; import Title from './title';
function renderShallow (props) { function render (props) {
return shallow( return shallow(
<Title { ...props } /> <Title { ...props } />
); );
} }
function renderMount (props) {
return mount(
<Title { ...props } />
);
}
describe('ui/Container/Title', () => { describe('ui/Container/Title', () => {
describe('rendering', () => { describe('rendering', () => {
it('renders defaults', () => { it('renders defaults', () => {
expect(renderShallow()).to.be.ok; expect(render()).to.be.ok;
}); });
it('renders with the specified className', () => { it('renders with the specified className', () => {
expect(renderShallow({ className: 'testClass' })).to.have.className('testClass'); expect(render({ className: 'testClass' })).to.have.className('testClass');
}); });
it('renders the specified title', () => { it('renders the specified title', () => {
expect(renderMount({ title: 'titleText' })).to.contain.text('titleText'); expect(render({ title: 'titleText' })).to.contain.text('titleText');
}); });
it('renders the specified byline', () => { it('renders the specified byline', () => {
expect(renderMount({ byline: 'bylineText' })).to.contain.text('bylineText'); expect(render({ byline: 'bylineText' })).to.contain.text('bylineText');
}); });
}); });
}); });

View File

@ -14,27 +14,26 @@
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>. // along with Parity. If not, see <http://www.gnu.org/licenses/>.
import { mount } from 'enzyme'; import { shallow } from 'enzyme';
import React from 'react'; import React from 'react';
import sinon from 'sinon'; import sinon from 'sinon';
import { ContextProvider, muiTheme } from '~/ui';
import { ABI_TYPES } from '~/util/abi'; import { ABI_TYPES } from '~/util/abi';
import TypedInput from './'; import TypedInput from './';
let component; let component;
let select;
let onChange; let onChange;
function render (props) { function render (props) {
onChange = sinon.stub(); onChange = sinon.stub();
component = mount( component = shallow(
<ContextProvider api={ {} } muiTheme={ muiTheme } store={ {} }>
<TypedInput <TypedInput
{ ...props } { ...props }
onChange={ onChange } /> onChange={ onChange } />
</ContextProvider>
); );
select = component.find('Select');
return component; return component;
} }
@ -50,19 +49,19 @@ describe('ui/Form/TypedInput', () => {
}); });
it('calls onChange when value changes', () => { it('calls onChange when value changes', () => {
component.find('DropDownMenu').simulate('change', { target: { value: 'true' } }); select.shallow().simulate('change', { target: { value: 'true' } });
expect(onChange).to.have.been.called; expect(onChange).to.have.been.called;
}); });
it("calls onChange(true) when value changes to 'true'", () => { it("calls onChange(true) when value changes to 'true'", () => {
component.find('DropDownMenu').simulate('change', { target: { value: 'true' } }); select.shallow().simulate('change', { target: { value: 'true' } });
expect(onChange).to.have.been.calledWith(true); expect(onChange).to.have.been.calledWith(true);
}); });
it("calls onChange(false) when value changes to 'false'", () => { it("calls onChange(false) when value changes to 'false'", () => {
component.find('DropDownMenu').simulate('change', { target: { value: 'false' } }); select.shallow().simulate('change', { target: { value: 'false' } });
expect(onChange).to.have.been.calledWith(false); expect(onChange).to.have.been.calledWith(false);
}); });

View File

@ -16,7 +16,6 @@
import React, { Component, PropTypes } from 'react'; import React, { Component, PropTypes } from 'react';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import { createIdentityImg } from '~/api/util/identity'; import { createIdentityImg } from '~/api/util/identity';
import { isNullAddress } from '~/util/validation'; import { isNullAddress } from '~/util/validation';
@ -145,11 +144,7 @@ function mapStateToProps (state) {
return { images }; return { images };
} }
function mapDispatchToProps (dispatch) {
return bindActionCreators({}, dispatch);
}
export default connect( export default connect(
mapStateToProps, mapStateToProps,
mapDispatchToProps null
)(IdentityIcon); )(IdentityIcon);

View File

@ -14,12 +14,10 @@
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>. // along with Parity. If not, see <http://www.gnu.org/licenses/>.
import { mount } from 'enzyme'; import { shallow } from 'enzyme';
import React, { PropTypes } from 'react'; import React from 'react';
import sinon from 'sinon'; import sinon from 'sinon';
import muiTheme from '../Theme';
import IdentityIcon from './'; import IdentityIcon from './';
const ADDRESS0 = '0x0000000000000000000000000000000000000000'; const ADDRESS0 = '0x0000000000000000000000000000000000000000';
@ -27,6 +25,7 @@ const ADDRESS1 = '0x0123456789012345678901234567890123456789';
const ADDRESS2 = '0x9876543210987654321098765432109876543210'; const ADDRESS2 = '0x9876543210987654321098765432109876543210';
let component; let component;
let instance;
function createApi () { function createApi () {
return { return {
@ -53,20 +52,13 @@ function render (props = {}) {
props.address = ADDRESS1; props.address = ADDRESS1;
} }
component = mount( component = shallow(
<IdentityIcon { ...props } />, <IdentityIcon { ...props } />,
{ { context: { store: createRedux() } }
childContextTypes: { ).find('IdentityIcon').shallow({ context: { api: createApi() } });
api: PropTypes.object,
muiTheme: PropTypes.object instance = component.instance();
}, instance.componentDidMount();
context: {
api: createApi(),
muiTheme,
store: createRedux()
}
}
);
return component; return component;
} }

View File

@ -17,7 +17,6 @@
import React, { Component, PropTypes } from 'react'; import React, { Component, PropTypes } from 'react';
import { FormattedMessage } from 'react-intl'; import { FormattedMessage } from 'react-intl';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import { isNullAddress } from '~/util/validation'; import { isNullAddress } from '~/util/validation';
import ShortenedHash from '../ShortenedHash'; import ShortenedHash from '../ShortenedHash';
@ -85,11 +84,7 @@ function mapStateToProps (state) {
}; };
} }
function mapDispatchToProps (dispatch) {
return bindActionCreators({}, dispatch);
}
export default connect( export default connect(
mapStateToProps, mapStateToProps,
mapDispatchToProps null
)(IdentityName); )(IdentityName);

View File

@ -14,9 +14,8 @@
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>. // along with Parity. If not, see <http://www.gnu.org/licenses/>.
import { mount } from 'enzyme'; import { shallow } from 'enzyme';
import React from 'react'; import React from 'react';
import { IntlProvider } from 'react-intl';
import sinon from 'sinon'; import sinon from 'sinon';
@ -45,13 +44,11 @@ const STORE = {
}; };
function render (props) { function render (props) {
return mount( return shallow(
<IntlProvider locale='en'>
<IdentityName <IdentityName
store={ STORE } store={ STORE }
{ ...props } /> { ...props } />
</IntlProvider> ).find('IdentityName').shallow();
);
} }
describe('ui/IdentityName', () => { describe('ui/IdentityName', () => {
@ -62,23 +59,33 @@ describe('ui/IdentityName', () => {
describe('account not found', () => { describe('account not found', () => {
it('renders null with empty', () => { it('renders null with empty', () => {
expect(render({ address: ADDR_C, empty: true }).html()).to.be.null; expect(
render({ address: ADDR_C, empty: true }).html()
).to.be.null;
}); });
it('renders address without empty', () => { it('renders address without empty', () => {
expect(render({ address: ADDR_C }).text()).to.equal(ADDR_C); expect(
render({ address: ADDR_C }).text()
).to.equal(ADDR_C);
}); });
it('renders short address with shorten', () => { it('renders short address with shorten', () => {
expect(render({ address: ADDR_C, shorten: true }).text()).to.equal('123456…56789c'); expect(
render({ address: ADDR_C, shorten: true }).find('ShortenedHash').props().data
).to.equal(ADDR_C);
}); });
it('renders unknown with flag', () => { it('renders unknown with flag', () => {
expect(render({ address: ADDR_C, unknown: true }).text()).to.equal('UNNAMED'); expect(
render({ address: ADDR_C, unknown: true }
).find('FormattedMessage').props().id).to.equal('ui.identityName.unnamed');
}); });
it('renders 0x000...000 as null', () => { it('renders 0x000...000 as null', () => {
expect(render({ address: ADDR_NULL }).text()).to.equal('NULL'); expect(
render({ address: ADDR_NULL }).find('FormattedMessage').props().id
).to.equal('ui.identityName.null');
}); });
}); });
}); });