/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import '@testing-library/jest-dom';
import mockConsole, { RestoreConsole } from 'jest-mock-console';
import { ChartProps, supersetTheme } from '@superset-ui/core';
import { render, screen, waitFor } from '@superset-ui/core/spec';
import SuperChartCore from '../../../src/chart/components/SuperChartCore';
import {
ChartKeys,
DiligentChartPlugin,
LazyChartPlugin,
SlowChartPlugin,
} from './MockChartPlugins';
describe('SuperChartCore', () => {
const chartProps = new ChartProps();
const plugins = [
new DiligentChartPlugin().configure({ key: ChartKeys.DILIGENT }),
new LazyChartPlugin().configure({ key: ChartKeys.LAZY }),
new SlowChartPlugin().configure({ key: ChartKeys.SLOW }),
];
let restoreConsole: RestoreConsole;
beforeAll(() => {
jest.setTimeout(30000);
plugins.forEach(p => {
p.unregister().register();
});
});
afterAll(() => {
plugins.forEach(p => {
p.unregister();
});
});
beforeEach(() => {
restoreConsole = mockConsole();
});
afterEach(() => {
restoreConsole();
});
describe('registered charts', () => {
it('renders registered chart', async () => {
const { container } = render(
,
);
await waitFor(() => {
expect(container.querySelector('.test-component')).toBeInTheDocument();
});
});
it('renders registered chart with lazy loading', async () => {
const { container } = render(
,
);
await waitFor(() => {
expect(container.querySelector('.test-component')).toBeInTheDocument();
});
});
it('does not render if chartType is not set', async () => {
// @ts-ignore chartType is required
const { container } = render();
await waitFor(() => {
const testComponent = container.querySelector('.test-component');
expect(testComponent).not.toBeInTheDocument();
});
});
it('adds id to container if specified', async () => {
const { container } = render(
,
);
await waitFor(() => {
const element = container.querySelector('#the-chart');
expect(element).toBeInTheDocument();
expect(element).toHaveAttribute('id', 'the-chart');
});
});
it('adds class to container if specified', async () => {
const { container } = render(
,
);
await waitFor(() => {
const element = container.querySelector('.the-chart');
expect(element).toBeInTheDocument();
expect(element).toHaveClass('the-chart');
});
});
it('uses overrideTransformProps when specified', async () => {
render(
({ message: 'hulk' })}
/>,
);
await waitFor(() => {
expect(screen.getByText('hulk')).toBeInTheDocument();
});
});
it('uses preTransformProps when specified', async () => {
const chartPropsWithPayload = new ChartProps({
queriesData: [{ message: 'hulk' }],
theme: supersetTheme,
});
render(
chartPropsWithPayload}
overrideTransformProps={props => props.queriesData[0]}
/>,
);
await waitFor(() => {
expect(screen.getByText('hulk')).toBeInTheDocument();
});
});
it('uses postTransformProps when specified', async () => {
render(
({ message: 'hulk' })}
/>,
);
await waitFor(() => {
expect(screen.getByText('hulk')).toBeInTheDocument();
});
});
it('renders if chartProps is not specified', async () => {
const { container } = render(
,
);
await waitFor(() => {
expect(container.querySelector('.test-component')).toBeInTheDocument();
});
});
it('does not render anything while waiting for Chart code to load', () => {
const { container } = render(
,
);
const testComponent = container.querySelector('.test-component');
expect(testComponent).not.toBeInTheDocument();
});
it('eventually renders after Chart is loaded', async () => {
const { container } = render(
,
);
await waitFor(
() => {
expect(
container.querySelector('.test-component'),
).toBeInTheDocument();
},
{ timeout: 2000 },
);
});
it('does not render if chartProps is null', async () => {
const { container } = render(
,
);
await waitFor(() => {
// Should not render any chart content, only the antd App wrapper
expect(
container.querySelector('.test-component'),
).not.toBeInTheDocument();
expect(
container.querySelector('[data-test="chart-container"]'),
).not.toBeInTheDocument();
});
});
});
describe('unregistered charts', () => {
it('renders error message', async () => {
render(
,
);
await waitFor(() => {
expect(screen.getByRole('alert')).toBeInTheDocument();
});
});
});
describe('.processChartProps()', () => {
it('use identity functions for unspecified transforms', () => {
const chart = new SuperChartCore({
chartType: ChartKeys.DILIGENT,
});
const chartProps2 = new ChartProps();
expect(chart.processChartProps({ chartProps: chartProps2 })).toBe(
chartProps2,
);
});
});
});