From 96b2ed367e2b733e4da103d556864d923480f40a Mon Sep 17 00:00:00 2001 From: Kristina Durivage Date: Tue, 7 Oct 2025 12:44:53 -0500 Subject: [PATCH] Add refID tests to affected transformations --- .../transformers/joinByField.test.ts | 9 +- .../transformers/merge.test.ts | 12 ++- .../transformers/reduce.test.ts | 13 ++- .../transformers/seriesToRows.test.ts | 11 ++- .../joinByLabels/joinByLabels.test.ts | 99 +++++++++++-------- 5 files changed, 90 insertions(+), 54 deletions(-) diff --git a/packages/grafana-data/src/transformations/transformers/joinByField.test.ts b/packages/grafana-data/src/transformations/transformers/joinByField.test.ts index 897a03b7fe9..572e6ab0077 100644 --- a/packages/grafana-data/src/transformations/transformers/joinByField.test.ts +++ b/packages/grafana-data/src/transformations/transformers/joinByField.test.ts @@ -14,6 +14,7 @@ describe('JOIN Transformer', () => { describe('outer join', () => { const everySecondSeries = toDataFrame({ + refId: 'A', name: 'even', fields: [ { name: 'time', type: FieldType.time, values: [3000, 4000, 5000, 6000] }, @@ -23,6 +24,7 @@ describe('JOIN Transformer', () => { }); const everyOtherSecondSeries = toDataFrame({ + refId: 'B', name: 'odd', fields: [ { name: 'time', type: FieldType.time, values: [1000, 3000, 5000, 7000] }, @@ -31,18 +33,20 @@ describe('JOIN Transformer', () => { ], }); - it('joins by time field', async () => { + it('joins by time field with defined refId', async () => { const cfg: DataTransformerConfig = { id: DataTransformerID.seriesToColumns, options: { byField: 'time', }, + refId: 'test', }; await expect(transformDataFrame([cfg], [everySecondSeries, everyOtherSecondSeries])).toEmitValuesWith( (received) => { const data = received[0]; const filtered = data[0]; + expect(filtered.refId).toBe('test'); expect(filtered.fields).toMatchInlineSnapshot(` [ { @@ -133,7 +137,7 @@ describe('JOIN Transformer', () => { ); }); - it('joins by temperature field', async () => { + it('joins by temperature field with dynamic refId', async () => { const cfg: DataTransformerConfig = { id: DataTransformerID.seriesToColumns, options: { @@ -145,6 +149,7 @@ describe('JOIN Transformer', () => { (received) => { const data = received[0]; const filtered = data[0]; + expect(filtered.refId).toBe('joinByField-A-B'); expect(filtered.fields).toMatchInlineSnapshot(` [ { diff --git a/packages/grafana-data/src/transformations/transformers/merge.test.ts b/packages/grafana-data/src/transformations/transformers/merge.test.ts index 81bcf535c7d..f3543f9ed4e 100644 --- a/packages/grafana-data/src/transformations/transformers/merge.test.ts +++ b/packages/grafana-data/src/transformations/transformers/merge.test.ts @@ -32,8 +32,9 @@ describe('Merge multiple to single', () => { }); }); - it('combine two series into one', async () => { + it('combine two series into one with dynamic refId', async () => { const seriesA = toDataFrame({ + refId: 'A', name: 'A', fields: [ { name: 'Time', type: FieldType.time, values: [1000] }, @@ -42,6 +43,7 @@ describe('Merge multiple to single', () => { }); const seriesB = toDataFrame({ + refId: 'B', name: 'B', fields: [ { name: 'Time', type: FieldType.time, values: [2000] }, @@ -55,7 +57,7 @@ describe('Merge multiple to single', () => { createField('Time', FieldType.time, [1000, 2000]), createField('Temp', FieldType.number, [1, -1]), ]; - + expect(result[0].refId).toBe('merge-A-B'); expect(unwrap(result[0].fields)).toEqual(expected); }); }); @@ -77,13 +79,15 @@ describe('Merge multiple to single', () => { ], }); - await expect(transformDataFrame([cfg], [seriesA, seriesB])).toEmitValuesWith((received) => { + const config = { ...cfg, refId: 'test' }; + + await expect(transformDataFrame([config], [seriesA, seriesB])).toEmitValuesWith((received) => { const result = received[0]; const expected: Field[] = [ createField('Time', FieldType.time, [100, 150, 200, 100, 125, 126]), createField('Temp', FieldType.number, [1, 4, 5, -1, 2, 3]), ]; - + expect(result[0].refId).toBe('test'); expect(unwrap(result[0].fields)).toEqual(expected); }); }); diff --git a/packages/grafana-data/src/transformations/transformers/reduce.test.ts b/packages/grafana-data/src/transformations/transformers/reduce.test.ts index f50072e0f30..e6a69351639 100644 --- a/packages/grafana-data/src/transformations/transformers/reduce.test.ts +++ b/packages/grafana-data/src/transformations/transformers/reduce.test.ts @@ -11,6 +11,7 @@ import { DataTransformerID } from './ids'; import { reduceFields, reduceTransformer, ReduceTransformerMode, ReduceTransformerOptions } from './reduce'; const seriesAWithSingleField = toDataFrame({ + refId: 'A', name: 'A', fields: [ { name: 'time', type: FieldType.time, values: [3000, 4000, 5000, 6000] }, @@ -19,6 +20,7 @@ const seriesAWithSingleField = toDataFrame({ }); const seriesAWithMultipleFields = toDataFrame({ + refId: 'B', name: 'A', fields: [ { name: 'time', type: FieldType.time, values: [3000, 4000, 5000, 6000] }, @@ -28,6 +30,7 @@ const seriesAWithMultipleFields = toDataFrame({ }); const seriesAWithAllNulls = toDataFrame({ + refId: 'C', name: 'A', fields: [ { name: 'time', type: FieldType.time, values: [3000, 4000, 5000, 6000] }, @@ -36,6 +39,7 @@ const seriesAWithAllNulls = toDataFrame({ }); const seriesBWithSingleField = toDataFrame({ + refId: 'D', name: 'B', fields: [ { name: 'time', type: FieldType.time, values: [1000, 3000, 5000, 7000] }, @@ -44,6 +48,7 @@ const seriesBWithSingleField = toDataFrame({ }); const seriesBWithMultipleFields = toDataFrame({ + refId: 'E', name: 'B', fields: [ { name: 'time', type: FieldType.time, values: [1000, 3000, 5000, 7000] }, @@ -53,6 +58,7 @@ const seriesBWithMultipleFields = toDataFrame({ }); const seriesBWithAllNulls = toDataFrame({ + refId: 'F', name: 'B', fields: [ { name: 'time', type: FieldType.time, values: [3000, 4000, 5000, 6000] }, @@ -65,7 +71,7 @@ describe('Reducer Transformer', () => { mockTransformationsRegistry([reduceTransformer]); }); - it('reduces multiple data frames with many fields', async () => { + it('reduces multiple data frames with many fields and dynamic refId', async () => { const cfg = { id: DataTransformerID.reduce, options: { @@ -135,6 +141,7 @@ describe('Reducer Transformer', () => { }, ]; + expect(processed[0].refId).toBe('reduce-B-E'); expect(processed.length).toEqual(1); expect(processed[0].length).toEqual(4); expect(processed[0].fields).toEqual(expected); @@ -142,12 +149,13 @@ describe('Reducer Transformer', () => { ); }); - it('reduces multiple data frames with single field', async () => { + it('reduces multiple data frames with single field and static refId', async () => { const cfg = { id: DataTransformerID.reduce, options: { reducers: [ReducerID.first, ReducerID.min, ReducerID.max, ReducerID.last], }, + refId: 'test', }; await expect(transformDataFrame([cfg], [seriesAWithSingleField, seriesBWithSingleField])).toEmitValuesWith( @@ -187,6 +195,7 @@ describe('Reducer Transformer', () => { ]; expect(processed.length).toEqual(1); + expect(processed[0].refId).toBe('test'); expect(processed[0].length).toEqual(2); expect(processed[0].fields).toEqual(expected); } diff --git a/packages/grafana-data/src/transformations/transformers/seriesToRows.test.ts b/packages/grafana-data/src/transformations/transformers/seriesToRows.test.ts index 0db6812a0d8..660acab9c23 100644 --- a/packages/grafana-data/src/transformations/transformers/seriesToRows.test.ts +++ b/packages/grafana-data/src/transformations/transformers/seriesToRows.test.ts @@ -39,10 +39,11 @@ describe('Series to rows', () => { }); }); - it('combine two series into one', async () => { + it('combine two series into one with static refId', async () => { const cfg: DataTransformerConfig = { id: DataTransformerID.seriesToRows, options: {}, + refId: 'test', }; const seriesA = toDataFrame({ @@ -69,18 +70,19 @@ describe('Series to rows', () => { createField('Metric', FieldType.string, ['B', 'A']), createField('Value', FieldType.number, [-1, 1]), ]; - + expect(result[0].refId).toBe('test'); expect(unwrap(result[0].fields)).toEqual(expected); }); }); - it('combine two series with multiple values into one', async () => { + it('combine two series with multiple values into one with dynamic refid', async () => { const cfg: DataTransformerConfig = { id: DataTransformerID.seriesToRows, options: {}, }; const seriesA = toDataFrame({ + refId: 'A', name: 'A', fields: [ { name: 'Time', type: FieldType.time, values: [100, 150, 200] }, @@ -89,6 +91,7 @@ describe('Series to rows', () => { }); const seriesB = toDataFrame({ + refId: 'B', name: 'B', fields: [ { name: 'Time', type: FieldType.time, values: [100, 125, 126] }, @@ -104,7 +107,7 @@ describe('Series to rows', () => { createField('Metric', FieldType.string, ['A', 'A', 'B', 'B', 'A', 'B']), createField('Value', FieldType.number, [5, 4, 3, 2, 1, -1]), ]; - + expect(result[0].refId).toBe('seriesToRows-A-B'); expect(unwrap(result[0].fields)).toEqual(expected); }); }); diff --git a/public/app/features/transformers/joinByLabels/joinByLabels.test.ts b/public/app/features/transformers/joinByLabels/joinByLabels.test.ts index d2d0574e4f5..0ab47e1758d 100644 --- a/public/app/features/transformers/joinByLabels/joinByLabels.test.ts +++ b/public/app/features/transformers/joinByLabels/joinByLabels.test.ts @@ -3,58 +3,62 @@ import { toDataFrame, FieldType, DataFrame } from '@grafana/data'; import { joinByLabels } from './joinByLabels'; describe('Join by labels', () => { - it('Simple join', () => { - const input = [ - toDataFrame({ - fields: [ - { name: 'Time', type: FieldType.time, values: [1, 2] }, - { - name: 'Value', - type: FieldType.number, - config: { - displayNameFromDS: '111', - }, - values: [10, 200], - labels: { what: 'Temp', cluster: 'A', job: 'J1' }, + const input = [ + toDataFrame({ + refId: 'A', + fields: [ + { name: 'Time', type: FieldType.time, values: [1, 2] }, + { + name: 'Value', + type: FieldType.number, + config: { + displayNameFromDS: '111', }, - ], - }), - toDataFrame({ - fields: [ - { name: 'Time', type: FieldType.time, values: [1, 2] }, - { - name: 'Value', - type: FieldType.number, - config: { - displayNameFromDS: '222', - }, - values: [10, 200], - labels: { what: 'Temp', cluster: 'B', job: 'J1' }, + values: [10, 200], + labels: { what: 'Temp', cluster: 'A', job: 'J1' }, + }, + ], + }), + toDataFrame({ + refId: 'B', + fields: [ + { name: 'Time', type: FieldType.time, values: [1, 2] }, + { + name: 'Value', + type: FieldType.number, + config: { + displayNameFromDS: '222', }, - ], - }), - toDataFrame({ - fields: [ - { name: 'Time', type: FieldType.time, values: [22, 28] }, - { - name: 'Value', - type: FieldType.number, - config: { - displayNameFromDS: '333', - }, - values: [22, 77], - labels: { what: 'Speed', cluster: 'B', job: 'J1' }, + values: [10, 200], + labels: { what: 'Temp', cluster: 'B', job: 'J1' }, + }, + ], + }), + toDataFrame({ + refId: 'C', + fields: [ + { name: 'Time', type: FieldType.time, values: [22, 28] }, + { + name: 'Value', + type: FieldType.number, + config: { + displayNameFromDS: '333', }, - ], - }), - ]; + values: [22, 77], + labels: { what: 'Speed', cluster: 'B', job: 'J1' }, + }, + ], + }), + ]; + it('Simple join with dynamic refId', () => { const result = joinByLabels( { value: 'what', }, input ); + expect(result.refId).toBe('joinByLabels-A-B-C'); expect(result.fields[result.fields.length - 1].config).toMatchInlineSnapshot(`{}`); expect(toRowsSnapshow(result)).toMatchInlineSnapshot(` { @@ -94,6 +98,17 @@ describe('Join by labels', () => { `); }); + it('Simple join with static refId', () => { + const result = joinByLabels( + { + value: 'what', + refId: 'test', + }, + input + ); + expect(result.refId).toBe('test'); + }); + it('Error handling (no labels)', () => { const input = [ toDataFrame({