mirror of https://github.com/buster-so/buster.git
101 lines
3.1 KiB
TypeScript
101 lines
3.1 KiB
TypeScript
import { pieOptionsHandler, piePluginsHandler } from './pieChartOptions';
|
|
import { determineFontColorContrast } from '@/lib/colors';
|
|
import type { ChartSpecificOptionsProps } from './interfaces';
|
|
import type { ChartData } from 'chart.js';
|
|
|
|
jest.mock('@/lib/colors');
|
|
|
|
const mockChartData: ChartData = {
|
|
labels: ['Test'],
|
|
datasets: [
|
|
{
|
|
data: [1],
|
|
label: 'Test Dataset',
|
|
type: 'pie',
|
|
tooltipData: [],
|
|
xAxisKeys: ['category'],
|
|
yAxisKey: 'value'
|
|
}
|
|
]
|
|
};
|
|
|
|
describe('pieOptionsHandler', () => {
|
|
it('should return correct cutout percentage when pieDonutWidth is provided', () => {
|
|
const props: ChartSpecificOptionsProps = {
|
|
pieDonutWidth: 10,
|
|
pieShowInnerLabel: false,
|
|
pieInnerLabelTitle: '',
|
|
pieInnerLabelAggregate: 'sum',
|
|
pieLabelPosition: 'inside',
|
|
pieDisplayLabelAs: 'number',
|
|
selectedAxis: { y: ['value'], x: ['category'] },
|
|
columnLabelFormats: {},
|
|
barShowTotalAtTop: false,
|
|
columnSettings: {},
|
|
barGroupType: 'stack',
|
|
data: mockChartData
|
|
};
|
|
|
|
const result = pieOptionsHandler(props);
|
|
// Using type assertion since we know the shape of the result
|
|
expect((result as any).cutout).toBe('45%'); // 10 + 35 = 45%
|
|
});
|
|
});
|
|
|
|
describe('piePluginsHandler', () => {
|
|
it('should return correct plugin configuration for inner label display', () => {
|
|
const props: ChartSpecificOptionsProps = {
|
|
pieInnerLabelTitle: 'Total',
|
|
pieShowInnerLabel: true,
|
|
pieDonutWidth: 20,
|
|
pieInnerLabelAggregate: 'sum',
|
|
pieLabelPosition: 'inside',
|
|
pieDisplayLabelAs: 'number',
|
|
selectedAxis: { y: ['value'], x: ['category'] },
|
|
columnLabelFormats: {
|
|
value: { columnType: 'number', style: 'number' }
|
|
},
|
|
barShowTotalAtTop: false,
|
|
columnSettings: {},
|
|
barGroupType: 'stack',
|
|
data: mockChartData
|
|
};
|
|
|
|
const result = piePluginsHandler(props);
|
|
|
|
expect(result?.annotation).toBeDefined();
|
|
// Using type assertion since we know the shape of the annotation plugin
|
|
const annotations = (result?.annotation?.annotations as any)?.donutInnerLabel;
|
|
expect(annotations).toBeDefined();
|
|
expect(annotations?.display).toBe(true);
|
|
});
|
|
|
|
it('should configure datalabels plugin correctly for inside position', () => {
|
|
const mockDetermineFontColorContrast = determineFontColorContrast as jest.Mock;
|
|
mockDetermineFontColorContrast.mockReturnValue('#ffffff');
|
|
|
|
const props: ChartSpecificOptionsProps = {
|
|
pieInnerLabelTitle: '',
|
|
pieShowInnerLabel: false,
|
|
pieDonutWidth: 0,
|
|
pieInnerLabelAggregate: 'sum',
|
|
pieLabelPosition: 'inside',
|
|
pieDisplayLabelAs: 'number',
|
|
selectedAxis: { y: ['value'], x: ['category'] },
|
|
columnLabelFormats: {
|
|
value: { columnType: 'number', style: 'number' }
|
|
},
|
|
barShowTotalAtTop: false,
|
|
columnSettings: {},
|
|
barGroupType: 'stack',
|
|
data: mockChartData
|
|
};
|
|
|
|
const result = piePluginsHandler(props);
|
|
|
|
expect(result?.datalabels).toBeDefined();
|
|
expect(result?.datalabels?.display).toBe('auto');
|
|
expect(result?.datalabels?.anchor).toBe('center');
|
|
});
|
|
});
|