// Note: these tests are basically pin tests, given that we're rendering svgs,
// these tests serve to ensure that the rendered output is exactly at the
// author inteded. As a consequence, you may need to re-pin these tests if you
// change things.
import _, { forEach, has, identity } from 'lodash';
import React from 'react';
import { mount, shallow } from 'enzyme';
import { common } from '../../util/generic-tests';
import assert from 'assert';
import LineChart from './LineChart';
import { EmptyStateWrapper } from '../EmptyStateWrapper/EmptyStateWrapper';
import * as chartConstants from '../../constants/charts';
const {
EmptyStateWrapper: { Title, Body },
} = LineChart;
describe('LineChart', () => {
let wrapper: any;
const defaultData = [
{ x: new Date('2015-01-01T00:00:00Z'), y: 1 },
{ x: new Date('2015-01-01T00:00:00Z'), y: 2 },
];
afterEach(() => {
if (wrapper) {
wrapper.unmount();
}
});
common(LineChart, {
exemptFunctionProps: [
'xAxisFormatter',
'xAxisTooltipFormatter',
'yAxisTooltipFormatter',
'yAxisTooltipDataFormatter',
'yAxisFormatter',
'y2AxisFormatter',
'y2AxisTooltipDataFormatter',
] as any,
getDefaultProps: () => ({
data: defaultData,
}),
});
describe('props', () => {
describe('isLoading', () => {
it('should show a `LoadingIndicator` if `isLoading`', () => {
wrapper = mount();
const loadingIndicatorWrapper = wrapper
.find(EmptyStateWrapper)
.find('LoadingIndicator');
assert(loadingIndicatorWrapper.prop('isLoading'));
});
});
describe('pass throughs', () => {
const className = 'wut';
const data = [
{ x: new Date('2015-01-01T00:00:00-08:00'), y: 1 },
{ x: new Date('2015-01-02T00:00:00-08:00'), y: 0 },
{ x: new Date('2015-01-03T00:00:00-08:00'), y: 3 },
];
const props = {
className: 'wut',
height: 100,
width: 101,
margin: { top: 10, right: 11, bottom: 12, left: 13 },
data,
legend: {
x: 'Date',
y: 'Impressions',
},
isLoading: true,
hasToolTips: true,
hasLegend: true,
palette: chartConstants.PALETTE_MONOCHROME_2_5,
colorMap: { clicks: '#abc123' },
xAxisField: 'xAxisField test',
xAxisMin: new Date('2021-01-01T00:00:00-08:00'),
xAxisMax: new Date('2022-01-01T00:00:00-08:00'),
xAxisFormatter: identity,
xAxisTooltipFormatter: identity,
xAxisTickCount: 10,
xAxisTicks: [
new Date('2022-01-01T00:00:00-08:00'),
new Date('2022-01-01T00:00:00-08:00'),
],
xAxisTitle: 'xAxisTitle test',
xAxisTitleColor: chartConstants.COLOR_0,
xAxisTextOrientation: 'vertical' as any,
yAxisFields: ['yAxisFields1', 'yAxisFields2'],
yAxisMin: 103,
yAxisMax: 104,
yAxisFormatter: identity,
yAxisIsStacked: true,
yAxisHasPoints: true,
yAxisTickCount: 105,
yAxisTitle: 'yAxisTitle test',
yAxisTitleColor: chartConstants.COLOR_2,
yAxisTooltipFormatter: identity,
yAxisTooltipDataFormatter: identity,
yAxisColorOffset: 106,
y2AxisFields: ['y2AxisFields_1 test', 'y2AxisFields_2 test'],
y2AxisMin: 106,
y2AxisMax: 107,
y2AxisFormatter: identity,
y2AxisTooltipDataFormatter: identity,
y2AxisIsStacked: true,
y2AxisHasPoints: true,
y2AxisTickCount: 108,
y2AxisTitle: 'y2AxisTitle test',
y2AxisTitleColor: chartConstants.COLOR_3,
y2AxisColorOffset: 109,
yAxisTextOrientation: 'horizontal' as any,
initialState: { test: true },
callbackId: 1,
'data-testid': 10,
...{
foo: 1,
bar: 2,
},
};
it('passes through all props not defined in `propTypes` to the native input element.', () => {
wrapper = shallow();
const inputProps = wrapper.find('.lucid-LineChart').props();
// 'className', 'width' and 'height'
// all appear becuase they are directly passed on the root element as a prop
// It should pass `foo` and `bar` through to the native svg.
_.forEach(
['foo', 'bar', 'className', 'data-testid', 'height', 'width'],
(prop) => {
expect(has(inputProps, prop)).toBe(true);
}
);
});
it('omits the component specific props defined in `propTypes` (plus, in addition, `children`, `initialState`, and `callbackId`) from the root element', () => {
wrapper = shallow();
const inputProps = wrapper.find('.lucid-LineChart').props();
forEach(
[
'margin',
'data',
'legend',
'isLoading',
'hasToolTips',
'hasLegend',
'palette',
'colorMap',
'xAxisField',
'xAxisMin',
'xAxisMax',
'xAxisFormatter',
'xAxisTooltipFormatter',
'xAxisTickCount',
'xAxisTicks',
'xAxisTitle',
'xAxisTitleColor',
'xAxisTextOrientation',
'yAxisFields',
'yAxisMin',
'yAxisMax',
'yAxisFormatter',
'yAxisIsStacked',
'yAxisHasPoints',
'yAxisTickCount',
'yAxisTitle',
'yAxisTitleColor',
'yAxisTooltipFormatter',
'yAxisTooltipDataFormatter',
'yAxisColorOffset',
'y2AxisFields',
'y2AxisMin',
'y2AxisMax',
'y2AxisFormatter',
'y2AxisTooltipDataFormatter',
'y2AxisIsStacked',
'y2AxisHasPoints',
'y2AxisTickCount',
'y2AxisTitle',
'y2AxisTitleColor',
'y2AxisColorOffset',
'yAxisTextOrientation',
'callbackId',
'initialState',
],
(prop) => {
expect(has(inputProps, prop)).toBe(false);
}
);
});
});
});
describe('child components', () => {
describe('EmptyStateWrapper Title', () => {
it('should render the message title element', () => {
const titleText = 'Here is the Title Text';
wrapper = mount(
{titleText}
);
const messageTitleWrapper = wrapper
.find(EmptyStateWrapper)
.find('.lucid-EmptyStateWrapper-message-title');
assert.equal(
messageTitleWrapper.text(),
titleText,
'must contain the title text'
);
});
});
describe('EmptyStateWrapper Body', () => {
it('should render the message body element', () => {
const bodyElement = (
);
wrapper = mount(
{bodyElement}
);
const messageBodyWrapper = wrapper.find(EmptyStateWrapper);
assert(
messageBodyWrapper.contains(bodyElement),
'must contain the body element'
);
});
});
});
describe('render', () => {
it('should render a single axis chart', () => {
wrapper = mount(
);
assert.equal(
wrapper.find('.lucid-Point').length,
3,
'did not find the correct number of points'
);
});
it('should render a single axis chart with multiple series', () => {
wrapper = mount(
);
assert.equal(
wrapper.find('.lucid-Line').length,
2,
'did not find the correct number of lines'
);
});
it('should render a dual axis chart', () => {
wrapper = mount(
);
assert.equal(
wrapper.find('.lucid-Axis').length,
3,
'did not find the correct number of axes'
);
});
});
});