import { render, screen, waitFor } from '@testing-library/react';
import { getWrapper } from '../../../testUtils';
import { Barchart } from './Barchart';
import { ChartLegendWrapper } from '../legend/ChartLegendWrapper';
import React from 'react';
import { CustomTick } from '../common/SharedComponents';
const ONE_DAY_IN_MILLISECONDS = 24 * 60 * 60 * 1000;
const ONE_HOUR_IN_MILLISECONDS = 60 * 60 * 1000;
// Mock ResponsiveContainer to test the Barchart component
jest.mock('recharts', () => {
const OriginalResponsiveContainerModule = jest.requireActual('recharts');
return {
...OriginalResponsiveContainerModule,
ResponsiveContainer: ({ height, children }) => (
{children}
),
};
});
const testBars = [
{
label: 'Success',
data: [
['category1', 10],
['category2', 20],
['category3', 30],
],
color: 'green',
},
] as const;
const testTimeBars = [
{
label: 'Success',
data: [
[new Date('2024-07-05'), 10],
[new Date('2024-07-06'), 20],
[new Date('2024-07-07'), 30],
],
color: 'green',
},
] as const;
const testColorSet = {
Success: 'lineColor1',
};
describe('Barchart', () => {
describe('Basic rendering', () => {
it('should render the Barchart component with category data', async () => {
const { Wrapper } = getWrapper();
render(
,
);
expect(screen.getByText('Test Title')).toBeInTheDocument();
expect(screen.getByText('category1')).toBeInTheDocument();
expect(screen.getByText('category2')).toBeInTheDocument();
expect(screen.getByText('category3')).toBeInTheDocument();
});
it('should render the Barchart component with time data', async () => {
const { Wrapper } = getWrapper();
render(
,
);
expect(screen.getByText('05 Jul')).toBeInTheDocument();
expect(screen.getByText('06 Jul')).toBeInTheDocument();
expect(screen.getByText('07 Jul')).toBeInTheDocument();
});
it('should render the Barchart component with error state', async () => {
const { Wrapper } = getWrapper();
render(
,
);
expect(
screen.getByText('Chart data is not available'),
).toBeInTheDocument();
});
it('should render the Barchart component with loading state', async () => {
const { Wrapper } = getWrapper();
render(
,
);
expect(screen.getByText('Loading Chart Data...')).toBeInTheDocument();
});
it('should render the Barchart component with undefined bars', async () => {
const { Wrapper } = getWrapper();
render(
,
);
expect(
screen.getByText('Chart data is not available'),
).toBeInTheDocument();
});
});
describe('Time data', () => {
it('should render the chart with correct starting days even if the data is missing', async () => {
const { Wrapper } = getWrapper();
render(
,
);
expect(screen.getByText('03 Jul')).toBeInTheDocument();
expect(screen.getByText('04 Jul')).toBeInTheDocument();
expect(screen.getByText('05 Jul')).toBeInTheDocument();
expect(screen.getByText('06 Jul')).toBeInTheDocument();
expect(screen.getByText('07 Jul')).toBeInTheDocument();
});
it('should render when there are missing data in the time range', async () => {
const bars = [
{
label: 'Success',
data: [
[new Date('2024-07-05'), 10], // Friday
[new Date('2024-07-08'), 15], // Monday
] as [Date, number][],
color: 'green',
},
{
label: 'Failed',
data: [
[new Date('2024-07-05'), 2], // Friday
[new Date('2024-07-08'), 3], // Monday
] as [Date, number][],
color: 'red',
},
] as const;
const type = {
type: 'time' as const,
timeRange: {
startDate: new Date('2024-07-05'),
endDate: new Date('2024-07-08'),
interval: ONE_DAY_IN_MILLISECONDS,
},
};
const { Wrapper } = getWrapper();
render(
,
);
// Check that all days are present
await waitFor(() => {
expect(screen.getByText('05 Jul')).toBeInTheDocument();
expect(screen.getByText('06 Jul')).toBeInTheDocument();
expect(screen.getByText('07 Jul')).toBeInTheDocument();
expect(screen.getByText('08 Jul')).toBeInTheDocument();
});
});
it('should render for a specific time range', async () => {
// 7 days data from 2024-07-05 to 2024-07-11
const testTimeBars = [
{
label: 'Success',
data: [
[new Date('2024-07-05'), 10],
[new Date('2024-07-06'), 10],
[new Date('2024-07-07'), 10],
[new Date('2024-07-08'), 10],
[new Date('2024-07-09'), 10],
[new Date('2024-07-10'), 10],
[new Date('2024-07-11'), 10],
],
color: 'green',
},
] as const;
const type = {
type: 'time' as const,
timeRange: {
startDate: new Date('2024-07-05'),
endDate: new Date('2024-07-11'),
interval: ONE_DAY_IN_MILLISECONDS,
},
};
const { Wrapper } = getWrapper();
render(
,
);
await waitFor(() => {
expect(screen.getByText('05 Jul')).toBeInTheDocument();
expect(screen.getByText('06 Jul')).toBeInTheDocument();
expect(screen.getByText('07 Jul')).toBeInTheDocument();
expect(screen.getByText('08 Jul')).toBeInTheDocument();
expect(screen.getByText('09 Jul')).toBeInTheDocument();
expect(screen.getByText('10 Jul')).toBeInTheDocument();
expect(screen.getByText('11 Jul')).toBeInTheDocument();
});
});
it('should render the Barchart component with hourly intervals', async () => {
const testHourlyBars = [
{
label: 'Success',
data: [
[new Date('2024-07-05T10:00:00'), 10],
[new Date('2024-07-05T12:00:00'), 20],
],
color: 'green',
},
] as const;
const { Wrapper } = getWrapper();
render(
,
);
expect(screen.getByText('10:00')).toBeInTheDocument();
expect(screen.getByText('11:00')).toBeInTheDocument();
expect(screen.getByText('12:00')).toBeInTheDocument();
});
});
it('should render stacked bars', () => {
const testStackedBars = [
{
label: 'Success',
data: [
['category1', 10],
['category2', 20],
['category3', 30],
],
color: 'green',
},
{
label: 'Failed',
data: [
['category1', 5],
['category2', 8],
['category3', 12],
],
color: 'red',
},
] as const;
const { Wrapper } = getWrapper();
render(
,
);
expect(screen.getByText('category1')).toBeInTheDocument();
expect(screen.getByText('category2')).toBeInTheDocument();
expect(screen.getByText('category3')).toBeInTheDocument();
});
it('should sort categories using defaultSort function', () => {
const testBars = [
{
label: 'Success',
data: [
['category1', 10],
['category2', 20],
['category3', 30],
],
color: 'green',
},
] as const;
const { Wrapper } = getWrapper();
render(
{
const valueA = pointA.Success;
const valueB = pointB.Success;
return valueB - valueA > 0 ? 1 : valueB - valueA < 0 ? -1 : 0;
}}
/>
,
);
// Categories should be rendered in descending order by value
const categories = screen.getAllByText(/category[123]/);
expect(categories[0]).toHaveTextContent('category3'); // 30 (highest)
expect(categories[1]).toHaveTextContent('category2'); // 20 (middle)
expect(categories[2]).toHaveTextContent('category1'); // 10 (lowest)
});
it('should render header with title, secondary title, right title and helpIcon', async () => {
const { Wrapper } = getWrapper();
render(
,
);
expect(screen.getByText('Test Title')).toBeInTheDocument();
expect(screen.getByText('Test Secondary Title')).toBeInTheDocument();
expect(screen.getByText('Test Right Title')).toBeInTheDocument();
await waitFor(() => {
expect(
screen.getByRole('button', { name: /More information/i }),
).toBeInTheDocument();
});
});
describe('formatDate', () => {
it('should render the CustomTick component with over a day interval', () => {
const { Wrapper } = getWrapper();
render(
,
);
expect(screen.getByText('05 Jul')).toBeInTheDocument();
});
it('should render the CustomTick component with day format', () => {
const { Wrapper } = getWrapper();
render(
,
);
expect(screen.getByText('05 Jul')).toBeInTheDocument();
});
it('should render the CustomTick component with hour format', () => {
const { Wrapper } = getWrapper();
render(
,
);
expect(screen.getByText('05 Jul')).toBeInTheDocument();
});
it('should render the CustomTick component with minute format', () => {
const { Wrapper } = getWrapper();
render(
,
);
expect(screen.getByText('05 Jul')).toBeInTheDocument();
});
});
});