diff --git a/packages/superset-ui-chart/test/components/MockChartPlugins.tsx b/packages/superset-ui-chart/test/components/MockChartPlugins.tsx new file mode 100644 index 0000000000000..6e6f3e6d5f969 --- /dev/null +++ b/packages/superset-ui-chart/test/components/MockChartPlugins.tsx @@ -0,0 +1,69 @@ +import React from 'react'; +import { ChartMetadata, ChartPlugin, ChartFormData } from '../../src'; + +export const TestComponent = ({ + message, + width, + height, +}: { + message: string; + width: number; + height: number; +}) => ( +
+ {message || 'test-message'} + {[width, height].join('x')} +
+); + +export const ChartKeys = { + DILIGENT: 'diligent-chart', + LAZY: 'lazy-chart', + SLOW: 'slow-chart', +}; + +export class DiligentChartPlugin extends ChartPlugin { + constructor() { + super({ + metadata: new ChartMetadata({ + name: ChartKeys.DILIGENT, + thumbnail: '', + }), + Chart: TestComponent, + transformProps: x => x, + }); + } +} + +export class LazyChartPlugin extends ChartPlugin { + constructor() { + super({ + metadata: new ChartMetadata({ + name: ChartKeys.LAZY, + thumbnail: '', + }), + // this mirrors `() => import(module)` syntax + loadChart: () => Promise.resolve({ default: TestComponent }), + // promise without .default + loadTransformProps: () => Promise.resolve((x: any) => x), + }); + } +} + +export class SlowChartPlugin extends ChartPlugin { + constructor() { + super({ + metadata: new ChartMetadata({ + name: ChartKeys.SLOW, + thumbnail: '', + }), + loadChart: () => + new Promise(resolve => { + setTimeout(() => { + resolve(TestComponent); + }, 1000); + }), + transformProps: x => x, + }); + } +} diff --git a/packages/superset-ui-chart/test/components/SuperChart.test.tsx b/packages/superset-ui-chart/test/components/SuperChart.test.tsx index cd58d90e889bc..d204120c486c3 100644 --- a/packages/superset-ui-chart/test/components/SuperChart.test.tsx +++ b/packages/superset-ui-chart/test/components/SuperChart.test.tsx @@ -1,73 +1,33 @@ import React from 'react'; import { mount, shallow } from 'enzyme'; -import { ChartProps, ChartMetadata, ChartPlugin, ChartFormData, SuperChart } from '../../src'; +import { ChartProps } from '../../src'; +import { + ChartKeys, + DiligentChartPlugin, + LazyChartPlugin, + SlowChartPlugin, +} from './MockChartPlugins'; +import SuperChart from '../../src/components/SuperChart'; describe('SuperChart', () => { - const TestComponent = (props: any) => ( -
{props.character || 'test-component'}
- ); const chartProps = new ChartProps(); - class MyChartPlugin extends ChartPlugin { - constructor() { - super({ - metadata: new ChartMetadata({ - name: 'my-chart', - thumbnail: '', - }), - Chart: TestComponent, - transformProps: x => x, - }); - } - } - - class SecondChartPlugin extends ChartPlugin { - constructor() { - super({ - metadata: new ChartMetadata({ - name: 'second-chart', - thumbnail: '', - }), - // this mirrors `() => import(module)` syntax - loadChart: () => Promise.resolve({ default: TestComponent }), - // promise without .default - loadTransformProps: () => Promise.resolve((x: any) => x), - }); - } - } - - class SlowChartPlugin extends ChartPlugin { - constructor() { - super({ - metadata: new ChartMetadata({ - name: 'slow-chart', - thumbnail: '', - }), - loadChart: () => - new Promise(resolve => { - setTimeout(() => { - resolve(TestComponent); - }, 1000); - }), - transformProps: x => x, - }); - } - } - - new MyChartPlugin().configure({ key: 'my-chart' }).register(); - new SecondChartPlugin().configure({ key: 'second-chart' }).register(); - new SlowChartPlugin().configure({ key: 'slow-chart' }).register(); + new DiligentChartPlugin().configure({ key: ChartKeys.DILIGENT }).register(); + new LazyChartPlugin().configure({ key: ChartKeys.LAZY }).register(); + new SlowChartPlugin().configure({ key: ChartKeys.SLOW }).register(); describe('registered charts', () => { it('renders registered chart', done => { - const wrapper = shallow(); + const wrapper = shallow( + , + ); setTimeout(() => { expect(wrapper.render().find('div.test-component')).toHaveLength(1); done(); }, 0); }); it('renders registered chart with default export', done => { - const wrapper = shallow(); + const wrapper = shallow(); setTimeout(() => { expect(wrapper.render().find('div.test-component')).toHaveLength(1); done(); @@ -82,14 +42,14 @@ describe('SuperChart', () => { }, 5); }); it('adds id to container if specified', done => { - const wrapper = shallow(); + const wrapper = shallow(); setTimeout(() => { expect(wrapper.render().attr('id')).toEqual('the-chart'); done(); }, 0); }); it('adds class to container if specified', done => { - const wrapper = shallow(); + const wrapper = shallow(); setTimeout(() => { expect(wrapper.hasClass('the-chart')).toBeTruthy(); done(); @@ -97,13 +57,16 @@ describe('SuperChart', () => { }); it('uses overrideTransformProps when specified', done => { const wrapper = shallow( - ({ character: 'hulk' })} />, + ({ message: 'hulk' })} + />, ); setTimeout(() => { expect( wrapper .render() - .find('div.test-component') + .find('span.message') .text(), ).toEqual('hulk'); done(); @@ -111,11 +74,11 @@ describe('SuperChart', () => { }); it('uses preTransformProps when specified', done => { const chartPropsWithPayload = new ChartProps({ - payload: { character: 'hulk' }, + payload: { message: 'hulk' }, }); const wrapper = shallow( chartPropsWithPayload} overrideTransformProps={props => props.payload} />, @@ -124,7 +87,7 @@ describe('SuperChart', () => { expect( wrapper .render() - .find('div.test-component') + .find('span.message') .text(), ).toEqual('hulk'); done(); @@ -132,34 +95,44 @@ describe('SuperChart', () => { }); it('uses postTransformProps when specified', done => { const wrapper = shallow( - ({ character: 'hulk' })} />, + ({ message: 'hulk' })} + />, ); setTimeout(() => { expect( wrapper .render() - .find('div.test-component') + .find('span.message') .text(), ).toEqual('hulk'); done(); }, 0); }); it('renders if chartProps is not specified', done => { - const wrapper = shallow(); + const wrapper = shallow(); setTimeout(() => { expect(wrapper.render().find('div.test-component')).toHaveLength(1); done(); }, 0); }); it('does not render anything while waiting for Chart code to load', done => { - const wrapper = shallow(); + const wrapper = shallow(); setTimeout(() => { expect(wrapper.render().children()).toHaveLength(0); done(); }, 0); }); + it('eventually renders after Chart is loaded', done => { + const wrapper = shallow(); + setTimeout(() => { + expect(wrapper.render().find('div.test-component')).toHaveLength(1); + done(); + }, 1500); + }); it('does not render if chartProps is null', done => { - const wrapper = shallow(); + const wrapper = shallow(); setTimeout(() => { expect(wrapper.render().find('div.test-component')).toHaveLength(0); done(); @@ -180,7 +153,7 @@ describe('SuperChart', () => { describe('.processChartProps()', () => { it('use identity functions for unspecified transforms', () => { const chart = new SuperChart({ - chartType: 'my-chart', + chartType: ChartKeys.DILIGENT, }); const chartProps2 = new ChartProps(); expect(chart.processChartProps({ chartProps: chartProps2 })).toBe(chartProps2);