/* eslint-disable comma-spacing */ import React from 'react'; import assert from 'assert'; import * as d3Scale from 'd3-scale'; import { common } from '../../util/generic-tests'; import { shallow } from 'enzyme'; import Bars, { PureToolTip } from './Bars'; import Bar from '../Bar/Bar'; import Legend from '../Legend/Legend'; import { ToolTipDumb as ToolTip } from '../ToolTip/ToolTip'; const defaultData = [ { x: 'aye', y: 10, y2: 20 }, { x: 'bee', y: 55, y2: 35 }, { x: 'see', y: 100, y2: 3 }, ]; const defaultXScale = d3Scale .scaleBand() .domain(['aye', 'bee', 'see']) .range([0, 100]); const defaultYScale = d3Scale.scaleLinear().domain([0, 100]).range([1000, 0]); describe('Bars', () => { common(Bars, { exemptFunctionProps: [ 'xScale', 'yScale', 'xFormatter', 'yFormatter', 'yTooltipFormatter', 'renderTooltipBody', ] as any, getDefaultProps: () => ({ data: defaultData, xScale: defaultXScale, yScale: defaultYScale, }), }); describe('props', () => { describe('data', () => { it('should handle a basic data set', () => { const wrapper = shallow( ); assert.strictEqual(wrapper.find(Bar).length, 3); }); }); describe('legend', () => { it('should display the correct legend entries based on the legend', () => { const wrapper = shallow( ); assert( wrapper.find(PureToolTip).at(0).shallow().find(Legend.Item).text(), 'Foo: 10' ); assert( wrapper.find(PureToolTip).at(1).shallow().find(Legend.Item).text(), 'Foo: 55' ); assert( wrapper.find(PureToolTip).at(2).shallow().find(Legend.Item).text(), 'Foo: 90' ); }); }); describe('palette', () => { it('should kick in when theres no colorMap', () => { const palette = ['r', 'g']; const wrapper = shallow( ); assert.strictEqual(wrapper.find(Bar).at(0).prop('color'), 'r'); assert.strictEqual(wrapper.find(Bar).at(1).prop('color'), 'g'); assert.strictEqual(wrapper.find(Bar).at(2).prop('color'), 'r'); }); it('should be beat when theres a colorMap', () => { const palette = ['r', 'g']; const wrapper = shallow( ); assert.strictEqual(wrapper.find(Bar).at(0).prop('color'), 'r'); assert.strictEqual(wrapper.find(Bar).at(1).prop('color'), '#ABC123'); assert.strictEqual(wrapper.find(Bar).at(2).prop('color'), 'r'); }); }); describe('colorMap', () => { it('should pass custom colors through to Bar', () => { const wrapper = shallow( ); assert.strictEqual(wrapper.find(Bar).at(0).prop('color'), '#ABC333'); }); }); describe('xScale', () => { it('should work with band scales', () => { const wrapper = shallow( ); assert.strictEqual(wrapper.find(Bar).length, 3, 'wrong number of Bar'); assert.strictEqual(wrapper.find(Bar).at(0).prop('height'), 100); assert.strictEqual( wrapper.find(Bar).at(1).prop('height'), 550.00000000000001 ); assert.strictEqual(wrapper.find(Bar).at(2).prop('height'), 1000); }); }); describe('xField', () => { it('should pickup alternate xFields', () => { const wrapper = shallow( ); assert.strictEqual(wrapper.find(Bar).length, 3, 'wrong number of Bar'); assert.strictEqual(wrapper.find(Bar).at(0).prop('height'), 0); assert.strictEqual(wrapper.find(Bar).at(1).prop('height'), 500); assert.strictEqual(wrapper.find(Bar).at(2).prop('height'), 1000); }); }); describe('xFormatter', () => { it('should format the x field using the provided function', () => { const wrapper = shallow( str.toUpperCase()} /> ).find(PureToolTip); assert.strictEqual( wrapper.at(0).shallow().find(ToolTip.Title).prop('children'), 'AYE' ); assert.strictEqual( wrapper.at(1).shallow().find(ToolTip.Title).prop('children'), 'BEE' ); assert.strictEqual( wrapper.at(2).shallow().find(ToolTip.Title).prop('children'), 'SEE' ); }); it('should have access to the full datum', () => { const wrapper = shallow( `${str.toUpperCase()} ${d.y2}`) as any } /> ).find(PureToolTip); assert.strictEqual( wrapper.at(0).shallow().find(ToolTip.Title).prop('children'), 'AYE 20' ); assert.strictEqual( wrapper.at(1).shallow().find(ToolTip.Title).prop('children'), 'BEE 35' ); assert.strictEqual( wrapper.at(2).shallow().find(ToolTip.Title).prop('children'), 'SEE 3' ); }); }); describe('yScale', () => { it('should work with linear scales', () => { const wrapper = shallow( ); assert.strictEqual(wrapper.find(Bar).length, 3, 'wrong number of Bar'); assert.strictEqual(wrapper.find(Bar).at(0).prop('height'), 100); assert.strictEqual( wrapper.find(Bar).at(1).prop('height'), 550.00000000000001 ); assert.strictEqual(wrapper.find(Bar).at(2).prop('height'), 1000); }); it('should work with time scales', () => { const xScale = d3Scale .scaleBand() .domain([ new Date('2015-01-01T00:00:00Z'), new Date('2015-01-03T00:00:00Z'), ] as any) .range([0, 100]); const yScale: any = d3Scale .scaleTime() .domain([0, 100]) .range([1000, 0]); const wrapper = shallow( d.toISOString()} /> ); assert.strictEqual(wrapper.find(Bar).length, 3, 'wrong number of Bar'); assert.strictEqual(wrapper.find(Bar).at(0).prop('width'), 50); assert.strictEqual(wrapper.find(Bar).at(0).prop('height'), 0); assert.strictEqual(wrapper.find(Bar).at(1).prop('width'), 50); assert.strictEqual(wrapper.find(Bar).at(1).prop('height'), 500); assert.strictEqual(wrapper.find(Bar).at(2).prop('width'), 50); assert.strictEqual(wrapper.find(Bar).at(2).prop('height'), 1000); }); }); describe('yFields', () => { it('should pickup an alternate field', () => { const wrapper = shallow( ); assert.strictEqual(wrapper.find(Bar).length, 3, 'wrong number of Bar'); assert.strictEqual(wrapper.find(Bar).at(0).prop('height'), 0); assert.strictEqual(wrapper.find(Bar).at(1).prop('height'), 500); assert.strictEqual(wrapper.find(Bar).at(2).prop('height'), 1000); }); it('should handle multiple fields', () => { const wrapper = shallow( ); assert.strictEqual(wrapper.find(Bar).length, 6, 'wrong number of Bar'); assert.strictEqual(wrapper.find(Bar).at(0).prop('width'), 16); assert.strictEqual(wrapper.find(Bar).at(0).prop('height'), 0); assert.strictEqual(wrapper.find(Bar).at(1).prop('height'), 1000); assert.strictEqual(wrapper.find(Bar).at(2).prop('height'), 500); assert.strictEqual(wrapper.find(Bar).at(3).prop('height'), 500); assert.strictEqual(wrapper.find(Bar).at(4).prop('height'), 1000); assert.strictEqual(wrapper.find(Bar).at(5).prop('height'), 0); }); }); describe('yFormatter', () => { it('should format the y field using the provided function', () => { const wrapper = shallow( str.toUpperCase()} /> ).find(PureToolTip); assert.strictEqual( wrapper.at(0).shallow().find(ToolTip.Title).prop('children'), 'AYE' ); assert.strictEqual( wrapper.at(1).shallow().find(ToolTip.Title).prop('children'), 'BEE' ); assert.strictEqual( wrapper.at(2).shallow().find(ToolTip.Title).prop('children'), 'SEE' ); }); }); describe('isStacked', () => { it('should stack the bars accordingly', () => { const wrapper = shallow( ); assert.strictEqual(wrapper.find(Bar).length, 6, 'wrong number of Bar'); assert.strictEqual( wrapper.find(Bar).at(0).prop('width'), 33.333333333333336 ); assert.strictEqual(wrapper.find(Bar).at(0).prop('height'), 0); assert.strictEqual(wrapper.find(Bar).at(1).prop('height'), 1000); assert.strictEqual(wrapper.find(Bar).at(2).prop('height'), 500); assert.strictEqual(wrapper.find(Bar).at(3).prop('height'), 500); assert.strictEqual(wrapper.find(Bar).at(4).prop('height'), 1000); assert.strictEqual(wrapper.find(Bar).at(5).prop('height'), 0); }); }); describe('colorOffset', () => { it('should correctly offset the palette colors', () => { const palette = ['r', 'g']; const wrapper = shallow( ); assert.strictEqual(wrapper.find(Bar).at(0).prop('color'), 'g'); assert.strictEqual(wrapper.find(Bar).at(1).prop('color'), 'r'); assert.strictEqual(wrapper.find(Bar).at(2).prop('color'), 'g'); }); }); describe('renderTooltipBody', () => { it('should format the whole tooltip body', () => { const wrapper = shallow( dataPoint.x.toUpperCase()) as any } /> ); const toolTip = wrapper.find(PureToolTip); assert.strictEqual( toolTip.at(0).shallow().find(ToolTip.Body).prop('children'), 'AYE' ); assert.strictEqual( toolTip.at(1).shallow().find(ToolTip.Body).prop('children'), 'BEE' ); assert.strictEqual( toolTip.at(2).shallow().find(ToolTip.Body).prop('children'), 'SEE' ); }); }); }); describe('tooltips', () => { it('should show the tooltip', () => { const wrapper = shallow( ); wrapper .find(PureToolTip) .forEach((node) => expect(node.prop('isExpanded')).toBe(false)); wrapper.setState({ hoveringSeriesIndex: 0 }); const toolTips = wrapper.find(PureToolTip); expect(toolTips.first().prop('isExpanded')).toBe(true); expect(toolTips.at(1).prop('isExpanded')).toBe(false); expect(toolTips.at(2).prop('isExpanded')).toBe(false); }); it('should not show tooltips with `hasToolTips` = false', () => { const wrapper = shallow( ); wrapper .find(PureToolTip) .forEach((node) => expect(node.prop('isExpanded')).toBe(false)); wrapper.setState({ hoveringSeriesIndex: 0 }); wrapper .find(PureToolTip) .forEach((node) => expect(node.prop('isExpanded')).toBe(false)); }); }); });