/* eslint-disable comma-spacing */
import _, { forEach, has, noop } from 'lodash';
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 * as chartConstants from '../../constants/charts';
import Points from './Points';
import Point from '../Point/Point';
const defaultData = [
{ x: 'aye', y: 10, y2: 20 },
{ x: 'bee', y: 55, y2: 35 },
{ x: 'see', y: 100, y2: 3 },
];
const defaultXScale: any = d3Scale
.scalePoint()
.domain(['aye', 'bee', 'see'])
.range([0, 100]);
const defaultYScale: any = d3Scale
.scaleLinear()
.domain([0, 100])
.range([1000, 0]);
describe('Points', () => {
common(Points, {
exemptFunctionProps: ['xScale', 'yScale'] as any,
getDefaultProps: () => ({
data: [{ x: new Date('2015-01-01T00:00:00Z'), y: 1 }],
xScale: d3Scale.scaleTime(),
yScale: d3Scale.scaleLinear(),
}),
});
describe('props', () => {
describe('data', () => {
it('should handle a basic data set', () => {
const wrapper = shallow(
);
assert.equal(wrapper.find(Point).length, 3);
});
});
describe('palette', () => {
it('should kick in when theres no colorMap', () => {
const palette = ['r', 'g'];
const wrapper = shallow(
);
assert.equal(wrapper.find(Point).at(0).prop('color'), 'r');
assert.equal(wrapper.find(Point).at(1).prop('color'), 'g');
assert.equal(wrapper.find(Point).at(2).prop('color'), 'r');
});
it('should be beat when theres a colorMap', () => {
const palette = ['r', 'g'];
const wrapper = shallow(
);
assert.equal(wrapper.find(Point).at(0).prop('color'), 'r');
assert.equal(wrapper.find(Point).at(1).prop('color'), '#ABC123');
assert.equal(wrapper.find(Point).at(2).prop('color'), 'r');
});
});
describe('colorMap', () => {
it('should pass custom colors through to Point', () => {
const wrapper = shallow(
);
assert.equal(wrapper.find(Point).at(0).prop('color'), '#ABC333');
});
});
describe('xScale', () => {
it('should work with point scales', () => {
const wrapper = shallow(
);
assert.equal(wrapper.find(Point).at(0).prop('x'), 0);
assert.equal(wrapper.find(Point).at(0).prop('y'), 900);
assert.equal(wrapper.find(Point).at(1).prop('x'), 50);
assert.equal(wrapper.find(Point).at(1).prop('y'), 449.99999999999994);
assert.equal(wrapper.find(Point).at(2).prop('x'), 100);
assert.equal(wrapper.find(Point).at(2).prop('y'), 0);
});
it('should work with linear scales', () => {
const xScale: any = d3Scale
.scaleLinear()
.domain([0, 10])
.range([0, 100]);
const wrapper = shallow(
);
assert.equal(wrapper.find(Point).at(0).prop('x'), 20);
assert.equal(wrapper.find(Point).at(0).prop('y'), 800);
assert.equal(wrapper.find(Point).at(1).prop('x'), 60);
assert.equal(wrapper.find(Point).at(1).prop('y'), 500);
});
});
describe('yScale', () => {
it('should work with point scales', () => {
const wrapper = shallow(
);
assert.equal(wrapper.find(Point).at(0).prop('x'), 0);
assert.equal(wrapper.find(Point).at(0).prop('y'), 900);
assert.equal(wrapper.find(Point).at(1).prop('x'), 50);
assert.equal(wrapper.find(Point).at(1).prop('y'), 449.99999999999994);
assert.equal(wrapper.find(Point).at(2).prop('x'), 100);
assert.equal(wrapper.find(Point).at(2).prop('y'), 0);
});
it('should work with time scales', () => {
const xScale: any = d3Scale
.scalePoint()
.domain([
new Date('2015-01-01T00:00:00Z') as any,
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(
);
assert.equal(wrapper.find(Point).length, 3, 'wrong number of Point');
assert.equal(wrapper.find(Point).at(0).prop('x'), 0);
assert.equal(wrapper.find(Point).at(0).prop('y'), 1000);
assert.equal(wrapper.find(Point).at(1).prop('y'), 500);
assert.equal(wrapper.find(Point).at(2).prop('x'), 100);
assert.equal(wrapper.find(Point).at(2).prop('y'), 0);
});
});
describe('xField', () => {
it('should pick up an alternate xField', () => {
const wrapper = shallow(
);
assert.equal(wrapper.find(Point).at(0).prop('x'), 0);
assert.equal(wrapper.find(Point).at(0).prop('y'), 900);
assert.equal(wrapper.find(Point).at(1).prop('x'), 50);
assert.equal(wrapper.find(Point).at(1).prop('y'), 449.99999999999994);
assert.equal(wrapper.find(Point).at(2).prop('x'), 100);
assert.equal(wrapper.find(Point).at(2).prop('y'), 0);
});
});
describe('yFields', () => {
it('should pickup an alternate field', () => {
const wrapper = shallow(
);
assert.equal(wrapper.find(Point).at(0).prop('x'), 0);
assert.equal(wrapper.find(Point).at(0).prop('y'), 800);
assert.equal(wrapper.find(Point).at(1).prop('x'), 50);
assert.equal(wrapper.find(Point).at(1).prop('y'), 650);
assert.equal(wrapper.find(Point).at(2).prop('x'), 100);
assert.equal(wrapper.find(Point).at(2).prop('y'), 970);
});
it('should handle multiple fields', () => {
const wrapper = shallow(
);
assert.equal(wrapper.find(Point).at(0).prop('x'), 0);
assert.equal(wrapper.find(Point).at(0).prop('y'), 900);
assert.equal(wrapper.find(Point).at(1).prop('x'), 50);
assert.equal(wrapper.find(Point).at(1).prop('y'), 449.99999999999994);
assert.equal(wrapper.find(Point).at(2).prop('x'), 100);
assert.equal(wrapper.find(Point).at(2).prop('y'), 0);
assert.equal(wrapper.find(Point).at(3).prop('x'), 0);
assert.equal(wrapper.find(Point).at(3).prop('y'), 800);
assert.equal(wrapper.find(Point).at(4).prop('x'), 50);
assert.equal(wrapper.find(Point).at(4).prop('y'), 650);
assert.equal(wrapper.find(Point).at(5).prop('x'), 100);
assert.equal(wrapper.find(Point).at(5).prop('y'), 970);
});
});
describe('colorOffset', () => {
it('should correctly offset the palette colors', () => {
const palette = ['r', 'g'];
const wrapper = shallow(
);
assert.equal(wrapper.find(Point).at(0).prop('color'), 'g');
assert.equal(wrapper.find(Point).at(1).prop('color'), 'r');
assert.equal(wrapper.find(Point).at(2).prop('color'), 'g');
});
});
describe('hasStroke', () => {
it('should pass through true to Point', () => {
const wrapper = shallow(
);
assert.equal(wrapper.find(Point).at(0).prop('hasStroke'), true);
});
it('should pass through false to Point', () => {
const wrapper = shallow(
);
assert.equal(wrapper.find(Point).at(0).prop('hasStroke'), false);
});
});
describe('isStacked', () => {
it('should stack points accordingly', () => {
const wrapper = shallow(
);
assert.equal(wrapper.find(Point).length, 6);
assert.equal(wrapper.find(Point).at(0).prop('x'), 0);
assert.equal(wrapper.find(Point).at(0).prop('y'), 902.9126213592233);
assert.equal(wrapper.find(Point).at(1).prop('x'), 50);
assert.equal(wrapper.find(Point).at(1).prop('y'), 466.0194174757282);
assert.equal(wrapper.find(Point).at(2).prop('x'), 100);
assert.equal(wrapper.find(Point).at(2).prop('y'), 29.126213592232997);
assert.equal(wrapper.find(Point).at(3).prop('x'), 0);
assert.equal(wrapper.find(Point).at(3).prop('y'), 708.7378640776699);
assert.equal(wrapper.find(Point).at(4).prop('x'), 50);
assert.equal(wrapper.find(Point).at(4).prop('y'), 126.21359223300976);
assert.equal(wrapper.find(Point).at(5).prop('x'), 100);
assert.equal(wrapper.find(Point).at(5).prop('y'), 0);
});
});
describe('pass throughs', () => {
let wrapper: any;
const defaultProps = Points.defaultProps;
const data = [{ x: 'one', y0: 4, y1: 5, y2: 6, y3: 7 }];
beforeEach(() => {
const props = {
...defaultProps,
data,
xField: 'x-test',
yFields: ['y0-test', 'y1-test'],
colorOffset: 10,
hasStroke: false,
isStacked: true,
palette: chartConstants.PALETTE_30,
xScale: defaultXScale,
yScale: defaultYScale,
className: 'wut',
style: { marginRight: 10 },
initialState: { test: true },
callbackId: 1,
'data-testid': 10,
};
wrapper = shallow();
});
afterEach(() => {
wrapper.unmount();
});
it('passes through props not defined in `propTypes` to the root element.', () => {
const rootProps = wrapper.find('.lucid-Points').props();
expect(wrapper.first().prop(['className'])).toContain('wut');
expect(wrapper.first().prop(['style'])).toMatchObject({
marginRight: 10,
});
expect(wrapper.first().prop(['data-testid'])).toBe(10);
// 'className' is plucked from the pass through object
// but still appears becuase is is are also directly passed on the root element as a prop
forEach(['className', 'data-testid', 'style', 'children'], (prop) => {
expect(has(rootProps, prop)).toBe(true);
});
});
it('omits all the props defined in `propTypes` (plus, in addition, `initialState`, and `callbackId`) from the root element', () => {
const rootProps = wrapper.find('.lucid-Points').props();
forEach(
[
'palette',
'colorMap',
'data',
'xScale',
'yScale',
'xField',
'yFields',
'yStackedMax',
'colorOffset',
'hasStroke',
'isStacked',
'initialState',
'callbackId',
],
(prop) => {
expect(has(rootProps, prop)).toBe(false);
}
);
});
});
});
});