grafana/public/app/features/templating/dataMacros.test.ts
Torkel Ödegaard 507c6e7d97
Templating: Replace __data , __field and __cell_n with macros (#65324)
* Templating: __data __field and __series macros

* filter out datacontext from json serialization

* Fix condition

* Update

* Added test cases for formatting data, and field macros
2023-04-05 11:10:33 +02:00

159 lines
5.0 KiB
TypeScript

import { initTemplateSrv } from 'test/helpers/initTemplateSrv';
import { DataContextScopedVar, FieldType, toDataFrame } from '@grafana/data';
import { TemplateSrv } from '@grafana/runtime';
describe('dataMacros', () => {
let _templateSrv: TemplateSrv;
beforeEach(() => {
_templateSrv = initTemplateSrv('hello', []);
});
const data = toDataFrame({
name: 'frameName',
refId: 'refIdA',
fields: [
{
name: 'CoolNumber',
type: FieldType.number,
values: [5, 10],
labels: { cluster: 'US', region: 'west=1' },
display: (value: number) => {
return { text: value.toString(), numeric: value, suffix: '%' };
},
},
{
name: 'time',
type: FieldType.time,
values: [5000, 10000],
},
],
});
it('Should interpolate __value.* expressions with dataContext in scopedVars', () => {
const dataContext: DataContextScopedVar = {
value: {
data: [data],
frame: data,
field: data.fields[0],
rowIndex: 1,
},
};
const scopedVars = { __dataContext: dataContext };
expect(_templateSrv.replace('${__value.raw}', scopedVars)).toBe('10');
expect(_templateSrv.replace('${__value.numeric}', scopedVars)).toBe('10');
expect(_templateSrv.replace('${__value}', scopedVars)).toBe('10%');
expect(_templateSrv.replace('${__value.text}', scopedVars)).toBe('10');
expect(_templateSrv.replace('${__value.time}', scopedVars)).toBe('10000');
// can apply format as well
expect(_templateSrv.replace('${__value:percentencode}', scopedVars)).toBe('10%25');
});
it('Should interpolate __value.* with calculatedValue', () => {
const dataContext: DataContextScopedVar = {
value: {
data: [data],
frame: data,
field: data.fields[0],
calculatedValue: {
text: '15',
numeric: 15,
suffix: '%',
},
},
};
const scopedVars = { __dataContext: dataContext };
expect(_templateSrv.replace('${__value.raw}', scopedVars)).toBe('15');
expect(_templateSrv.replace('${__value.numeric}', scopedVars)).toBe('15');
expect(_templateSrv.replace('${__value}', scopedVars)).toBe('15%');
expect(_templateSrv.replace('${__value.text}', scopedVars)).toBe('15%');
expect(_templateSrv.replace('${__value.time}', scopedVars)).toBe('');
});
it('Should return match when ${__value.*} is used and no dataContext or rowIndex is found', () => {
const dataContext: DataContextScopedVar = {
value: {
data: [data],
frame: data,
field: data.fields[0],
},
};
const scopedVars = { __dataContext: dataContext };
expect(_templateSrv.replace('${__value.raw}', scopedVars)).toBe('${__value.raw}');
});
it('Should interpolate __data.* correctly', () => {
const dataContext: DataContextScopedVar = {
value: {
data: [data],
frame: data,
field: data.fields[0],
rowIndex: 1,
},
};
const scopedVars = { __dataContext: dataContext };
expect(_templateSrv.replace('${__data.fields[1]}', scopedVars)).toBe('10000');
expect(_templateSrv.replace('${__data.fields[0]}', scopedVars)).toBe('10%');
expect(_templateSrv.replace('${__data.fields[0].text}', scopedVars)).toBe('10');
expect(_templateSrv.replace('${__data.fields["CoolNumber"].text}', scopedVars)).toBe('10');
expect(_templateSrv.replace('${__data.name}', scopedVars)).toBe('frameName');
expect(_templateSrv.replace('${__data.refId}', scopedVars)).toBe('refIdA');
expect(_templateSrv.replace('${__data.fields[0]:percentencode}', scopedVars)).toBe('10%25');
});
it('${__data.*} should return match when the rowIndex is missing dataContext is not there', () => {
const dataContext: DataContextScopedVar = {
value: {
data: [data],
frame: data,
field: data.fields[0],
},
};
const scopedVars = { __dataContext: dataContext };
expect(_templateSrv.replace('${__data.name}', scopedVars)).toBe('${__data.name}');
});
it('Should interpolate ${__series} to frame display name', () => {
const dataContext: DataContextScopedVar = {
value: {
data: [data],
frame: data,
field: data.fields[0],
frameIndex: 0,
},
};
const scopedVars = { __dataContext: dataContext };
expect(_templateSrv.replace('${__series.name}', scopedVars)).toBe('frameName');
});
it('Should interpolate ${__field.*} correctly', () => {
const dataContext: DataContextScopedVar = {
value: {
data: [data],
frame: data,
field: data.fields[0],
frameIndex: 0,
},
};
const scopedVars = { __dataContext: dataContext };
expect(_templateSrv.replace('${__field.name}', scopedVars)).toBe('CoolNumber');
expect(_templateSrv.replace('${__field.labels.cluster}', scopedVars)).toBe('US');
expect(_templateSrv.replace('${__field.labels.region:percentencode}', scopedVars)).toBe('west%3D1');
});
});