2021-01-29 18:33:23 +01:00
|
|
|
import { DataQuery, toDataFrameDTO, DataFrame } from '@grafana/data';
|
2020-05-04 11:05:04 -07:00
|
|
|
import { toDataQueryResponse } from './queryResponse';
|
|
|
|
|
|
|
|
|
|
const resp = {
|
|
|
|
|
data: {
|
|
|
|
|
results: {
|
2021-01-29 18:33:23 +01:00
|
|
|
A: {
|
|
|
|
|
refId: 'A',
|
2020-05-04 11:05:04 -07:00
|
|
|
dataframes: [
|
2021-01-29 18:33:23 +01:00
|
|
|
'QVJST1cxAAD/////cAEAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEDAAoADAAAAAgABAAKAAAACAAAAFAAAAACAAAAKAAAAAQAAAAg////CAAAAAwAAAABAAAAQQAAAAUAAAByZWZJZAAAAED///8IAAAADAAAAAAAAAAAAAAABAAAAG5hbWUAAAAAAgAAAHwAAAAEAAAAnv///xQAAABAAAAAQAAAAAAAAwFAAAAAAQAAAAQAAACM////CAAAABQAAAAIAAAAQS1zZXJpZXMAAAAABAAAAG5hbWUAAAAAAAAAAIb///8AAAIACAAAAEEtc2VyaWVzAAASABgAFAATABIADAAAAAgABAASAAAAFAAAAEQAAABMAAAAAAAKAUwAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAQAAAABAAAAHRpbWUAAAAABAAAAG5hbWUAAAAAAAAAAAAABgAIAAYABgAAAAAAAwAEAAAAdGltZQAAAAAAAAAA/////7gAAAAUAAAAAAAAAAwAFgAUABMADAAEAAwAAABgAAAAAAAAABQAAAAAAAADAwAKABgADAAIAAQACgAAABQAAABYAAAABgAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAAAAAAAgAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAQMC/OcElXhZAOAEFxCVeFkCwQtDGJV4WQCiEm8klXhZAoMVmzCVeFkAYBzLPJV4WAAAAAAAA8D8AAAAAAAA0QAAAAAAAgFZAAAAAAAAAPkAAAAAAAAAUQAAAAAAAAAAAEAAAAAwAFAASAAwACAAEAAwAAAAQAAAALAAAADgAAAAAAAMAAQAAAIABAAAAAAAAwAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAKAAwAAAAIAAQACgAAAAgAAABQAAAAAgAAACgAAAAEAAAAIP///wgAAAAMAAAAAQAAAEEAAAAFAAAAcmVmSWQAAABA////CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAAAIAAAB8AAAABAAAAJ7///8UAAAAQAAAAEAAAAAAAAMBQAAAAAEAAAAEAAAAjP///wgAAAAUAAAACAAAAEEtc2VyaWVzAAAAAAQAAABuYW1lAAAAAAAAAACG////AAACAAgAAABBLXNlcmllcwAAEgAYABQAEwASAAwAAAAIAAQAEgAAABQAAABEAAAATAAAAAAACgFMAAAAAQAAAAwAAAAIAAwACAAEAAgAAAAIAAAAEAAAAAQAAAB0aW1lAAAAAAQAAABuYW1lAAAAAAAAAAAAAAYACAAGAAYAAAAAAAMABAAAAHRpbWUAAAAAmAEAAEFSUk9XMQ==',
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
B: {
|
|
|
|
|
refId: 'B',
|
|
|
|
|
dataframes: [
|
|
|
|
|
'QVJST1cxAAD/////cAEAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEDAAoADAAAAAgABAAKAAAACAAAAFAAAAACAAAAKAAAAAQAAAAg////CAAAAAwAAAABAAAAQgAAAAUAAAByZWZJZAAAAED///8IAAAADAAAAAAAAAAAAAAABAAAAG5hbWUAAAAAAgAAAHwAAAAEAAAAnv///xQAAABAAAAAQAAAAAAAAwFAAAAAAQAAAAQAAACM////CAAAABQAAAAIAAAAQi1zZXJpZXMAAAAABAAAAG5hbWUAAAAAAAAAAIb///8AAAIACAAAAEItc2VyaWVzAAASABgAFAATABIADAAAAAgABAASAAAAFAAAAEQAAABMAAAAAAAKAUwAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAQAAAABAAAAHRpbWUAAAAABAAAAG5hbWUAAAAAAAAAAAAABgAIAAYABgAAAAAAAwAEAAAAdGltZQAAAAAAAAAA/////7gAAAAUAAAAAAAAAAwAFgAUABMADAAEAAwAAABgAAAAAAAAABQAAAAAAAADAwAKABgADAAIAAQACgAAABQAAABYAAAABgAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAAAAAAAgAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAQMC/OcElXhZAOAEFxCVeFkCwQtDGJV4WQCiEm8klXhZAoMVmzCVeFkAYBzLPJV4WAAAAAAAA8D8AAAAAAAA0QAAAAAAAgFZAAAAAAAAAPkAAAAAAAAAUQAAAAAAAAAAAEAAAAAwAFAASAAwACAAEAAwAAAAQAAAALAAAADgAAAAAAAMAAQAAAIABAAAAAAAAwAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAKAAwAAAAIAAQACgAAAAgAAABQAAAAAgAAACgAAAAEAAAAIP///wgAAAAMAAAAAQAAAEIAAAAFAAAAcmVmSWQAAABA////CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAAAIAAAB8AAAABAAAAJ7///8UAAAAQAAAAEAAAAAAAAMBQAAAAAEAAAAEAAAAjP///wgAAAAUAAAACAAAAEItc2VyaWVzAAAAAAQAAABuYW1lAAAAAAAAAACG////AAACAAgAAABCLXNlcmllcwAAEgAYABQAEwASAAwAAAAIAAQAEgAAABQAAABEAAAATAAAAAAACgFMAAAAAQAAAAwAAAAIAAwACAAEAAgAAAAIAAAAEAAAAAQAAAB0aW1lAAAAAAQAAABuYW1lAAAAAAAAAAAAAAYACAAGAAYAAAAAAAMABAAAAHRpbWUAAAAAmAEAAEFSUk9XMQ==',
|
2020-05-04 11:05:04 -07:00
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const resWithError = {
|
|
|
|
|
data: {
|
|
|
|
|
results: {
|
|
|
|
|
A: {
|
|
|
|
|
error: 'Hello Error',
|
|
|
|
|
dataframes: [
|
|
|
|
|
'QVJST1cxAAD/////WAEAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEDAAoADAAAAAgABAAKAAAACAAAAJwAAAADAAAATAAAACgAAAAEAAAAPP///wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAABc////CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAAHz///8IAAAANAAAACoAAAB7Im5vdGljZXMiOlt7InNldmVyaXR5IjoyLCJ0ZXh0IjoiVGV4dCJ9XX0AAAQAAABtZXRhAAAAAAEAAAAYAAAAAAASABgAFAAAABMADAAAAAgABAASAAAAFAAAAEQAAABMAAAAAAAAA0wAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAQAAAABwAAAG51bWJlcnMABAAAAG5hbWUAAAAAAAAAAAAABgAIAAYABgAAAAAAAgAHAAAAbnVtYmVycwAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAUABMADAAEAAwAAAAQAAAAAAAAABQAAAAAAAADAwAKABgADAAIAAQACgAAABQAAAA4AAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAA8D8AAAAAAAAIQBAAAAAMABQAEgAMAAgABAAMAAAAEAAAACwAAAA4AAAAAAADAAEAAABoAQAAAAAAAJAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAACgAMAAAACAAEAAoAAAAIAAAAnAAAAAMAAABMAAAAKAAAAAQAAAA8////CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAAFz///8IAAAADAAAAAAAAAAAAAAABAAAAG5hbWUAAAAAfP///wgAAAA0AAAAKgAAAHsibm90aWNlcyI6W3sic2V2ZXJpdHkiOjIsInRleHQiOiJUZXh0In1dfQAABAAAAG1ldGEAAAAAAQAAABgAAAAAABIAGAAUAAAAEwAMAAAACAAEABIAAAAUAAAARAAAAEwAAAAAAAADTAAAAAEAAAAMAAAACAAMAAgABAAIAAAACAAAABAAAAAHAAAAbnVtYmVycwAEAAAAbmFtZQAAAAAAAAAAAAAGAAgABgAGAAAAAAACAAcAAABudW1iZXJzAIABAABBUlJPVzE=',
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const emptyResults = {
|
2021-03-22 19:09:15 +01:00
|
|
|
data: { results: { '': { refId: '' } } },
|
2020-05-04 11:05:04 -07:00
|
|
|
};
|
|
|
|
|
|
2020-12-02 11:02:01 -08:00
|
|
|
describe('Query Response parser', () => {
|
2020-05-04 11:05:04 -07:00
|
|
|
test('should parse output with dataframe', () => {
|
|
|
|
|
const res = toDataQueryResponse(resp);
|
|
|
|
|
const frames = res.data;
|
2021-01-29 18:33:23 +01:00
|
|
|
expect(frames).toHaveLength(2);
|
|
|
|
|
expect(frames[0].refId).toEqual('A');
|
|
|
|
|
expect(frames[1].refId).toEqual('B');
|
2020-05-04 11:05:04 -07:00
|
|
|
|
2021-01-20 07:59:48 +01:00
|
|
|
const norm = frames.map((f) => toDataFrameDTO(f));
|
2020-05-04 11:05:04 -07:00
|
|
|
expect(norm).toMatchInlineSnapshot(`
|
|
|
|
|
Array [
|
|
|
|
|
Object {
|
|
|
|
|
"fields": Array [
|
|
|
|
|
Object {
|
|
|
|
|
"config": Object {},
|
|
|
|
|
"labels": undefined,
|
2021-01-29 18:33:23 +01:00
|
|
|
"name": "time",
|
2020-05-04 11:05:04 -07:00
|
|
|
"type": "time",
|
|
|
|
|
"values": Array [
|
2021-01-29 18:33:23 +01:00
|
|
|
1611767228473,
|
|
|
|
|
1611767240473,
|
|
|
|
|
1611767252473,
|
|
|
|
|
1611767264473,
|
|
|
|
|
1611767276473,
|
|
|
|
|
1611767288473,
|
2020-05-04 11:05:04 -07:00
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
Object {
|
|
|
|
|
"config": Object {},
|
|
|
|
|
"labels": undefined,
|
2021-01-29 18:33:23 +01:00
|
|
|
"name": "A-series",
|
2020-05-04 11:05:04 -07:00
|
|
|
"type": "number",
|
|
|
|
|
"values": Array [
|
2021-01-29 18:33:23 +01:00
|
|
|
1,
|
|
|
|
|
20,
|
|
|
|
|
90,
|
|
|
|
|
30,
|
2020-05-04 11:05:04 -07:00
|
|
|
5,
|
2021-01-29 18:33:23 +01:00
|
|
|
0,
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
"meta": undefined,
|
|
|
|
|
"name": undefined,
|
|
|
|
|
"refId": "A",
|
|
|
|
|
},
|
|
|
|
|
Object {
|
|
|
|
|
"fields": Array [
|
|
|
|
|
Object {
|
|
|
|
|
"config": Object {},
|
|
|
|
|
"labels": undefined,
|
|
|
|
|
"name": "time",
|
|
|
|
|
"type": "time",
|
|
|
|
|
"values": Array [
|
|
|
|
|
1611767228473,
|
|
|
|
|
1611767240473,
|
|
|
|
|
1611767252473,
|
|
|
|
|
1611767264473,
|
|
|
|
|
1611767276473,
|
|
|
|
|
1611767288473,
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
Object {
|
|
|
|
|
"config": Object {},
|
|
|
|
|
"labels": undefined,
|
|
|
|
|
"name": "B-series",
|
|
|
|
|
"type": "number",
|
|
|
|
|
"values": Array [
|
|
|
|
|
1,
|
|
|
|
|
20,
|
|
|
|
|
90,
|
|
|
|
|
30,
|
2020-05-04 11:05:04 -07:00
|
|
|
5,
|
2021-01-29 18:33:23 +01:00
|
|
|
0,
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
"meta": undefined,
|
|
|
|
|
"name": undefined,
|
|
|
|
|
"refId": "B",
|
|
|
|
|
},
|
|
|
|
|
]
|
|
|
|
|
`);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('should parse output with dataframe in order of queries', () => {
|
|
|
|
|
const queries: DataQuery[] = [{ refId: 'B' }, { refId: 'A' }];
|
|
|
|
|
const res = toDataQueryResponse(resp, queries);
|
|
|
|
|
const frames = res.data;
|
|
|
|
|
expect(frames).toHaveLength(2);
|
|
|
|
|
expect(frames[0].refId).toEqual('B');
|
|
|
|
|
expect(frames[1].refId).toEqual('A');
|
|
|
|
|
|
|
|
|
|
const norm = frames.map((f) => toDataFrameDTO(f));
|
|
|
|
|
expect(norm).toMatchInlineSnapshot(`
|
|
|
|
|
Array [
|
|
|
|
|
Object {
|
|
|
|
|
"fields": Array [
|
|
|
|
|
Object {
|
|
|
|
|
"config": Object {},
|
|
|
|
|
"labels": undefined,
|
|
|
|
|
"name": "time",
|
|
|
|
|
"type": "time",
|
|
|
|
|
"values": Array [
|
|
|
|
|
1611767228473,
|
|
|
|
|
1611767240473,
|
|
|
|
|
1611767252473,
|
|
|
|
|
1611767264473,
|
|
|
|
|
1611767276473,
|
|
|
|
|
1611767288473,
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
Object {
|
|
|
|
|
"config": Object {},
|
|
|
|
|
"labels": undefined,
|
|
|
|
|
"name": "B-series",
|
|
|
|
|
"type": "number",
|
|
|
|
|
"values": Array [
|
|
|
|
|
1,
|
|
|
|
|
20,
|
|
|
|
|
90,
|
|
|
|
|
30,
|
2020-05-04 11:05:04 -07:00
|
|
|
5,
|
2021-01-29 18:33:23 +01:00
|
|
|
0,
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
"meta": undefined,
|
|
|
|
|
"name": undefined,
|
|
|
|
|
"refId": "B",
|
|
|
|
|
},
|
|
|
|
|
Object {
|
|
|
|
|
"fields": Array [
|
|
|
|
|
Object {
|
|
|
|
|
"config": Object {},
|
|
|
|
|
"labels": undefined,
|
|
|
|
|
"name": "time",
|
|
|
|
|
"type": "time",
|
|
|
|
|
"values": Array [
|
|
|
|
|
1611767228473,
|
|
|
|
|
1611767240473,
|
|
|
|
|
1611767252473,
|
|
|
|
|
1611767264473,
|
|
|
|
|
1611767276473,
|
|
|
|
|
1611767288473,
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
Object {
|
|
|
|
|
"config": Object {},
|
|
|
|
|
"labels": undefined,
|
|
|
|
|
"name": "A-series",
|
|
|
|
|
"type": "number",
|
|
|
|
|
"values": Array [
|
|
|
|
|
1,
|
|
|
|
|
20,
|
|
|
|
|
90,
|
|
|
|
|
30,
|
2020-05-04 11:05:04 -07:00
|
|
|
5,
|
2021-01-29 18:33:23 +01:00
|
|
|
0,
|
2020-05-04 11:05:04 -07:00
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
"meta": undefined,
|
|
|
|
|
"name": undefined,
|
2021-01-29 18:33:23 +01:00
|
|
|
"refId": "A",
|
2020-05-04 11:05:04 -07:00
|
|
|
},
|
|
|
|
|
]
|
|
|
|
|
`);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('processEmptyResults', () => {
|
|
|
|
|
const frames = toDataQueryResponse(emptyResults).data;
|
|
|
|
|
expect(frames.length).toEqual(0);
|
|
|
|
|
});
|
|
|
|
|
|
2021-01-29 18:33:23 +01:00
|
|
|
test('keeps query order', () => {
|
|
|
|
|
const resp = {
|
|
|
|
|
data: {
|
|
|
|
|
results: {
|
|
|
|
|
X: {
|
2021-03-22 19:09:15 +01:00
|
|
|
series: [{ name: 'Requests/s', points: [[13.594958983547151, 1611839862951]] }] as any,
|
2021-01-29 18:33:23 +01:00
|
|
|
},
|
|
|
|
|
B: {
|
2021-03-22 19:09:15 +01:00
|
|
|
series: [{ name: 'Requests/s', points: [[13.594958983547151, 1611839862951]] }] as any,
|
2021-01-29 18:33:23 +01:00
|
|
|
},
|
|
|
|
|
A: {
|
2021-03-22 19:09:15 +01:00
|
|
|
series: [{ name: 'Requests/s', points: [[13.594958983547151, 1611839862951]] }] as any,
|
2021-01-29 18:33:23 +01:00
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const queries: DataQuery[] = [{ refId: 'A' }, { refId: 'B' }];
|
|
|
|
|
|
|
|
|
|
const ids = (toDataQueryResponse(resp, queries).data as DataFrame[]).map((f) => f.refId);
|
2021-03-31 08:35:03 -07:00
|
|
|
expect(ids).toEqual(['A', 'B']);
|
2021-01-29 18:33:23 +01:00
|
|
|
});
|
|
|
|
|
|
2020-05-04 11:05:04 -07:00
|
|
|
test('resultWithError', () => {
|
|
|
|
|
// Generated from:
|
|
|
|
|
// qdr.Responses[q.GetRefID()] = backend.DataResponse{
|
|
|
|
|
// Error: fmt.Errorf("an Error: %w", fmt.Errorf("another error")),
|
|
|
|
|
// Frames: data.Frames{
|
|
|
|
|
// {
|
|
|
|
|
// Fields: data.Fields{data.NewField("numbers", nil, []float64{1, 3})},
|
|
|
|
|
// Meta: &data.FrameMeta{
|
|
|
|
|
// Notices: []data.Notice{
|
|
|
|
|
// {
|
|
|
|
|
// Severity: data.NoticeSeverityError,
|
|
|
|
|
// Text: "Text",
|
|
|
|
|
// },
|
|
|
|
|
// },
|
|
|
|
|
// },
|
|
|
|
|
// },
|
|
|
|
|
// },
|
|
|
|
|
// }
|
|
|
|
|
const res = toDataQueryResponse(resWithError);
|
|
|
|
|
expect(res.error).toMatchInlineSnapshot(`
|
|
|
|
|
Object {
|
|
|
|
|
"message": "Hello Error",
|
|
|
|
|
"refId": "A",
|
|
|
|
|
}
|
|
|
|
|
`);
|
|
|
|
|
|
2021-01-20 07:59:48 +01:00
|
|
|
const norm = res.data.map((f) => toDataFrameDTO(f));
|
2020-05-04 11:05:04 -07:00
|
|
|
expect(norm).toMatchInlineSnapshot(`
|
|
|
|
|
Array [
|
|
|
|
|
Object {
|
|
|
|
|
"fields": Array [
|
|
|
|
|
Object {
|
|
|
|
|
"config": Object {},
|
|
|
|
|
"labels": undefined,
|
|
|
|
|
"name": "numbers",
|
|
|
|
|
"type": "number",
|
|
|
|
|
"values": Array [
|
|
|
|
|
1,
|
|
|
|
|
3,
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
"meta": Object {
|
|
|
|
|
"notices": Array [
|
|
|
|
|
Object {
|
|
|
|
|
"severity": 2,
|
|
|
|
|
"text": "Text",
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
"name": undefined,
|
|
|
|
|
"refId": "A",
|
|
|
|
|
},
|
|
|
|
|
]
|
|
|
|
|
`);
|
|
|
|
|
});
|
|
|
|
|
});
|