|
|
|
@ -5,36 +5,59 @@ import sinon from 'sinon' |
|
|
|
|
import shallow from '../../../../../lib/shallow-with-context' |
|
|
|
|
import * as d3 from 'd3' |
|
|
|
|
|
|
|
|
|
const mockSelectReturn = { |
|
|
|
|
...d3.select('div'), |
|
|
|
|
node: () => ({ |
|
|
|
|
getBoundingClientRect: () => ({ x: 123, y: 321, width: 400 }), |
|
|
|
|
}), |
|
|
|
|
function timeout (time) { |
|
|
|
|
return new Promise((resolve, reject) => { |
|
|
|
|
setTimeout(resolve, time) |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const propsMethodSpies = { |
|
|
|
|
updateCustomGasPrice: sinon.spy(), |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const selectReturnSpies = { |
|
|
|
|
empty: sinon.spy(), |
|
|
|
|
remove: sinon.spy(), |
|
|
|
|
style: sinon.spy(), |
|
|
|
|
select: d3.select, |
|
|
|
|
attr: sinon.spy(), |
|
|
|
|
on: sinon.spy(), |
|
|
|
|
datum: sinon.stub().returns({ x: 'mockX' }), |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const mockSelectReturn = { |
|
|
|
|
...d3.select('div'), |
|
|
|
|
node: () => ({ |
|
|
|
|
getBoundingClientRect: () => ({ x: 123, y: 321, width: 400 }), |
|
|
|
|
}), |
|
|
|
|
...selectReturnSpies, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const gasPriceChartUtilsSpies = { |
|
|
|
|
appendOrUpdateCircle: sinon.spy(), |
|
|
|
|
generateChart: sinon.stub().returns({ mockChart: true }), |
|
|
|
|
generateDataUIObj: sinon.spy(), |
|
|
|
|
getAdjacentGasPrices: sinon.spy(), |
|
|
|
|
getCoordinateData: sinon.stub().returns({ x: 'mockCoordinateX', width: 'mockWidth' }), |
|
|
|
|
getNewXandTimeEstimate: sinon.spy(), |
|
|
|
|
handleChartUpdate: sinon.spy(), |
|
|
|
|
hideDataUI: sinon.spy(), |
|
|
|
|
setSelectedCircle: sinon.spy(), |
|
|
|
|
setTickPosition: sinon.spy(), |
|
|
|
|
handleMouseMove: sinon.spy(), |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const testProps = { |
|
|
|
|
gasPrices: [1.5, 2.5, 4, 8], |
|
|
|
|
estimatedTimes: [100, 80, 40, 10], |
|
|
|
|
gasPricesMax: 9, |
|
|
|
|
estimatedTimesMax: 100, |
|
|
|
|
currentPrice: 6, |
|
|
|
|
updateCustomGasPrice: propsMethodSpies.updateCustomGasPrice, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const GasPriceChart = proxyquire('../gas-price-chart.component.js', { |
|
|
|
|
'c3': { |
|
|
|
|
generate: function ({ data: { columns } }) { |
|
|
|
|
return { |
|
|
|
|
internal: { |
|
|
|
|
showTooltip: () => {}, |
|
|
|
|
showXGridFocus: () => {}, |
|
|
|
|
hideXGridFocus: () => {}, |
|
|
|
|
data: { |
|
|
|
|
xs: { |
|
|
|
|
[columns[1][0]]: columns[1].slice(1), |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
'./gas-price-chart.utils.js': gasPriceChartUtilsSpies, |
|
|
|
|
'd3': { |
|
|
|
|
...d3, |
|
|
|
|
select: function (...args) { |
|
|
|
@ -43,20 +66,19 @@ const GasPriceChart = proxyquire('../gas-price-chart.component.js', { |
|
|
|
|
? mockSelectReturn |
|
|
|
|
: result |
|
|
|
|
}, |
|
|
|
|
event: { |
|
|
|
|
clientX: 'mockClientX', |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
}).default |
|
|
|
|
|
|
|
|
|
sinon.spy(GasPriceChart.prototype, 'renderChart') |
|
|
|
|
|
|
|
|
|
describe('GasPriceChart Component', function () { |
|
|
|
|
let wrapper |
|
|
|
|
|
|
|
|
|
beforeEach(() => { |
|
|
|
|
wrapper = shallow(<GasPriceChart |
|
|
|
|
priceAndTimeEstimates={[ |
|
|
|
|
{ gasprice: 1, expectedTime: 10 }, |
|
|
|
|
{ gasprice: 2, expectedTime: 20 }, |
|
|
|
|
{ gasprice: 3, expectedTime: 30 }, |
|
|
|
|
]} |
|
|
|
|
/>) |
|
|
|
|
wrapper = shallow(<GasPriceChart {...testProps} />) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
describe('render()', () => { |
|
|
|
@ -70,4 +92,127 @@ describe('GasPriceChart Component', function () { |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
describe('componentDidMount', () => { |
|
|
|
|
it('should call this.renderChart with the components props', () => { |
|
|
|
|
assert(GasPriceChart.prototype.renderChart.callCount, 1) |
|
|
|
|
wrapper.instance().componentDidMount() |
|
|
|
|
assert(GasPriceChart.prototype.renderChart.callCount, 2) |
|
|
|
|
assert.deepEqual(GasPriceChart.prototype.renderChart.getCall(1).args, [{...testProps}]) |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
describe('componentDidUpdate', () => { |
|
|
|
|
it('should call handleChartUpdate if props.currentPrice has changed', () => { |
|
|
|
|
gasPriceChartUtilsSpies.handleChartUpdate.resetHistory() |
|
|
|
|
wrapper.instance().componentDidUpdate({ currentPrice: 7 }) |
|
|
|
|
assert.equal(gasPriceChartUtilsSpies.handleChartUpdate.callCount, 1) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
it('should call handleChartUpdate with the correct props', () => { |
|
|
|
|
gasPriceChartUtilsSpies.handleChartUpdate.resetHistory() |
|
|
|
|
wrapper.instance().componentDidUpdate({ currentPrice: 7 }) |
|
|
|
|
assert.deepEqual(gasPriceChartUtilsSpies.handleChartUpdate.getCall(0).args, [{ |
|
|
|
|
chart: { mockChart: true }, |
|
|
|
|
gasPrices: [1.5, 2.5, 4, 8], |
|
|
|
|
newPrice: 6, |
|
|
|
|
cssId: '#set-circle', |
|
|
|
|
}]) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
it('should not call handleChartUpdate if props.currentPrice has not changed', () => { |
|
|
|
|
gasPriceChartUtilsSpies.handleChartUpdate.resetHistory() |
|
|
|
|
wrapper.instance().componentDidUpdate({ currentPrice: 6 }) |
|
|
|
|
assert.equal(gasPriceChartUtilsSpies.handleChartUpdate.callCount, 0) |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
describe('renderChart', () => { |
|
|
|
|
it('should call setTickPosition 4 times, with the expected props', async () => { |
|
|
|
|
await timeout(0) |
|
|
|
|
gasPriceChartUtilsSpies.setTickPosition.resetHistory() |
|
|
|
|
assert.equal(gasPriceChartUtilsSpies.setTickPosition.callCount, 0) |
|
|
|
|
wrapper.instance().renderChart(testProps) |
|
|
|
|
await timeout(0) |
|
|
|
|
assert.equal(gasPriceChartUtilsSpies.setTickPosition.callCount, 4) |
|
|
|
|
assert.deepEqual(gasPriceChartUtilsSpies.setTickPosition.getCall(0).args, ['y', 0, -5, 8]) |
|
|
|
|
assert.deepEqual(gasPriceChartUtilsSpies.setTickPosition.getCall(1).args, ['y', 1, -3, -5]) |
|
|
|
|
assert.deepEqual(gasPriceChartUtilsSpies.setTickPosition.getCall(2).args, ['x', 0, 3, 15]) |
|
|
|
|
assert.deepEqual(gasPriceChartUtilsSpies.setTickPosition.getCall(3).args, ['x', 1, 3, -8]) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
it('should call handleChartUpdate with the correct props', async () => { |
|
|
|
|
await timeout(0) |
|
|
|
|
gasPriceChartUtilsSpies.handleChartUpdate.resetHistory() |
|
|
|
|
wrapper.instance().renderChart(testProps) |
|
|
|
|
await timeout(0) |
|
|
|
|
assert.deepEqual(gasPriceChartUtilsSpies.handleChartUpdate.getCall(0).args, [{ |
|
|
|
|
chart: { mockChart: true }, |
|
|
|
|
gasPrices: [1.5, 2.5, 4, 8], |
|
|
|
|
newPrice: 6, |
|
|
|
|
cssId: '#set-circle', |
|
|
|
|
}]) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
it('should add three events to the chart', async () => { |
|
|
|
|
await timeout(0) |
|
|
|
|
selectReturnSpies.on.resetHistory() |
|
|
|
|
assert.equal(selectReturnSpies.on.callCount, 0) |
|
|
|
|
wrapper.instance().renderChart(testProps) |
|
|
|
|
await timeout(0) |
|
|
|
|
assert.equal(selectReturnSpies.on.callCount, 3) |
|
|
|
|
|
|
|
|
|
const firstOnEventArgs = selectReturnSpies.on.getCall(0).args |
|
|
|
|
assert.equal(firstOnEventArgs[0], 'mouseout') |
|
|
|
|
const secondOnEventArgs = selectReturnSpies.on.getCall(1).args |
|
|
|
|
assert.equal(secondOnEventArgs[0], 'click') |
|
|
|
|
const thirdOnEventArgs = selectReturnSpies.on.getCall(2).args |
|
|
|
|
assert.equal(thirdOnEventArgs[0], 'mousemove') |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
it('should hide the data UI on mouseout', async () => { |
|
|
|
|
await timeout(0) |
|
|
|
|
selectReturnSpies.on.resetHistory() |
|
|
|
|
wrapper.instance().renderChart(testProps) |
|
|
|
|
gasPriceChartUtilsSpies.hideDataUI.resetHistory() |
|
|
|
|
await timeout(0) |
|
|
|
|
const mouseoutEventArgs = selectReturnSpies.on.getCall(0).args |
|
|
|
|
assert.equal(gasPriceChartUtilsSpies.hideDataUI.callCount, 0) |
|
|
|
|
mouseoutEventArgs[1]() |
|
|
|
|
assert.equal(gasPriceChartUtilsSpies.hideDataUI.callCount, 1) |
|
|
|
|
assert.deepEqual(gasPriceChartUtilsSpies.hideDataUI.getCall(0).args, [{ mockChart: true }, '#overlayed-circle']) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
it('should updateCustomGasPrice on click', async () => { |
|
|
|
|
await timeout(0) |
|
|
|
|
selectReturnSpies.on.resetHistory() |
|
|
|
|
wrapper.instance().renderChart(testProps) |
|
|
|
|
propsMethodSpies.updateCustomGasPrice.resetHistory() |
|
|
|
|
await timeout(0) |
|
|
|
|
const mouseoutEventArgs = selectReturnSpies.on.getCall(1).args |
|
|
|
|
assert.equal(propsMethodSpies.updateCustomGasPrice.callCount, 0) |
|
|
|
|
mouseoutEventArgs[1]() |
|
|
|
|
assert.equal(propsMethodSpies.updateCustomGasPrice.callCount, 1) |
|
|
|
|
assert.equal(propsMethodSpies.updateCustomGasPrice.getCall(0).args[0], 'mockX') |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
it('should handle mousemove', async () => { |
|
|
|
|
await timeout(0) |
|
|
|
|
selectReturnSpies.on.resetHistory() |
|
|
|
|
wrapper.instance().renderChart(testProps) |
|
|
|
|
gasPriceChartUtilsSpies.handleMouseMove.resetHistory() |
|
|
|
|
await timeout(0) |
|
|
|
|
const mouseoutEventArgs = selectReturnSpies.on.getCall(2).args |
|
|
|
|
assert.equal(gasPriceChartUtilsSpies.handleMouseMove.callCount, 0) |
|
|
|
|
mouseoutEventArgs[1]() |
|
|
|
|
assert.equal(gasPriceChartUtilsSpies.handleMouseMove.callCount, 1) |
|
|
|
|
assert.deepEqual(gasPriceChartUtilsSpies.handleMouseMove.getCall(0).args, [{ |
|
|
|
|
xMousePos: 'mockClientX', |
|
|
|
|
chartXStart: 'mockCoordinateX', |
|
|
|
|
chartWidth: 'mockWidth', |
|
|
|
|
gasPrices: testProps.gasPrices, |
|
|
|
|
estimatedTimes: testProps.estimatedTimes, |
|
|
|
|
chart: { mockChart: true }, |
|
|
|
|
}]) |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|