mirror of
https://github.com/grafana/grafana.git
synced 2025-09-22 14:43:51 +08:00

* Add and configure eslint-plugin-import * Fix the lint:ts npm command * Autofix + prettier all the files * Manually fix remaining files * Move jquery code in jest-setup to external file to safely reorder imports * Resolve issue caused by circular dependencies within Prometheus * Update .betterer.results * Fix missing // @ts-ignore * ignore iconBundle.ts * Fix missing // @ts-ignore
206 lines
6.1 KiB
TypeScript
206 lines
6.1 KiB
TypeScript
import { ReducerID } from '@grafana/data';
|
|
import { ExpressionQuery, ExpressionQueryType } from 'app/features/expressions/types';
|
|
import { defaultCondition } from 'app/features/expressions/utils/expressionTypes';
|
|
import { AlertQuery } from 'app/types/unified-alerting-dto';
|
|
|
|
import { getTimeRangeForExpression } from './timeRange';
|
|
|
|
describe('timeRange', () => {
|
|
describe('getTimeRangeForExpression', () => {
|
|
describe('classic condition', () => {
|
|
it('should return referenced query timeRange for classic condition', () => {
|
|
const expressionQuery: AlertQuery = {
|
|
refId: 'B',
|
|
queryType: 'expression',
|
|
datasourceUid: '-100',
|
|
model: {
|
|
queryType: 'query',
|
|
datasource: '__expr__',
|
|
refId: 'B',
|
|
conditions: [{ ...defaultCondition, query: { params: ['A'] } }],
|
|
type: ExpressionQueryType.classic,
|
|
} as ExpressionQuery,
|
|
};
|
|
const query: AlertQuery = {
|
|
refId: 'A',
|
|
relativeTimeRange: { from: 300, to: 0 },
|
|
queryType: 'query',
|
|
datasourceUid: 'dsuid',
|
|
model: { refId: 'A' },
|
|
};
|
|
const queries: AlertQuery[] = [query, expressionQuery];
|
|
|
|
expect(getTimeRangeForExpression(expressionQuery.model as ExpressionQuery, queries)).toEqual({
|
|
from: 300,
|
|
to: 0,
|
|
});
|
|
});
|
|
|
|
it('should return the min and max time range', () => {
|
|
const expressionQuery: AlertQuery = {
|
|
refId: 'C',
|
|
queryType: 'expression',
|
|
datasourceUid: '-100',
|
|
model: {
|
|
queryType: 'query',
|
|
datasource: '__expr__',
|
|
refId: 'C',
|
|
conditions: [
|
|
{ ...defaultCondition, query: { params: ['A'] } },
|
|
{ ...defaultCondition, query: { params: ['B'] } },
|
|
],
|
|
type: ExpressionQueryType.classic,
|
|
} as ExpressionQuery,
|
|
};
|
|
const queryA: AlertQuery = {
|
|
refId: 'A',
|
|
relativeTimeRange: { from: 300, to: 0 },
|
|
datasourceUid: 'dsuid',
|
|
model: { refId: 'A' },
|
|
queryType: 'query',
|
|
};
|
|
const queryB: AlertQuery = {
|
|
refId: 'B',
|
|
relativeTimeRange: { from: 600, to: 300 },
|
|
datasourceUid: 'dsuid',
|
|
model: { refId: 'B' },
|
|
queryType: 'query',
|
|
};
|
|
const queries: AlertQuery[] = [queryA, queryB, expressionQuery];
|
|
|
|
expect(getTimeRangeForExpression(expressionQuery.model as ExpressionQuery, queries)).toEqual({
|
|
from: 600,
|
|
to: 0,
|
|
});
|
|
});
|
|
});
|
|
});
|
|
describe('math', () => {
|
|
it('should get timerange for referenced query', () => {
|
|
const expressionQuery: AlertQuery = {
|
|
refId: 'B',
|
|
queryType: 'expression',
|
|
datasourceUid: '-100',
|
|
model: {
|
|
queryType: 'query',
|
|
datasource: '__expr__',
|
|
refId: 'B',
|
|
expression: '$A > 10',
|
|
type: ExpressionQueryType.math,
|
|
} as ExpressionQuery,
|
|
};
|
|
|
|
const query: AlertQuery = {
|
|
refId: 'A',
|
|
datasourceUid: 'dsuid',
|
|
relativeTimeRange: { from: 300, to: 0 },
|
|
model: { refId: 'A' },
|
|
queryType: 'query',
|
|
};
|
|
|
|
expect(getTimeRangeForExpression(expressionQuery.model as ExpressionQuery, [expressionQuery, query]));
|
|
});
|
|
|
|
it('should get time ranges for multiple referenced queries', () => {
|
|
const expressionQuery: AlertQuery = {
|
|
refId: 'C',
|
|
queryType: 'expression',
|
|
datasourceUid: '-100',
|
|
model: {
|
|
queryType: 'query',
|
|
datasource: '__expr__',
|
|
refId: 'C',
|
|
expression: '$A > 10 && $queryB > 20',
|
|
type: ExpressionQueryType.math,
|
|
} as ExpressionQuery,
|
|
};
|
|
|
|
const queryA: AlertQuery = {
|
|
refId: 'A',
|
|
relativeTimeRange: { from: 300, to: 0 },
|
|
datasourceUid: 'dsuid',
|
|
model: { refId: 'A' },
|
|
queryType: 'query',
|
|
};
|
|
|
|
const queryB: AlertQuery = {
|
|
refId: 'queryB',
|
|
relativeTimeRange: { from: 600, to: 300 },
|
|
datasourceUid: 'dsuid',
|
|
model: { refId: 'queryB' },
|
|
queryType: 'query',
|
|
};
|
|
|
|
expect(
|
|
getTimeRangeForExpression(expressionQuery.model as ExpressionQuery, [expressionQuery, queryA, queryB])
|
|
).toEqual({ from: 600, to: 0 });
|
|
});
|
|
});
|
|
|
|
describe('resample', () => {
|
|
it('should get referenced timerange for resample expression', () => {
|
|
const expressionQuery: AlertQuery = {
|
|
refId: 'B',
|
|
queryType: 'expression',
|
|
datasourceUid: '-100',
|
|
model: {
|
|
queryType: 'query',
|
|
datasource: '__expr__',
|
|
refId: 'B',
|
|
expression: 'A',
|
|
type: ExpressionQueryType.resample,
|
|
window: '10s',
|
|
} as ExpressionQuery,
|
|
};
|
|
|
|
const queryA: AlertQuery = {
|
|
refId: 'A',
|
|
relativeTimeRange: { from: 300, to: 0 },
|
|
datasourceUid: 'dsuid',
|
|
model: { refId: 'A' },
|
|
queryType: 'query',
|
|
};
|
|
|
|
const queries = [queryA, expressionQuery];
|
|
|
|
expect(getTimeRangeForExpression(expressionQuery.model as ExpressionQuery, queries)).toEqual({
|
|
from: 300,
|
|
to: 0,
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('reduce', () => {
|
|
it('should get referenced timerange for reduce expression', () => {
|
|
const expressionQuery: AlertQuery = {
|
|
refId: 'B',
|
|
queryType: 'expression',
|
|
datasourceUid: '-100',
|
|
model: {
|
|
queryType: 'query',
|
|
datasource: '__expr__',
|
|
refId: 'B',
|
|
expression: 'A',
|
|
type: ExpressionQueryType.reduce,
|
|
reducer: ReducerID.max,
|
|
} as ExpressionQuery,
|
|
};
|
|
|
|
const queryA: AlertQuery = {
|
|
refId: 'A',
|
|
relativeTimeRange: { from: 300, to: 0 },
|
|
datasourceUid: 'dsuid',
|
|
model: { refId: 'A' },
|
|
queryType: 'query',
|
|
};
|
|
|
|
const queries = [queryA, expressionQuery];
|
|
|
|
expect(getTimeRangeForExpression(expressionQuery.model as ExpressionQuery, queries)).toEqual({
|
|
from: 300,
|
|
to: 0,
|
|
});
|
|
});
|
|
});
|
|
});
|