forked from grafana.jool/grafana-jool
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
169 lines
4.7 KiB
169 lines
4.7 KiB
import { ClassicCondition, ExpressionQuery } from 'app/features/expressions/types';
|
|
import { AlertQuery } from 'app/types/unified-alerting-dto';
|
|
import { queriesWithUpdatedReferences, updateMathExpressionRefs } from './util';
|
|
|
|
describe('rule-editor', () => {
|
|
const dataSource: AlertQuery = {
|
|
refId: 'A',
|
|
datasourceUid: 'abc123',
|
|
queryType: '',
|
|
relativeTimeRange: {
|
|
from: 600,
|
|
to: 0,
|
|
},
|
|
model: {
|
|
refId: 'A',
|
|
},
|
|
};
|
|
|
|
const classicCondition = {
|
|
refId: 'B',
|
|
datasourceUid: '-100',
|
|
queryType: '',
|
|
model: {
|
|
refId: 'B',
|
|
type: 'classic_conditions',
|
|
datasource: {
|
|
uid: '-100',
|
|
type: 'grafana-expression',
|
|
},
|
|
conditions: [
|
|
{
|
|
type: 'query',
|
|
evaluator: {
|
|
params: [3],
|
|
type: 'gt',
|
|
},
|
|
operator: {
|
|
type: 'and',
|
|
},
|
|
query: {
|
|
params: ['A'],
|
|
},
|
|
reducer: {
|
|
params: [],
|
|
type: 'last',
|
|
},
|
|
},
|
|
],
|
|
},
|
|
};
|
|
|
|
const mathExpression = {
|
|
refId: 'B',
|
|
datasourceUid: '-100',
|
|
queryType: '',
|
|
model: {
|
|
refId: 'B',
|
|
type: 'math',
|
|
datasource: {
|
|
uid: '-100',
|
|
type: 'grafana-expression',
|
|
},
|
|
conditions: [],
|
|
expression: 'abs($A) + $A',
|
|
},
|
|
};
|
|
|
|
const reduceExpression = {
|
|
refId: 'B',
|
|
datasourceUid: '-100',
|
|
queryType: '',
|
|
model: {
|
|
refId: 'B',
|
|
type: 'reduce',
|
|
datasource: {
|
|
uid: '-100',
|
|
type: 'grafana-expression',
|
|
},
|
|
conditions: [],
|
|
reducer: 'mean',
|
|
expression: 'A',
|
|
},
|
|
};
|
|
|
|
const resampleExpression = {
|
|
refId: 'A',
|
|
datasourceUid: '-100',
|
|
model: {
|
|
refId: 'A',
|
|
type: 'resample',
|
|
datasource: {
|
|
type: '__expr__',
|
|
uid: '__expr__',
|
|
},
|
|
conditions: [],
|
|
downsampler: 'mean',
|
|
upsampler: 'fillna',
|
|
expression: 'A',
|
|
window: '30m',
|
|
},
|
|
queryType: '',
|
|
};
|
|
|
|
describe('rewires query names', () => {
|
|
it('should rewire classic expressions', () => {
|
|
const queries: AlertQuery[] = [dataSource, classicCondition];
|
|
const rewiredQueries = queriesWithUpdatedReferences(queries, 'A', 'C');
|
|
|
|
const queryModel = rewiredQueries[1].model as ExpressionQuery;
|
|
|
|
const checkConditionParams = (condition: ClassicCondition) => {
|
|
return expect(condition.query.params).toEqual(['C']);
|
|
};
|
|
|
|
expect(queryModel.conditions?.every(checkConditionParams));
|
|
});
|
|
|
|
it('should rewire math expressions', () => {
|
|
const queries: AlertQuery[] = [dataSource, mathExpression];
|
|
const rewiredQueries = queriesWithUpdatedReferences(queries, 'A', 'Query A');
|
|
|
|
const queryModel = rewiredQueries[1].model as ExpressionQuery;
|
|
|
|
expect(queryModel.expression).toBe('abs(${Query A}) + ${Query A}');
|
|
});
|
|
|
|
it('should rewire reduce expressions', () => {
|
|
const queries: AlertQuery[] = [dataSource, reduceExpression];
|
|
const rewiredQueries = queriesWithUpdatedReferences(queries, 'A', 'C');
|
|
|
|
const queryModel = rewiredQueries[1].model as ExpressionQuery;
|
|
expect(queryModel.expression).toBe('C');
|
|
});
|
|
|
|
it('should rewire resample expressions', () => {
|
|
const queries: AlertQuery[] = [dataSource, resampleExpression];
|
|
const rewiredQueries = queriesWithUpdatedReferences(queries, 'A', 'C');
|
|
|
|
const queryModel = rewiredQueries[1].model as ExpressionQuery;
|
|
expect(queryModel.expression).toBe('C');
|
|
});
|
|
|
|
it('should rewire multiple expressions', () => {
|
|
const queries: AlertQuery[] = [dataSource, mathExpression, resampleExpression];
|
|
const rewiredQueries = queriesWithUpdatedReferences(queries, 'A', 'C');
|
|
|
|
expect(rewiredQueries[1].model as ExpressionQuery).toHaveProperty('expression', 'abs(${C}) + ${C}');
|
|
expect(rewiredQueries[2].model as ExpressionQuery).toHaveProperty('expression', 'C');
|
|
});
|
|
|
|
it('should skip if refs are identical', () => {
|
|
const queries: AlertQuery[] = [dataSource, reduceExpression, mathExpression];
|
|
const rewiredQueries = queriesWithUpdatedReferences(queries, 'A', 'A');
|
|
|
|
expect(rewiredQueries[0]).toEqual(queries[0]);
|
|
expect(rewiredQueries[1]).toEqual(queries[1]);
|
|
expect(rewiredQueries[2]).toEqual(queries[2]);
|
|
});
|
|
});
|
|
|
|
describe('updateMathExpressionRefs', () => {
|
|
it('should rewire refs without brackets', () => {
|
|
expect(updateMathExpressionRefs('abs($Foo) + $Foo', 'Foo', 'Bar')).toBe('abs(${Bar}) + ${Bar}');
|
|
});
|
|
it('should rewire refs with brackets', () => {
|
|
expect(updateMathExpressionRefs('abs(${Foo}) + $Foo', 'Foo', 'Bar')).toBe('abs(${Bar}) + ${Bar}');
|
|
});
|
|
});
|
|
});
|
|
|