transformers.jest.ts 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. import {transformers, transformDataToTable} from '../transformers';
  2. describe('when transforming time series table', () => {
  3. var table;
  4. describe('given 2 time series', () => {
  5. var time = new Date().getTime();
  6. var timeSeries = [
  7. {
  8. target: 'series1',
  9. datapoints: [[12.12, time], [14.44, time+1]],
  10. },
  11. {
  12. target: 'series2',
  13. datapoints: [[16.12, time]],
  14. }
  15. ];
  16. describe('timeseries_to_rows', () => {
  17. var panel = {
  18. transform: 'timeseries_to_rows',
  19. sort: {col: 0, desc: true},
  20. };
  21. beforeEach(() => {
  22. table = transformDataToTable(timeSeries, panel);
  23. });
  24. it('should return 3 rows', () => {
  25. expect(table.rows.length).toBe(3);
  26. expect(table.rows[0][1]).toBe('series1');
  27. expect(table.rows[1][1]).toBe('series1');
  28. expect(table.rows[2][1]).toBe('series2');
  29. expect(table.rows[0][2]).toBe(12.12);
  30. });
  31. it('should return 3 rows', () => {
  32. expect(table.columns.length).toBe(3);
  33. expect(table.columns[0].text).toBe('Time');
  34. expect(table.columns[1].text).toBe('Metric');
  35. expect(table.columns[2].text).toBe('Value');
  36. });
  37. });
  38. describe('timeseries_to_columns', () => {
  39. var panel = {
  40. transform: 'timeseries_to_columns'
  41. };
  42. beforeEach(() => {
  43. table = transformDataToTable(timeSeries, panel);
  44. });
  45. it ('should return 3 columns', () => {
  46. expect(table.columns.length).toBe(3);
  47. expect(table.columns[0].text).toBe('Time');
  48. expect(table.columns[1].text).toBe('series1');
  49. expect(table.columns[2].text).toBe('series2');
  50. });
  51. it ('should return 2 rows', () => {
  52. expect(table.rows.length).toBe(2);
  53. expect(table.rows[0][1]).toBe(12.12);
  54. expect(table.rows[0][2]).toBe(16.12);
  55. });
  56. it ('should be undefined when no value for timestamp', () => {
  57. expect(table.rows[1][2]).toBe(undefined);
  58. });
  59. });
  60. describe('timeseries_aggregations', () => {
  61. var panel = {
  62. transform: 'timeseries_aggregations',
  63. sort: {col: 0, desc: true},
  64. columns: [{text: 'Max', value: 'max'}, {text: 'Min', value: 'min'}]
  65. };
  66. beforeEach(() => {
  67. table = transformDataToTable(timeSeries, panel);
  68. });
  69. it('should return 2 rows', () => {
  70. expect(table.rows.length).toBe(2);
  71. expect(table.rows[0][0]).toBe('series1');
  72. expect(table.rows[0][1]).toBe(14.44);
  73. expect(table.rows[0][2]).toBe(12.12);
  74. });
  75. it('should return 2 columns', () => {
  76. expect(table.columns.length).toBe(3);
  77. expect(table.columns[0].text).toBe('Metric');
  78. expect(table.columns[1].text).toBe('Max');
  79. expect(table.columns[2].text).toBe('Min');
  80. });
  81. });
  82. });
  83. describe('table data sets', () => {
  84. describe('Table', () => {
  85. const transform = 'table';
  86. var panel = {
  87. transform,
  88. };
  89. var time = new Date().getTime();
  90. var nonTableData = [
  91. {
  92. type: 'foo',
  93. columns: [
  94. { text: 'Time' },
  95. { text: 'Label Key 1' },
  96. { text: 'Value' },
  97. ],
  98. rows: [
  99. [time, 'Label Value 1', 42],
  100. ],
  101. }
  102. ];
  103. var singleQueryData = [
  104. {
  105. type: 'table',
  106. columns: [
  107. { text: 'Time' },
  108. { text: 'Label Key 1' },
  109. { text: 'Value' },
  110. ],
  111. rows: [
  112. [time, 'Label Value 1', 42],
  113. ],
  114. }
  115. ];
  116. var multipleQueriesDataSameLabels = [
  117. {
  118. type: 'table',
  119. columns: [
  120. { text: 'Time' },
  121. { text: 'Label Key 1' },
  122. { text: 'Label Key 2' },
  123. { text: 'Value #A' },
  124. ],
  125. rows: [
  126. [time, 'Label Value 1', 'Label Value 2', 42],
  127. ],
  128. },
  129. {
  130. type: 'table',
  131. columns: [
  132. { text: 'Time' },
  133. { text: 'Label Key 1' },
  134. { text: 'Label Key 2' },
  135. { text: 'Value #B' },
  136. ],
  137. rows: [
  138. [time, 'Label Value 1', 'Label Value 2', 13],
  139. ],
  140. },
  141. {
  142. type: 'table',
  143. columns: [
  144. { text: 'Time' },
  145. { text: 'Label Key 1' },
  146. { text: 'Label Key 2' },
  147. { text: 'Value #C' },
  148. ],
  149. rows: [
  150. [time, 'Label Value 1', 'Label Value 2', 4],
  151. ],
  152. },
  153. {
  154. type: 'table',
  155. columns: [
  156. { text: 'Time' },
  157. { text: 'Label Key 1' },
  158. { text: 'Label Key 2' },
  159. { text: 'Value #C' },
  160. ],
  161. rows: [
  162. [time, 'Label Value 1', 'Label Value 2', 7],
  163. ],
  164. }
  165. ];
  166. var multipleQueriesDataDifferentLabels = [
  167. {
  168. type: 'table',
  169. columns: [
  170. { text: 'Time' },
  171. { text: 'Label Key 1' },
  172. { text: 'Value #A' },
  173. ],
  174. rows: [
  175. [time, 'Label Value 1', 42],
  176. ],
  177. },
  178. {
  179. type: 'table',
  180. columns: [
  181. { text: 'Time' },
  182. { text: 'Label Key 2' },
  183. { text: 'Value #B' },
  184. ],
  185. rows: [
  186. [time, 'Label Value 2', 13],
  187. ],
  188. },
  189. {
  190. type: 'table',
  191. columns: [
  192. { text: 'Time' },
  193. { text: 'Label Key 1' },
  194. { text: 'Value #C' },
  195. ],
  196. rows: [
  197. [time, 'Label Value 3', 7],
  198. ],
  199. }
  200. ];
  201. describe('getColumns', function() {
  202. it('should return data columns given a single query', function() {
  203. var columns = transformers[transform].getColumns(singleQueryData);
  204. expect(columns[0].text).toBe('Time');
  205. expect(columns[1].text).toBe('Label Key 1');
  206. expect(columns[2].text).toBe('Value');
  207. });
  208. it('should return the union of data columns given a multiple queries', function() {
  209. var columns = transformers[transform].getColumns(multipleQueriesDataSameLabels);
  210. expect(columns[0].text).toBe('Time');
  211. expect(columns[1].text).toBe('Label Key 1');
  212. expect(columns[2].text).toBe('Label Key 2');
  213. expect(columns[3].text).toBe('Value #A');
  214. expect(columns[4].text).toBe('Value #B');
  215. });
  216. it('should return the union of data columns given a multiple queries with different labels', function() {
  217. var columns = transformers[transform].getColumns(multipleQueriesDataDifferentLabels);
  218. expect(columns[0].text).toBe('Time');
  219. expect(columns[1].text).toBe('Label Key 1');
  220. expect(columns[2].text).toBe('Value #A');
  221. expect(columns[3].text).toBe('Label Key 2');
  222. expect(columns[4].text).toBe('Value #B');
  223. expect(columns[5].text).toBe('Value #C');
  224. });
  225. });
  226. describe('transform', function() {
  227. it ('should throw an error with non-table data', () => {
  228. expect(() => transformDataToTable(nonTableData, panel)).toThrow();
  229. });
  230. it ('should return 3 columns for single queries', () => {
  231. table = transformDataToTable(singleQueryData, panel);
  232. expect(table.columns.length).toBe(3);
  233. expect(table.columns[0].text).toBe('Time');
  234. expect(table.columns[1].text).toBe('Label Key 1');
  235. expect(table.columns[2].text).toBe('Value');
  236. });
  237. it ('should return the union of columns for multiple queries', () => {
  238. table = transformDataToTable(multipleQueriesDataSameLabels, panel);
  239. expect(table.columns.length).toBe(6);
  240. expect(table.columns[0].text).toBe('Time');
  241. expect(table.columns[1].text).toBe('Label Key 1');
  242. expect(table.columns[2].text).toBe('Label Key 2');
  243. expect(table.columns[3].text).toBe('Value #A');
  244. expect(table.columns[4].text).toBe('Value #B');
  245. expect(table.columns[5].text).toBe('Value #C');
  246. });
  247. it ('should return 1 row for a single query', () => {
  248. table = transformDataToTable(singleQueryData, panel);
  249. expect(table.rows.length).toBe(1);
  250. expect(table.rows[0][0]).toBe(time);
  251. expect(table.rows[0][1]).toBe('Label Value 1');
  252. expect(table.rows[0][2]).toBe(42);
  253. });
  254. it ('should return 2 rows for a mulitple queries with same label values plus one extra row', () => {
  255. table = transformDataToTable(multipleQueriesDataSameLabels, panel);
  256. expect(table.rows.length).toBe(2);
  257. expect(table.rows[0][0]).toBe(time);
  258. expect(table.rows[0][1]).toBe('Label Value 1');
  259. expect(table.rows[0][2]).toBe('Label Value 2');
  260. expect(table.rows[0][3]).toBe(42);
  261. expect(table.rows[0][4]).toBe(13);
  262. expect(table.rows[0][5]).toBe(4);
  263. expect(table.rows[1][0]).toBe(time);
  264. expect(table.rows[1][1]).toBe('Label Value 1');
  265. expect(table.rows[1][2]).toBe('Label Value 2');
  266. expect(table.rows[1][3]).toBeUndefined();
  267. expect(table.rows[1][4]).toBeUndefined();
  268. expect(table.rows[1][5]).toBe(7);
  269. });
  270. it ('should return 2 rows for mulitple queries with different label values', () => {
  271. table = transformDataToTable(multipleQueriesDataDifferentLabels, panel);
  272. expect(table.rows.length).toBe(2);
  273. expect(table.columns.length).toBe(6);
  274. expect(table.rows[0][0]).toBe(time);
  275. expect(table.rows[0][1]).toBe('Label Value 1');
  276. expect(table.rows[0][2]).toBe(42);
  277. expect(table.rows[0][3]).toBe('Label Value 2');
  278. expect(table.rows[0][4]).toBe(13);
  279. expect(table.rows[0][5]).toBeUndefined();
  280. expect(table.rows[1][0]).toBe(time);
  281. expect(table.rows[1][1]).toBe('Label Value 3');
  282. expect(table.rows[1][2]).toBeUndefined();
  283. expect(table.rows[1][3]).toBeUndefined();
  284. expect(table.rows[1][4]).toBeUndefined();
  285. expect(table.rows[1][5]).toBe(7);
  286. });
  287. });
  288. });
  289. });
  290. describe('doc data sets', () => {
  291. describe('JSON Data', () => {
  292. var panel = {
  293. transform: 'json',
  294. columns: [
  295. {text: 'Timestamp', value: 'timestamp'},
  296. {text: 'Message', value: 'message'},
  297. {text: 'nested.level2', value: 'nested.level2'},
  298. ]
  299. };
  300. var rawData = [
  301. {
  302. type: 'docs',
  303. datapoints: [
  304. {
  305. timestamp: 'time',
  306. message: 'message',
  307. nested: {
  308. level2: 'level2-value'
  309. }
  310. }
  311. ]
  312. }
  313. ];
  314. describe('getColumns', function() {
  315. it('should return nested properties', function() {
  316. var columns = transformers['json'].getColumns(rawData);
  317. expect(columns[0].text).toBe('timestamp');
  318. expect(columns[1].text).toBe('message');
  319. expect(columns[2].text).toBe('nested.level2');
  320. });
  321. });
  322. describe('transform', function() {
  323. beforeEach(() => {
  324. table = transformDataToTable(rawData, panel);
  325. });
  326. it ('should return 2 columns', () => {
  327. expect(table.columns.length).toBe(3);
  328. expect(table.columns[0].text).toBe('Timestamp');
  329. expect(table.columns[1].text).toBe('Message');
  330. expect(table.columns[2].text).toBe('nested.level2');
  331. });
  332. it ('should return 2 rows', () => {
  333. expect(table.rows.length).toBe(1);
  334. expect(table.rows[0][0]).toBe('time');
  335. expect(table.rows[0][1]).toBe('message');
  336. expect(table.rows[0][2]).toBe('level2-value');
  337. });
  338. });
  339. });
  340. });
  341. describe('annotation data', () => {
  342. describe('Annnotations', () => {
  343. var panel = {transform: 'annotations'};
  344. var rawData = {
  345. annotations: [
  346. {
  347. time: 1000,
  348. text: 'hej',
  349. tags: ['tags', 'asd'],
  350. title: 'title',
  351. }
  352. ]
  353. };
  354. beforeEach(() => {
  355. table = transformDataToTable(rawData, panel);
  356. });
  357. it ('should return 4 columns', () => {
  358. expect(table.columns.length).toBe(4);
  359. expect(table.columns[0].text).toBe('Time');
  360. expect(table.columns[1].text).toBe('Title');
  361. expect(table.columns[2].text).toBe('Text');
  362. expect(table.columns[3].text).toBe('Tags');
  363. });
  364. it ('should return 1 rows', () => {
  365. expect(table.rows.length).toBe(1);
  366. expect(table.rows[0][0]).toBe(1000);
  367. });
  368. });
  369. });
  370. });