ResultProcessor.test.ts 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. jest.mock('@grafana/data/src/utils/moment_wrapper', () => ({
  2. dateTime: (ts: any) => {
  3. return {
  4. valueOf: () => ts,
  5. fromNow: () => 'fromNow() jest mocked',
  6. format: (fmt: string) => 'format() jest mocked',
  7. };
  8. },
  9. toUtc: (ts: any) => {
  10. return {
  11. format: (fmt: string) => 'format() jest mocked',
  12. };
  13. },
  14. }));
  15. import { ResultProcessor } from './ResultProcessor';
  16. import { ExploreItemState, ExploreMode } from 'app/types/explore';
  17. import TableModel from 'app/core/table_model';
  18. import { TimeSeries, LogRowModel, LogsMetaItem, GraphSeriesXY } from '@grafana/data';
  19. const testContext = (options: any = {}) => {
  20. const response = [
  21. {
  22. target: 'A-series',
  23. alias: 'A-series',
  24. datapoints: [[39.91264531864214, 1559038518831], [40.35179822906545, 1559038519831]],
  25. refId: 'A',
  26. },
  27. {
  28. columns: [
  29. {
  30. text: 'Time',
  31. },
  32. {
  33. text: 'Message',
  34. },
  35. {
  36. text: 'Description',
  37. },
  38. {
  39. text: 'Value',
  40. },
  41. ],
  42. rows: [
  43. [1559038518831, 'This is a message', 'Description', 23.1],
  44. [1559038519831, 'This is a message', 'Description', 23.1],
  45. ],
  46. refId: 'B',
  47. },
  48. ];
  49. const defaultOptions = {
  50. mode: ExploreMode.Metrics,
  51. replacePreviousResults: true,
  52. result: { data: response },
  53. graphResult: [] as TimeSeries[],
  54. tableResult: new TableModel(),
  55. logsResult: { hasUniqueLabels: false, rows: [] as LogRowModel[] },
  56. };
  57. const combinedOptions = { ...defaultOptions, ...options };
  58. const state = ({
  59. mode: combinedOptions.mode,
  60. graphResult: combinedOptions.graphResult,
  61. tableResult: combinedOptions.tableResult,
  62. logsResult: combinedOptions.logsResult,
  63. queryIntervals: { intervalMs: 10 },
  64. } as any) as ExploreItemState;
  65. const resultProcessor = new ResultProcessor(state, combinedOptions.replacePreviousResults, combinedOptions.result);
  66. return {
  67. result: combinedOptions.result,
  68. resultProcessor,
  69. };
  70. };
  71. describe('ResultProcessor', () => {
  72. describe('constructed without result', () => {
  73. describe('when calling getRawData', () => {
  74. it('then it should return an empty array', () => {
  75. const { resultProcessor } = testContext({ result: null });
  76. const theResult = resultProcessor.getRawData();
  77. expect(theResult).toEqual([]);
  78. });
  79. });
  80. describe('when calling getGraphResult', () => {
  81. it('then it should return an empty array', () => {
  82. const { resultProcessor } = testContext({ result: null });
  83. const theResult = resultProcessor.getGraphResult();
  84. expect(theResult).toEqual([]);
  85. });
  86. });
  87. describe('when calling getTableResult', () => {
  88. it('then it should return an empty TableModel', () => {
  89. const { resultProcessor } = testContext({ result: null });
  90. const theResult = resultProcessor.getTableResult();
  91. expect(theResult).toEqual(new TableModel());
  92. });
  93. });
  94. describe('when calling getLogsResult', () => {
  95. it('then it should return null', () => {
  96. const { resultProcessor } = testContext({ result: null });
  97. const theResult = resultProcessor.getLogsResult();
  98. expect(theResult).toBeNull();
  99. });
  100. });
  101. });
  102. describe('constructed with a result that is a DataQueryResponse', () => {
  103. describe('when calling getRawData', () => {
  104. it('then it should return result.data', () => {
  105. const { result, resultProcessor } = testContext();
  106. const theResult = resultProcessor.getRawData();
  107. expect(theResult).toEqual(result.data);
  108. });
  109. });
  110. describe('when calling getGraphResult', () => {
  111. it('then it should return correct graph result', () => {
  112. const { resultProcessor } = testContext();
  113. const theResult = resultProcessor.getGraphResult();
  114. expect(theResult).toEqual([
  115. {
  116. label: 'A-series',
  117. color: '#7EB26D',
  118. data: [[1559038518831, 39.91264531864214], [1559038519831, 40.35179822906545]],
  119. info: undefined,
  120. isVisible: true,
  121. yAxis: {
  122. index: 1,
  123. },
  124. },
  125. ]);
  126. });
  127. });
  128. describe('when calling getTableResult', () => {
  129. it('then it should return correct table result', () => {
  130. const { resultProcessor } = testContext();
  131. const theResult = resultProcessor.getTableResult();
  132. expect(theResult).toEqual({
  133. columnMap: {},
  134. columns: [{ text: 'Time' }, { text: 'Message' }, { text: 'Description' }, { text: 'Value' }],
  135. rows: [
  136. [1559038518831, 'This is a message', 'Description', 23.1],
  137. [1559038519831, 'This is a message', 'Description', 23.1],
  138. ],
  139. type: 'table',
  140. });
  141. });
  142. });
  143. describe('when calling getLogsResult', () => {
  144. it('then it should return correct logs result', () => {
  145. const { resultProcessor } = testContext({ mode: ExploreMode.Logs, observerResponse: null });
  146. const theResult = resultProcessor.getLogsResult();
  147. console.log(JSON.stringify(theResult));
  148. expect(theResult).toEqual({
  149. hasUniqueLabels: false,
  150. meta: [],
  151. rows: [
  152. {
  153. entry: 'This is a message',
  154. hasAnsi: false,
  155. labels: undefined,
  156. logLevel: 'unknown',
  157. raw: 'This is a message',
  158. searchWords: [] as string[],
  159. timeEpochMs: 1559038519831,
  160. timeFromNow: 'fromNow() jest mocked',
  161. timeLocal: 'format() jest mocked',
  162. timeUtc: 'format() jest mocked',
  163. timestamp: 1559038519831,
  164. uniqueLabels: {},
  165. },
  166. {
  167. entry: 'This is a message',
  168. hasAnsi: false,
  169. labels: undefined,
  170. logLevel: 'unknown',
  171. raw: 'This is a message',
  172. searchWords: [] as string[],
  173. timeEpochMs: 1559038518831,
  174. timeFromNow: 'fromNow() jest mocked',
  175. timeLocal: 'format() jest mocked',
  176. timeUtc: 'format() jest mocked',
  177. timestamp: 1559038518831,
  178. uniqueLabels: {},
  179. },
  180. ],
  181. series: [
  182. {
  183. label: 'A-series',
  184. color: '#7EB26D',
  185. data: [[1559038518831, 39.91264531864214], [1559038519831, 40.35179822906545]],
  186. info: undefined,
  187. isVisible: true,
  188. yAxis: {
  189. index: 1,
  190. },
  191. },
  192. ],
  193. });
  194. });
  195. });
  196. });
  197. describe('constructed with result that is a DataQueryResponse and merging with previous results', () => {
  198. describe('when calling getRawData', () => {
  199. it('then it should return result.data', () => {
  200. const { result, resultProcessor } = testContext();
  201. const theResult = resultProcessor.getRawData();
  202. expect(theResult).toEqual(result.data);
  203. });
  204. });
  205. describe('when calling getGraphResult', () => {
  206. it('then it should return correct graph result', () => {
  207. const { resultProcessor } = testContext({
  208. replacePreviousResults: false,
  209. graphResult: [
  210. {
  211. label: 'A-series',
  212. color: '#7EB26D',
  213. data: [[1558038518831, 19.91264531864214], [1558038518831, 20.35179822906545]],
  214. info: undefined,
  215. isVisible: true,
  216. yAxis: {
  217. index: 1,
  218. },
  219. },
  220. ],
  221. });
  222. const theResult = resultProcessor.getGraphResult();
  223. expect(theResult).toEqual([
  224. {
  225. label: 'A-series',
  226. color: '#7EB26D',
  227. data: [
  228. [1558038518831, 19.91264531864214],
  229. [1558038518831, 20.35179822906545],
  230. [1559038518831, 39.91264531864214],
  231. [1559038519831, 40.35179822906545],
  232. ],
  233. info: undefined,
  234. isVisible: true,
  235. yAxis: {
  236. index: 1,
  237. },
  238. },
  239. ]);
  240. });
  241. });
  242. describe('when calling getTableResult', () => {
  243. it('then it should return correct table result', () => {
  244. const { resultProcessor } = testContext({
  245. replacePreviousResults: false,
  246. tableResult: {
  247. columnMap: {},
  248. columns: [{ text: 'Time' }, { text: 'Message' }, { text: 'Description' }, { text: 'Value' }],
  249. rows: [
  250. [1558038518831, 'This is a previous message 1', 'Previous Description 1', 21.1],
  251. [1558038519831, 'This is a previous message 2', 'Previous Description 2', 22.1],
  252. ],
  253. type: 'table',
  254. },
  255. });
  256. const theResult = resultProcessor.getTableResult();
  257. expect(theResult).toEqual({
  258. columnMap: {},
  259. columns: [{ text: 'Time' }, { text: 'Message' }, { text: 'Description' }, { text: 'Value' }],
  260. rows: [
  261. [1558038518831, 'This is a previous message 1', 'Previous Description 1', 21.1],
  262. [1558038519831, 'This is a previous message 2', 'Previous Description 2', 22.1],
  263. [1559038518831, 'This is a message', 'Description', 23.1],
  264. [1559038519831, 'This is a message', 'Description', 23.1],
  265. ],
  266. type: 'table',
  267. });
  268. });
  269. });
  270. describe('when calling getLogsResult', () => {
  271. it('then it should return correct logs result', () => {
  272. const { resultProcessor } = testContext({
  273. mode: ExploreMode.Logs,
  274. replacePreviousResults: false,
  275. logsResult: {
  276. hasUniqueLabels: false,
  277. meta: [],
  278. rows: [
  279. {
  280. entry: 'This is a previous message 1',
  281. fresh: true,
  282. hasAnsi: false,
  283. labels: { cluster: 'some-cluster' },
  284. logLevel: 'unknown',
  285. raw: 'This is a previous message 1',
  286. searchWords: [] as string[],
  287. timeEpochMs: 1558038519831,
  288. timeFromNow: 'fromNow() jest mocked',
  289. timeLocal: 'format() jest mocked',
  290. timeUtc: 'format() jest mocked',
  291. timestamp: 1558038519831,
  292. uniqueLabels: {},
  293. },
  294. {
  295. entry: 'This is a previous message 2',
  296. fresh: true,
  297. hasAnsi: false,
  298. labels: { cluster: 'some-cluster' },
  299. logLevel: 'unknown',
  300. raw: 'This is a previous message 2',
  301. searchWords: [] as string[],
  302. timeEpochMs: 1558038518831,
  303. timeFromNow: 'fromNow() jest mocked',
  304. timeLocal: 'format() jest mocked',
  305. timeUtc: 'format() jest mocked',
  306. timestamp: 1558038518831,
  307. uniqueLabels: {},
  308. },
  309. ],
  310. series: [
  311. {
  312. label: 'A-series',
  313. color: '#7EB26D',
  314. data: [[1558038518831, 37.91264531864214], [1558038519831, 38.35179822906545]],
  315. info: undefined,
  316. isVisible: true,
  317. yAxis: {
  318. index: 1,
  319. },
  320. },
  321. ],
  322. },
  323. });
  324. const theResult = resultProcessor.getLogsResult();
  325. const expected = {
  326. hasUniqueLabels: false,
  327. meta: [] as LogsMetaItem[],
  328. rows: [
  329. {
  330. entry: 'This is a previous message 1',
  331. fresh: false,
  332. hasAnsi: false,
  333. labels: { cluster: 'some-cluster' },
  334. logLevel: 'unknown',
  335. raw: 'This is a previous message 1',
  336. searchWords: [] as string[],
  337. timeEpochMs: 1558038519831,
  338. timeFromNow: 'fromNow() jest mocked',
  339. timeLocal: 'format() jest mocked',
  340. timeUtc: 'format() jest mocked',
  341. timestamp: 1558038519831,
  342. uniqueLabels: {},
  343. },
  344. {
  345. entry: 'This is a previous message 2',
  346. fresh: false,
  347. hasAnsi: false,
  348. labels: { cluster: 'some-cluster' },
  349. logLevel: 'unknown',
  350. raw: 'This is a previous message 2',
  351. searchWords: [] as string[],
  352. timeEpochMs: 1558038518831,
  353. timeFromNow: 'fromNow() jest mocked',
  354. timeLocal: 'format() jest mocked',
  355. timeUtc: 'format() jest mocked',
  356. timestamp: 1558038518831,
  357. uniqueLabels: {},
  358. },
  359. {
  360. entry: 'This is a message',
  361. fresh: true,
  362. hasAnsi: false,
  363. labels: undefined,
  364. logLevel: 'unknown',
  365. raw: 'This is a message',
  366. searchWords: [] as string[],
  367. timeEpochMs: 1559038519831,
  368. timeFromNow: 'fromNow() jest mocked',
  369. timeLocal: 'format() jest mocked',
  370. timeUtc: 'format() jest mocked',
  371. timestamp: 1559038519831,
  372. uniqueLabels: {},
  373. },
  374. {
  375. entry: 'This is a message',
  376. fresh: true,
  377. hasAnsi: false,
  378. labels: undefined,
  379. logLevel: 'unknown',
  380. raw: 'This is a message',
  381. searchWords: [] as string[],
  382. timeEpochMs: 1559038518831,
  383. timeFromNow: 'fromNow() jest mocked',
  384. timeLocal: 'format() jest mocked',
  385. timeUtc: 'format() jest mocked',
  386. timestamp: 1559038518831,
  387. uniqueLabels: {},
  388. },
  389. ],
  390. series: [
  391. {
  392. label: 'A-series',
  393. color: '#7EB26D',
  394. data: [
  395. [1558038518831, 37.91264531864214],
  396. [1558038519831, 38.35179822906545],
  397. [1559038518831, 39.91264531864214],
  398. [1559038519831, 40.35179822906545],
  399. ],
  400. info: undefined,
  401. isVisible: true,
  402. yAxis: {
  403. index: 1,
  404. },
  405. } as GraphSeriesXY,
  406. ],
  407. };
  408. expect(theResult).toEqual(expected);
  409. });
  410. });
  411. });
  412. });