From ecb877cb2441f032e15b10bfed6b78740c176c33 Mon Sep 17 00:00:00 2001 From: Josh Hunt Date: Wed, 10 Nov 2021 11:40:04 +0000 Subject: [PATCH] Snapshots: Fix panel inspector for snapshot data (#41530) --- packages/grafana-data/src/types/data.ts | 3 +- .../query/state/PanelQueryRunner.test.ts | 39 ++++++++++++++++--- .../features/query/state/PanelQueryRunner.ts | 11 ++++++ 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/packages/grafana-data/src/types/data.ts b/packages/grafana-data/src/types/data.ts index e28b876e178..f6941ede4f7 100644 --- a/packages/grafana-data/src/types/data.ts +++ b/packages/grafana-data/src/types/data.ts @@ -1,4 +1,4 @@ -import { FieldConfig } from './dataFrame'; +import { DataFrameDTO, FieldConfig } from './dataFrame'; import { DataTransformerConfig } from './transformations'; import { ApplyFieldOverrideOptions } from './fieldOverrides'; import { PanelPluginDataSupport } from '.'; @@ -171,4 +171,5 @@ export interface DataConfigSource { getDataSupport: () => PanelPluginDataSupport; getTransformations: () => DataTransformerConfig[] | undefined; getFieldOverrideOptions: () => ApplyFieldOverrideOptions | undefined; + snapshotData?: DataFrameDTO[]; } diff --git a/public/app/features/query/state/PanelQueryRunner.test.ts b/public/app/features/query/state/PanelQueryRunner.test.ts index 255b7bd60cd..2fa592dac1a 100644 --- a/public/app/features/query/state/PanelQueryRunner.test.ts +++ b/public/app/features/query/state/PanelQueryRunner.test.ts @@ -56,6 +56,11 @@ interface ScenarioContext { } type ScenarioFn = (ctx: ScenarioContext) => void; +const defaultPanelConfig: grafanaData.DataConfigSource = { + getFieldOverrideOptions: () => undefined, + getTransformations: () => undefined, + getDataSupport: () => ({ annotations: false, alertStates: false }), +}; function describeQueryRunnerScenario( description: string, @@ -64,11 +69,6 @@ function describeQueryRunnerScenario( ) { describe(description, () => { let setupFn = () => {}; - const defaultPanelConfig: grafanaData.DataConfigSource = { - getFieldOverrideOptions: () => undefined, - getTransformations: () => undefined, - getDataSupport: () => ({ annotations: false, alertStates: false }), - }; const ctx: ScenarioContext = { maxDataPoints: 200, scopedVars: { @@ -363,6 +363,35 @@ describe('PanelQueryRunner', () => { }), // @ts-ignore getTransformations: () => [{}], + getDataSupport: () => ({ annotations: false, alertStates: false }), + } + ); + + const snapshotData: grafanaData.DataFrameDTO[] = [ + { + fields: [ + { name: 'time', type: grafanaData.FieldType.time, values: [1000] }, + { name: 'value', type: grafanaData.FieldType.number, values: [1] }, + ], + }, + ]; + describeQueryRunnerScenario( + 'getData with snapshot data', + (ctx) => { + it('should return snapshotted data', async () => { + ctx.runner.getData({ withTransforms: false, withFieldConfig: true }).subscribe({ + next: (data: grafanaData.PanelData) => { + expect(data.state).toBe(grafanaData.LoadingState.Done); + expect(data.series).toEqual(snapshotData); + expect(data.timeRange).toEqual(grafanaData.getDefaultTimeRange()); + return data; + }, + }); + }); + }, + { + ...defaultPanelConfig, + snapshotData, } ); }); diff --git a/public/app/features/query/state/PanelQueryRunner.ts b/public/app/features/query/state/PanelQueryRunner.ts index a0e5eb11579..80513be6b20 100644 --- a/public/app/features/query/state/PanelQueryRunner.ts +++ b/public/app/features/query/state/PanelQueryRunner.ts @@ -23,12 +23,14 @@ import { DataSourceJsonData, DataSourceRef, DataTransformerConfig, + getDefaultTimeRange, LoadingState, PanelData, rangeUtil, ScopedVars, TimeRange, TimeZone, + toDataFrame, transformDataFrame, } from '@grafana/data'; import { getDashboardQueryRunner } from './DashboardQueryRunner/DashboardQueryRunner'; @@ -87,6 +89,15 @@ export class PanelQueryRunner { return compareDataFrameStructures(a, b, true); }; + if (this.dataConfigSource.snapshotData) { + const snapshotPanelData: PanelData = { + state: LoadingState.Done, + series: this.dataConfigSource.snapshotData.map((v) => toDataFrame(v)), + timeRange: getDefaultTimeRange(), // Don't need real time range for snapshots + }; + return of(snapshotPanelData); + } + return this.subject.pipe( this.getTransformationsStream(withTransforms), map((data: PanelData) => {