The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.
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.
 
 
 
 
 
 
grafana/public/app/features/query/state/queryAnalytics.test.ts

106 lines
2.8 KiB

import { MetaAnalyticsEventName, reportMetaAnalytics } from '@grafana/runtime';
import { CoreApp, DataQueryRequest, DataSourceApi, dateTime, LoadingState, PanelData } from '@grafana/data';
import { emitDataRequestEvent } from './queryAnalytics';
import { DashboardModel } from '../../dashboard/state/DashboardModel';
beforeEach(() => {
jest.clearAllMocks();
});
const datasource = {
name: 'test',
id: 1,
} as DataSourceApi;
const dashboardModel = new DashboardModel(
{ id: 1, title: 'Test Dashboard', uid: 'test' },
{ folderTitle: 'Test Folder' }
);
jest.mock('app/features/dashboard/services/DashboardSrv', () => ({
getDashboardSrv: () => {
return {
getCurrent: () => dashboardModel,
};
},
}));
jest.mock('@grafana/runtime', () => ({
...(jest.requireActual('@grafana/runtime') as any),
reportMetaAnalytics: jest.fn(),
}));
const mockGetUrlSearchParams = jest.fn(() => {
return {};
});
jest.mock('@grafana/data', () => ({
...(jest.requireActual('@grafana/data') as any),
urlUtil: {
getUrlSearchParams: () => mockGetUrlSearchParams(),
},
}));
function getTestData(requestApp: string): PanelData {
const now = dateTime();
return {
request: {
app: requestApp,
dashboardId: 1,
panelId: 2,
startTime: now.unix(),
endTime: now.add(1, 's').unix(),
} as DataQueryRequest,
series: [],
state: LoadingState.Done,
timeRange: {
from: dateTime(),
to: dateTime(),
raw: { from: '1h', to: 'now' },
},
};
}
describe('emitDataRequestEvent - from a dashboard panel', () => {
const data = getTestData(CoreApp.Dashboard);
const fn = emitDataRequestEvent(datasource);
it('Should report meta analytics', () => {
fn(data);
expect(reportMetaAnalytics).toBeCalledTimes(1);
expect(reportMetaAnalytics).toBeCalledWith(
expect.objectContaining({
eventName: MetaAnalyticsEventName.DataRequest,
datasourceName: datasource.name,
datasourceId: datasource.id,
panelId: 2,
dashboardId: 1,
dashboardName: 'Test Dashboard',
dashboardUid: 'test',
folderName: 'Test Folder',
dataSize: 0,
duration: 1,
})
);
});
it('Should not report meta analytics twice if the request receives multiple responses', () => {
fn(data);
expect(reportMetaAnalytics).not.toBeCalled();
});
it('Should not report meta analytics in edit mode', () => {
mockGetUrlSearchParams.mockImplementationOnce(() => {
return { editPanel: 2 };
});
emitDataRequestEvent(datasource)(data);
expect(reportMetaAnalytics).not.toBeCalled();
});
});
describe('emitDataRequestEvent - from Explore', () => {
const data = getTestData(CoreApp.Explore);
it('Should not report meta analytics', () => {
emitDataRequestEvent(datasource)(data);
expect(reportMetaAnalytics).not.toBeCalled();
});
});