Files
2024-02-15 17:01:50 +00:00

150 lines
4.8 KiB
TypeScript

import type {MRI} from 'sentry/types';
import {
convertToDashboardWidget,
getWidgetQuery,
toDisplayType,
toMetricDisplayType,
} from 'sentry/utils/metrics/dashboard';
import {MetricDisplayType} from 'sentry/utils/metrics/types';
import {DisplayType} from 'sentry/views/dashboards/types';
describe('convertToDashboardWidget', () => {
it('should convert a metrics query to a dashboard widget (metrics mri, with grouping)', () => {
expect(
convertToDashboardWidget(
{
datetime: {
start: '2021-06-01T00:00:00',
end: '2021-06-02T00:00:00',
period: '1d',
utc: false,
},
groupBy: ['project'],
query: 'event.type:transaction',
projects: [1],
environments: ['prod'],
mri: 'c:custom/login@second',
op: 'p95',
},
MetricDisplayType.AREA
)
).toEqual({
title: 'p95(login)',
displayType: DisplayType.AREA,
widgetType: 'custom-metrics',
limit: 10,
queries: [
{
name: '',
aggregates: ['p95(c:custom/login@second)'],
columns: ['project'],
fields: ['p95(c:custom/login@second)'],
conditions: 'event.type:transaction',
orderby: '',
},
],
});
});
it('should convert a metrics query to a dashboard widget (transaction mri, with grouping)', () => {
expect(
convertToDashboardWidget(
{
datetime: {
start: '2021-06-01T00:00:00',
end: '2021-06-02T00:00:00',
period: '1d',
utc: false,
},
groupBy: [],
query: '',
projects: [1],
environments: ['prod'],
mri: 'd:transactions/measurements.duration@second',
op: 'p95',
},
MetricDisplayType.BAR
)
).toEqual({
title: 'p95(measurements.duration)',
displayType: DisplayType.BAR,
widgetType: 'custom-metrics',
limit: 1,
queries: [
{
name: '',
aggregates: ['p95(d:transactions/measurements.duration@second)'],
columns: [],
fields: ['p95(d:transactions/measurements.duration@second)'],
conditions: '',
orderby: '',
},
],
});
});
});
describe('toMetricDisplayType', () => {
it('should return the displayType if it is a valid MetricDisplayType', () => {
expect(MetricDisplayType.BAR).toEqual(toMetricDisplayType(DisplayType.BAR));
expect(MetricDisplayType.LINE).toEqual(toMetricDisplayType(DisplayType.LINE));
expect(MetricDisplayType.AREA).toEqual(toMetricDisplayType(DisplayType.AREA));
});
it('should return MetricDisplayType.LINE if the displayType is invalid or unsupported', () => {
expect(MetricDisplayType.LINE).toEqual(toMetricDisplayType(DisplayType.BIG_NUMBER));
expect(MetricDisplayType.LINE).toEqual(toMetricDisplayType(DisplayType.TABLE));
expect(MetricDisplayType.LINE).toEqual(toMetricDisplayType(DisplayType.TOP_N));
expect(MetricDisplayType.LINE).toEqual(toMetricDisplayType(undefined));
expect(MetricDisplayType.LINE).toEqual(toMetricDisplayType(''));
});
});
describe('toDisplayType', () => {
it('should return the displayType if it is a valid MetricDisplayType', () => {
expect(DisplayType.BAR).toEqual(toDisplayType(DisplayType.BAR));
expect(DisplayType.LINE).toEqual(toDisplayType(DisplayType.LINE));
expect(DisplayType.AREA).toEqual(toDisplayType(DisplayType.AREA));
expect(DisplayType.BIG_NUMBER).toEqual(toDisplayType(DisplayType.BIG_NUMBER));
expect(DisplayType.TABLE).toEqual(toDisplayType(DisplayType.TABLE));
expect(DisplayType.TOP_N).toEqual(toDisplayType(DisplayType.TOP_N));
});
it('should return DisplayType.LINE if the displayType is invalid or unsupported', () => {
expect(DisplayType.LINE).toEqual(toDisplayType(undefined));
expect(DisplayType.LINE).toEqual(toDisplayType(''));
});
});
describe('getWidgetQuery', () => {
const metricsQueryBase = {
datetime: {start: '2022-01-01', end: '2022-01-31', period: null, utc: false},
environments: ['production'],
projects: [1],
groupBy: [],
query: '',
};
it('should return the correct widget query object', () => {
// Arrange
const metricsQuery = {
...metricsQueryBase,
mri: 'd:custom/sentry.events.symbolicator.query_task@second' as MRI,
op: 'sum',
query: 'status = "success"',
title: 'Example Widget',
};
const expectedWidgetQuery = {
name: '',
aggregates: ['sum(d:custom/sentry.events.symbolicator.query_task@second)'],
columns: [],
fields: ['sum(d:custom/sentry.events.symbolicator.query_task@second)'],
conditions: 'status = "success"',
orderby: '',
};
expect(getWidgetQuery(metricsQuery)).toEqual(expectedWidgetQuery);
});
});