diff --git a/public/app/plugins/datasource/parca/datasource.test.ts b/public/app/plugins/datasource/parca/datasource.test.ts new file mode 100644 index 00000000000..1a0a216273f --- /dev/null +++ b/public/app/plugins/datasource/parca/datasource.test.ts @@ -0,0 +1,71 @@ +import { DataSourceInstanceSettings, PluginMetaInfo, PluginType } from '@grafana/data'; +import { getTemplateSrv } from '@grafana/runtime'; + +import { defaultParcaQueryType } from './dataquery.gen'; +import { ParcaDataSource } from './datasource'; +import { Query } from './types'; + +jest.mock('@grafana/runtime', () => { + const actual = jest.requireActual('@grafana/runtime'); + return { + ...actual, + getTemplateSrv: () => { + return { + replace: (query: string): string => { + return query.replace(/\$var/g, 'interpolated'); + }, + }; + }, + }; +}); + +describe('Parca data source', () => { + let ds: ParcaDataSource; + beforeEach(() => { + ds = new ParcaDataSource(defaultSettings); + }); + + describe('applyTemplateVariables', () => { + const templateSrv = getTemplateSrv(); + + it('should not update labelSelector if there are no template variables', () => { + ds = new ParcaDataSource(defaultSettings, templateSrv); + const query = ds.applyTemplateVariables(defaultQuery({ labelSelector: `no var` }), {}); + expect(query).toMatchObject({ labelSelector: `no var` }); + }); + + it('should update labelSelector if there are template variables', () => { + ds = new ParcaDataSource(defaultSettings, templateSrv); + const query = ds.applyTemplateVariables(defaultQuery({ labelSelector: `{$var="$var"}` }), {}); + expect(query).toMatchObject({ labelSelector: `{interpolated="interpolated"}` }); + }); + }); +}); + +const defaultSettings: DataSourceInstanceSettings = { + id: 0, + uid: 'parca', + type: 'profiling', + name: 'parca', + access: 'proxy', + meta: { + id: 'parca', + name: 'parca', + type: PluginType.datasource, + info: {} as PluginMetaInfo, + module: '', + baseUrl: '', + }, + jsonData: {}, + readOnly: false, +}; + +const defaultQuery = (query: Partial): Query => { + return { + refId: 'x', + labelSelector: '', + profileTypeId: '', + queryType: defaultParcaQueryType, + ...query, + }; +}; diff --git a/public/app/plugins/datasource/parca/datasource.ts b/public/app/plugins/datasource/parca/datasource.ts index 6418e15d6d3..128e7c91d9f 100644 --- a/public/app/plugins/datasource/parca/datasource.ts +++ b/public/app/plugins/datasource/parca/datasource.ts @@ -1,12 +1,15 @@ import { Observable, of } from 'rxjs'; -import { DataQueryRequest, DataQueryResponse, DataSourceInstanceSettings } from '@grafana/data'; -import { DataSourceWithBackend } from '@grafana/runtime'; +import { DataQueryRequest, DataQueryResponse, DataSourceInstanceSettings, ScopedVars } from '@grafana/data'; +import { DataSourceWithBackend, getTemplateSrv, TemplateSrv } from '@grafana/runtime'; import { ParcaDataSourceOptions, Query, ProfileTypeMessage } from './types'; export class ParcaDataSource extends DataSourceWithBackend { - constructor(instanceSettings: DataSourceInstanceSettings) { + constructor( + instanceSettings: DataSourceInstanceSettings, + private readonly templateSrv: TemplateSrv = getTemplateSrv() + ) { super(instanceSettings); } @@ -19,6 +22,13 @@ export class ParcaDataSource extends DataSourceWithBackend { return await super.getResource('profileTypes'); }