import _, { forEach, has, noop } from 'lodash'; import React from 'react'; import { mount } from 'enzyme'; import assert from 'assert'; import { common } from '../../util/generic-tests'; import DraggableLineChart from './DraggableLineChart'; describe('DraggableLineChart', () => { common(DraggableLineChart); const data = [ { x: new Date(), y: 1 }, { x: new Date(), y: 2 }, { x: new Date(), y: 3 }, ] as any; let wrapper: any; afterEach(() => { if (wrapper) { wrapper.unmount(); } }); describe('render', () => { it('should render an svg chart', () => { wrapper = mount(); assert.equal(wrapper.find('svg').length, 1, 'did not render an svg'); }); }); describe('when props update,', () => { it('should call d3LineChart.updateLineChart', () => { const data = [ { x: '12:00', y: 1 }, { x: '1:00', y: 2 }, { x: '2:00', y: 3 }, ]; wrapper = mount(); wrapper.instance().d3LineChart.updateLineChart = jest.fn(); data.push({ x: '3:00', y: 6 }); wrapper.setProps({ data: data }); expect(wrapper.instance().d3LineChart.updateLineChart).toBeCalledTimes(1); }); }); describe('pass throughs', () => { const defaultProps = DraggableLineChart.defaultProps; const props = { ...defaultProps, data, onDragEnd: noop, onPreselect: noop, xAxisTicksVertical: true, dataIsCentered: true, yAxisMin: 0, preSelectText: 'test text', yAxisFormatter: (value) => `string ${value}`, className: 'wut', style: { marginRight: 10 }, initialState: { test: true }, callbackId: 1, 'data-testid': 10, }; it('passes through props not defined in `propTypes` to the root element.', () => { wrapper = mount(); const rootProps = wrapper.find('.lucid-DraggableLineChart').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', 'width', 'height' and 'style' are plucked from the pass through object // but still appears becuase each one is also directly added to the root element as a prop forEach( ['className', 'data-testid', 'style', 'width', 'height'], (prop) => { expect(has(rootProps, prop)).toBe(true); } ); }); it('omits the props defined in `propTypes` (plus, in addition, `initialState`, and `callbackId`) from the root element', () => { wrapper = mount(); const rootProps = wrapper.find('.lucid-DraggableLineChart').props(); forEach( [ 'margin', 'data', 'onDragEnd', 'xAxisTicksVertical', 'dataIsCentered', 'yAxisMin', 'xAxisRenderProp', 'onPreselect', 'preSelectText', 'yAxisFormatter', 'initialState', 'callbackId', ], (prop) => { expect(has(rootProps, prop)).toBe(false); } ); }); }); });