grafana/public/app/plugins/datasource/cloud-monitoring/functions.test.ts
Andreas Christou 108acee08e
CloudMonitoring: Initial GCM Schema (#67739)
* Initial GCM schema work

- Split types for convenience
- Update conditionals where needed
- Update type references

* Add additional supporting types

* Add some more accessory and legacy types

* Add missing type

* Rename backend folder

* Add missing generated file

* Review
2023-05-22 17:19:54 +01:00

262 lines
7.8 KiB
TypeScript

import { AGGREGATIONS, SYSTEM_LABELS } from './constants';
import {
extractServicesFromMetricDescriptors,
getAggregationOptionsByMetric,
getAlignmentOptionsByMetric,
getAlignmentPickerData,
getLabelKeys,
getMetricTypes,
getMetricTypesByService,
labelsToGroupedOptions,
stringArrayToFilters,
alignmentPeriodLabel,
getMetricType,
setMetricType,
} from './functions';
import { newMockDatasource } from './specs/testData';
import { AlignmentTypes, TimeSeriesList, MetricKind, ValueTypes } from './types/query';
import { MetricDescriptor } from './types/types';
jest.mock('@grafana/runtime', () => ({
...jest.requireActual('@grafana/runtime'),
getTemplateSrv: () => ({
replace: jest.fn().mockImplementation((s: string) => s),
}),
}));
describe('functions', () => {
describe('extractServicesFromMetricDescriptors', () => {
it('should return unique metric descriptors', () => {
const desc: MetricDescriptor = {
valueType: '',
metricKind: MetricKind.CUMULATIVE,
type: '',
unit: '',
service: '1',
serviceShortName: '',
displayName: '',
description: '',
};
expect(extractServicesFromMetricDescriptors([desc, desc])).toEqual([desc]);
});
});
describe('getMetricTypesByService', () => {
it('filters by metric descriptiors', () => {
const desc1: MetricDescriptor = {
valueType: '',
metricKind: MetricKind.CUMULATIVE,
type: '',
unit: '',
service: '1',
serviceShortName: '',
displayName: '',
description: '',
};
const desc2: MetricDescriptor = {
valueType: '',
metricKind: MetricKind.CUMULATIVE,
type: '',
unit: '',
service: '2',
serviceShortName: '',
displayName: '',
description: '',
};
expect(getMetricTypesByService([desc1, desc2], '1')).toEqual([desc1]);
});
});
describe('getMetricTypes', () => {
it('gets metric type that exists in the array', () => {
const desc1: MetricDescriptor = {
valueType: '',
metricKind: MetricKind.CUMULATIVE,
type: '1',
unit: '',
service: 'svc1',
serviceShortName: '',
displayName: 'uno',
description: '',
};
const desc2: MetricDescriptor = {
valueType: '',
metricKind: MetricKind.CUMULATIVE,
type: '2',
unit: '',
service: 'svc2',
serviceShortName: '',
displayName: 'dos',
description: '',
};
expect(getMetricTypes([desc1, desc2], '1', '1', 'svc1')).toEqual({
metricTypes: [{ name: 'uno', value: '1' }],
selectedMetricType: '1',
});
});
it('gets metric type that does not exist in the array', () => {
const desc1: MetricDescriptor = {
valueType: '',
metricKind: MetricKind.CUMULATIVE,
type: '1',
unit: '',
service: 'svc1',
serviceShortName: '',
displayName: 'uno',
description: '',
};
const desc2: MetricDescriptor = {
valueType: '',
metricKind: MetricKind.CUMULATIVE,
type: '2',
unit: '',
service: 'svc2',
serviceShortName: '',
displayName: 'dos',
description: '',
};
expect(getMetricTypes([desc1, desc2], '3', '4', 'svc1')).toEqual({
metricTypes: [{ name: 'uno', value: '1' }],
selectedMetricType: '1',
});
});
});
describe('getAlignmentOptionsByMetric', () => {
let result: ReturnType<typeof getAlignmentOptionsByMetric>;
describe('when double and gauge is passed', () => {
beforeEach(() => {
result = getAlignmentOptionsByMetric(ValueTypes.DOUBLE, MetricKind.GAUGE);
});
it('should return all alignment options except two', () => {
expect(result.length).toBe(10);
expect(result.map((o) => o.value)).toEqual(
expect.not.arrayContaining(['REDUCE_COUNT_TRUE', 'REDUCE_COUNT_FALSE'])
);
});
});
describe('when double and delta is passed', () => {
beforeEach(() => {
result = getAlignmentOptionsByMetric(ValueTypes.DOUBLE, MetricKind.DELTA);
});
it('should return all alignment options except four', () => {
expect(result.length).toBe(9);
expect(result.map((o) => o.value)).toEqual(
expect.not.arrayContaining([
'ALIGN_COUNT_TRUE',
'ALIGN_COUNT_FALSE',
'ALIGN_FRACTION_TRUE',
'ALIGN_INTERPOLATE',
])
);
});
});
});
describe('getAggregationOptionsByMetric', () => {
it('gets a result for a type and a metric kind', () => {
expect(getAggregationOptionsByMetric(ValueTypes.BOOL, MetricKind.CUMULATIVE)).toEqual([
AGGREGATIONS[0],
AGGREGATIONS[6],
]);
});
});
describe('getLabelKeys', () => {
it('should return labels', async () => {
const ds = newMockDatasource();
ds.getLabels = jest.fn().mockResolvedValue({ l1: true, l2: true });
expect(await getLabelKeys(ds, 'type', 'project')).toEqual(['l1', 'l2', ...SYSTEM_LABELS]);
});
});
describe('getAlignmentPickerData', () => {
it('should return default data', () => {
const res = getAlignmentPickerData();
expect(res.alignOptions).toHaveLength(10);
expect(res.perSeriesAligner).toEqual(AlignmentTypes.ALIGN_MEAN);
});
it('should use provided data', () => {
const res = getAlignmentPickerData(ValueTypes.BOOL, MetricKind.CUMULATIVE);
expect(res.alignOptions).toHaveLength(0);
expect(res.perSeriesAligner).toEqual(AlignmentTypes.ALIGN_MEAN);
});
});
describe('labelsToGroupedOptions', () => {
it('should group in the same label', () => {
expect(labelsToGroupedOptions(['foo', 'bar'])).toEqual([
{
expanded: true,
label: '',
options: [
{ label: 'foo', value: 'foo' },
{ label: 'bar', value: 'bar' },
],
},
]);
});
it('should group in different labels', () => {
expect(labelsToGroupedOptions(['foo.bar', 'foobar'])).toEqual([
{
expanded: true,
label: 'Foo Bar',
options: [{ label: 'foo.bar', value: 'foo.bar' }],
},
{
expanded: true,
label: '',
options: [{ label: 'foobar', value: 'foobar' }],
},
]);
});
});
describe('stringArrayToFilters', () => {
it('chunks an array', () => {
expect(stringArrayToFilters(['key', 'operator', 'value', 'condition'])).toEqual([
{
condition: 'condition',
key: 'key',
operator: 'operator',
value: 'value',
},
]);
});
});
describe('alignmentPeriodLabel', () => {
it('returns period label if alignment period and per series aligner is set', () => {
const datasource = newMockDatasource();
const label = alignmentPeriodLabel({ perSeriesAligner: 'ALIGN_DELTA', alignmentPeriod: '10' }, datasource);
expect(label).toBe('10s interval (delta)');
});
});
describe('getMetricType', () => {
it('returns metric type', () => {
const metricType = getMetricType({ filters: ['metric.type', '=', 'test'] } as TimeSeriesList);
expect(metricType).toBe('test');
});
});
describe('setMetricType', () => {
it('sets a metric type if the filter did not exist', () => {
const metricType = setMetricType({} as TimeSeriesList, 'test');
expect(metricType.filters).toEqual(['metric.type', '=', 'test']);
});
it('sets a metric type if the filter exists', () => {
const metricType = setMetricType({ filters: ['metric.type', '=', 'test'] } as TimeSeriesList, 'other');
expect(metricType.filters).toEqual(['metric.type', '=', 'other']);
});
});
});