diff --git a/js/src/api/util/identity.js b/js/src/api/util/identity.js index e4a95891f..48a683989 100644 --- a/js/src/api/util/identity.js +++ b/js/src/api/util/identity.js @@ -21,7 +21,7 @@ const TEST_ENV = process.env.NODE_ENV === 'test'; export function createIdentityImg (address, scale = 8) { return TEST_ENV - ? '' + ? 'test-createIdentityImg' : blockies({ seed: (address || '').toLowerCase(), size: 8, diff --git a/js/src/ui/BlockStatus/blockStatus.js b/js/src/ui/BlockStatus/blockStatus.js index f50c7a685..47ee1a1c8 100644 --- a/js/src/ui/BlockStatus/blockStatus.js +++ b/js/src/ui/BlockStatus/blockStatus.js @@ -15,6 +15,7 @@ // along with Parity. If not, see . import React, { Component, PropTypes } from 'react'; +import { FormattedMessage } from 'react-intl'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; @@ -39,7 +40,12 @@ class BlockStatus extends Component { if (!syncing) { return (
- { blockNumber.toFormat() } best block +
); } @@ -47,26 +53,45 @@ class BlockStatus extends Component { if (syncing.warpChunksAmount && syncing.warpChunksProcessed && !syncing.warpChunksAmount.eq(syncing.warpChunksProcessed)) { return (
- { syncing.warpChunksProcessed.mul(100).div(syncing.warpChunksAmount).toFormat(2) }% warp restore +
); } + let syncStatus = null; let warpStatus = null; + if (syncing.currentBlock && syncing.highestBlock) { + syncStatus = ( + + + + ); + } + if (syncing.blockGap) { const [first, last] = syncing.blockGap; warpStatus = ( - , { first.mul(100).div(last).toFormat(2) }% historic - ); - } - - let syncStatus = null; - - if (syncing && syncing.currentBlock && syncing.highestBlock) { - syncStatus = ( - { syncing.currentBlock.toFormat() }/{ syncing.highestBlock.toFormat() } syncing + + + ); } diff --git a/js/src/ui/BlockStatus/blockStatus.spec.js b/js/src/ui/BlockStatus/blockStatus.spec.js new file mode 100644 index 000000000..73358dc90 --- /dev/null +++ b/js/src/ui/BlockStatus/blockStatus.spec.js @@ -0,0 +1,94 @@ +// Copyright 2015, 2016 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BigNumber from 'bignumber.js'; +import { shallow } from 'enzyme'; +import React from 'react'; +import sinon from 'sinon'; + +import BlockStatus from './'; + +let component; + +function createRedux (syncing = false, blockNumber = new BigNumber(123)) { + return { + dispatch: sinon.stub(), + subscribe: sinon.stub(), + getState: () => { + return { + nodeStatus: { + blockNumber, + syncing + } + }; + } + }; +} + +function render (reduxStore = createRedux(), props) { + component = shallow( + , + { context: { store: reduxStore } } + ).find('BlockStatus').shallow(); + + return component; +} + +describe('ui/BlockStatus', () => { + it('renders defaults', () => { + expect(render()).to.be.ok; + }); + + it('renders null with no blockNumber', () => { + expect(render(createRedux(false, null)).find('div')).to.have.length(0); + }); + + it('renders only the best block when syncing === false', () => { + const messages = render().find('FormattedMessage'); + + expect(messages).to.have.length(1); + expect(messages).to.have.id('ui.blockStatus.bestBlock'); + }); + + it('renders only the warp restore status when restoring', () => { + const messages = render(createRedux({ + warpChunksAmount: new BigNumber(100), + warpChunksProcessed: new BigNumber(5) + })).find('FormattedMessage'); + + expect(messages).to.have.length(1); + expect(messages).to.have.id('ui.blockStatus.warpRestore'); + }); + + it('renders the current/highest when syncing', () => { + const messages = render(createRedux({ + currentBlock: new BigNumber(123), + highestBlock: new BigNumber(456) + })).find('FormattedMessage'); + + expect(messages).to.have.length(1); + expect(messages).to.have.id('ui.blockStatus.syncStatus'); + }); + + it('renders warp blockGap when catching up', () => { + const messages = render(createRedux({ + blockGap: [new BigNumber(123), new BigNumber(456)] + })).find('FormattedMessage'); + + expect(messages).to.have.length(1); + expect(messages).to.have.id('ui.blockStatus.warpStatus'); + }); +}); diff --git a/js/src/ui/Button/button.spec.js b/js/src/ui/Button/button.spec.js index 101bb19ac..ce0a8bd38 100644 --- a/js/src/ui/Button/button.spec.js +++ b/js/src/ui/Button/button.spec.js @@ -19,7 +19,11 @@ import { shallow } from 'enzyme'; import Button from './button'; -function renderShallow (props) { +function render (props = {}) { + if (props && props.label === undefined) { + props.label = 'test'; + } + return shallow(