transformers.jest.ts 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  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: [{ text: 'Time' }, { text: 'Label Key 1' }, { text: 'Value' }],
  94. rows: [[time, 'Label Value 1', 42]],
  95. },
  96. ];
  97. var singleQueryData = [
  98. {
  99. type: 'table',
  100. columns: [{ text: 'Time' }, { text: 'Label Key 1' }, { text: 'Value' }],
  101. rows: [[time, 'Label Value 1', 42]],
  102. },
  103. ];
  104. var multipleQueriesDataSameLabels = [
  105. {
  106. type: 'table',
  107. columns: [{ text: 'Time' }, { text: 'Label Key 1' }, { text: 'Label Key 2' }, { text: 'Value #A' }],
  108. rows: [[time, 'Label Value 1', 'Label Value 2', 42]],
  109. },
  110. {
  111. type: 'table',
  112. columns: [{ text: 'Time' }, { text: 'Label Key 1' }, { text: 'Label Key 2' }, { text: 'Value #B' }],
  113. rows: [[time, 'Label Value 1', 'Label Value 2', 13]],
  114. },
  115. {
  116. type: 'table',
  117. columns: [{ text: 'Time' }, { text: 'Label Key 1' }, { text: 'Label Key 2' }, { text: 'Value #C' }],
  118. rows: [[time, 'Label Value 1', 'Label Value 2', 4]],
  119. },
  120. {
  121. type: 'table',
  122. columns: [{ text: 'Time' }, { text: 'Label Key 1' }, { text: 'Label Key 2' }, { text: 'Value #C' }],
  123. rows: [[time, 'Label Value 1', 'Label Value 2', 7]],
  124. },
  125. ];
  126. var multipleQueriesDataDifferentLabels = [
  127. {
  128. type: 'table',
  129. columns: [{ text: 'Time' }, { text: 'Label Key 1' }, { text: 'Value #A' }],
  130. rows: [[time, 'Label Value 1', 42]],
  131. },
  132. {
  133. type: 'table',
  134. columns: [{ text: 'Time' }, { text: 'Label Key 2' }, { text: 'Value #B' }],
  135. rows: [[time, 'Label Value 2', 13]],
  136. },
  137. {
  138. type: 'table',
  139. columns: [{ text: 'Time' }, { text: 'Label Key 1' }, { text: 'Value #C' }],
  140. rows: [[time, 'Label Value 3', 7]],
  141. },
  142. ];
  143. describe('getColumns', function() {
  144. it('should return data columns given a single query', function() {
  145. var columns = transformers[transform].getColumns(singleQueryData);
  146. expect(columns[0].text).toBe('Time');
  147. expect(columns[1].text).toBe('Label Key 1');
  148. expect(columns[2].text).toBe('Value');
  149. });
  150. it('should return the union of data columns given a multiple queries', function() {
  151. var columns = transformers[transform].getColumns(multipleQueriesDataSameLabels);
  152. expect(columns[0].text).toBe('Time');
  153. expect(columns[1].text).toBe('Label Key 1');
  154. expect(columns[2].text).toBe('Label Key 2');
  155. expect(columns[3].text).toBe('Value #A');
  156. expect(columns[4].text).toBe('Value #B');
  157. });
  158. it('should return the union of data columns given a multiple queries with different labels', function() {
  159. var columns = transformers[transform].getColumns(multipleQueriesDataDifferentLabels);
  160. expect(columns[0].text).toBe('Time');
  161. expect(columns[1].text).toBe('Label Key 1');
  162. expect(columns[2].text).toBe('Value #A');
  163. expect(columns[3].text).toBe('Label Key 2');
  164. expect(columns[4].text).toBe('Value #B');
  165. expect(columns[5].text).toBe('Value #C');
  166. });
  167. });
  168. describe('transform', function() {
  169. it('should throw an error with non-table data', () => {
  170. expect(() => transformDataToTable(nonTableData, panel)).toThrow();
  171. });
  172. it('should return 3 columns for single queries', () => {
  173. table = transformDataToTable(singleQueryData, panel);
  174. expect(table.columns.length).toBe(3);
  175. expect(table.columns[0].text).toBe('Time');
  176. expect(table.columns[1].text).toBe('Label Key 1');
  177. expect(table.columns[2].text).toBe('Value');
  178. });
  179. it('should return the union of columns for multiple queries', () => {
  180. table = transformDataToTable(multipleQueriesDataSameLabels, panel);
  181. expect(table.columns.length).toBe(6);
  182. expect(table.columns[0].text).toBe('Time');
  183. expect(table.columns[1].text).toBe('Label Key 1');
  184. expect(table.columns[2].text).toBe('Label Key 2');
  185. expect(table.columns[3].text).toBe('Value #A');
  186. expect(table.columns[4].text).toBe('Value #B');
  187. expect(table.columns[5].text).toBe('Value #C');
  188. });
  189. it('should return 1 row for a single query', () => {
  190. table = transformDataToTable(singleQueryData, panel);
  191. expect(table.rows.length).toBe(1);
  192. expect(table.rows[0][0]).toBe(time);
  193. expect(table.rows[0][1]).toBe('Label Value 1');
  194. expect(table.rows[0][2]).toBe(42);
  195. });
  196. it('should return 2 rows for a multiple queries with same label values plus one extra row', () => {
  197. table = transformDataToTable(multipleQueriesDataSameLabels, panel);
  198. expect(table.rows.length).toBe(2);
  199. expect(table.rows[0][0]).toBe(time);
  200. expect(table.rows[0][1]).toBe('Label Value 1');
  201. expect(table.rows[0][2]).toBe('Label Value 2');
  202. expect(table.rows[0][3]).toBe(42);
  203. expect(table.rows[0][4]).toBe(13);
  204. expect(table.rows[0][5]).toBe(4);
  205. expect(table.rows[1][0]).toBe(time);
  206. expect(table.rows[1][1]).toBe('Label Value 1');
  207. expect(table.rows[1][2]).toBe('Label Value 2');
  208. expect(table.rows[1][3]).toBeUndefined();
  209. expect(table.rows[1][4]).toBeUndefined();
  210. expect(table.rows[1][5]).toBe(7);
  211. });
  212. it('should return 2 rows for multiple queries with different label values', () => {
  213. table = transformDataToTable(multipleQueriesDataDifferentLabels, panel);
  214. expect(table.rows.length).toBe(2);
  215. expect(table.columns.length).toBe(6);
  216. expect(table.rows[0][0]).toBe(time);
  217. expect(table.rows[0][1]).toBe('Label Value 1');
  218. expect(table.rows[0][2]).toBe(42);
  219. expect(table.rows[0][3]).toBe('Label Value 2');
  220. expect(table.rows[0][4]).toBe(13);
  221. expect(table.rows[0][5]).toBeUndefined();
  222. expect(table.rows[1][0]).toBe(time);
  223. expect(table.rows[1][1]).toBe('Label Value 3');
  224. expect(table.rows[1][2]).toBeUndefined();
  225. expect(table.rows[1][3]).toBeUndefined();
  226. expect(table.rows[1][4]).toBeUndefined();
  227. expect(table.rows[1][5]).toBe(7);
  228. });
  229. });
  230. });
  231. });
  232. describe('doc data sets', () => {
  233. describe('JSON Data', () => {
  234. var panel = {
  235. transform: 'json',
  236. columns: [
  237. { text: 'Timestamp', value: 'timestamp' },
  238. { text: 'Message', value: 'message' },
  239. { text: 'nested.level2', value: 'nested.level2' },
  240. ],
  241. };
  242. var rawData = [
  243. {
  244. type: 'docs',
  245. datapoints: [
  246. {
  247. timestamp: 'time',
  248. message: 'message',
  249. nested: {
  250. level2: 'level2-value',
  251. },
  252. },
  253. ],
  254. },
  255. ];
  256. describe('getColumns', function() {
  257. it('should return nested properties', function() {
  258. var columns = transformers['json'].getColumns(rawData);
  259. expect(columns[0].text).toBe('timestamp');
  260. expect(columns[1].text).toBe('message');
  261. expect(columns[2].text).toBe('nested.level2');
  262. });
  263. });
  264. describe('transform', function() {
  265. beforeEach(() => {
  266. table = transformDataToTable(rawData, panel);
  267. });
  268. it('should return 2 columns', () => {
  269. expect(table.columns.length).toBe(3);
  270. expect(table.columns[0].text).toBe('Timestamp');
  271. expect(table.columns[1].text).toBe('Message');
  272. expect(table.columns[2].text).toBe('nested.level2');
  273. });
  274. it('should return 2 rows', () => {
  275. expect(table.rows.length).toBe(1);
  276. expect(table.rows[0][0]).toBe('time');
  277. expect(table.rows[0][1]).toBe('message');
  278. expect(table.rows[0][2]).toBe('level2-value');
  279. });
  280. });
  281. });
  282. });
  283. describe('annotation data', () => {
  284. describe('Annnotations', () => {
  285. var panel = { transform: 'annotations' };
  286. var rawData = {
  287. annotations: [
  288. {
  289. time: 1000,
  290. text: 'hej',
  291. tags: ['tags', 'asd'],
  292. title: 'title',
  293. },
  294. ],
  295. };
  296. beforeEach(() => {
  297. table = transformDataToTable(rawData, panel);
  298. });
  299. it('should return 4 columns', () => {
  300. expect(table.columns.length).toBe(4);
  301. expect(table.columns[0].text).toBe('Time');
  302. expect(table.columns[1].text).toBe('Title');
  303. expect(table.columns[2].text).toBe('Text');
  304. expect(table.columns[3].text).toBe('Tags');
  305. });
  306. it('should return 1 rows', () => {
  307. expect(table.rows.length).toBe(1);
  308. expect(table.rows[0][0]).toBe(1000);
  309. });
  310. });
  311. });
  312. });