ResultProcessor.test.ts 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  1. jest.mock('@grafana/ui/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 { toFixed, TimeSeries, LogRowModel, LogsMetaItem } from '@grafana/ui';
  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. alias: 'A-series',
  117. aliasEscaped: 'A-series',
  118. bars: {
  119. fillColor: '#7EB26D',
  120. },
  121. hasMsResolution: true,
  122. id: 'A-series',
  123. label: 'A-series',
  124. legend: true,
  125. stats: {},
  126. color: '#7EB26D',
  127. datapoints: [[39.91264531864214, 1559038518831], [40.35179822906545, 1559038519831]],
  128. unit: undefined,
  129. valueFormater: toFixed,
  130. },
  131. ]);
  132. });
  133. });
  134. describe('when calling getTableResult', () => {
  135. it('then it should return correct table result', () => {
  136. const { resultProcessor } = testContext();
  137. const theResult = resultProcessor.getTableResult();
  138. expect(theResult).toEqual({
  139. columnMap: {},
  140. columns: [{ text: 'Time' }, { text: 'Message' }, { text: 'Description' }, { text: 'Value' }],
  141. rows: [
  142. [1559038518831, 'This is a message', 'Description', 23.1],
  143. [1559038519831, 'This is a message', 'Description', 23.1],
  144. ],
  145. type: 'table',
  146. });
  147. });
  148. });
  149. describe('when calling getLogsResult', () => {
  150. it('then it should return correct logs result', () => {
  151. const { resultProcessor } = testContext({ mode: ExploreMode.Logs, observerResponse: null });
  152. const theResult = resultProcessor.getLogsResult();
  153. expect(theResult).toEqual({
  154. hasUniqueLabels: false,
  155. meta: [],
  156. rows: [
  157. {
  158. entry: 'This is a message',
  159. hasAnsi: false,
  160. labels: undefined,
  161. logLevel: 'unknown',
  162. raw: 'This is a message',
  163. searchWords: [] as string[],
  164. timeEpochMs: 1559038519831,
  165. timeFromNow: 'fromNow() jest mocked',
  166. timeLocal: 'format() jest mocked',
  167. timeUtc: 'format() jest mocked',
  168. timestamp: 1559038519831,
  169. uniqueLabels: {},
  170. },
  171. {
  172. entry: 'This is a message',
  173. hasAnsi: false,
  174. labels: undefined,
  175. logLevel: 'unknown',
  176. raw: 'This is a message',
  177. searchWords: [] as string[],
  178. timeEpochMs: 1559038518831,
  179. timeFromNow: 'fromNow() jest mocked',
  180. timeLocal: 'format() jest mocked',
  181. timeUtc: 'format() jest mocked',
  182. timestamp: 1559038518831,
  183. uniqueLabels: {},
  184. },
  185. ],
  186. series: [
  187. {
  188. alias: 'A-series',
  189. datapoints: [[39.91264531864214, 1559038518831], [40.35179822906545, 1559038519831]],
  190. meta: undefined,
  191. refId: 'A',
  192. target: 'A-series',
  193. unit: undefined,
  194. },
  195. ],
  196. });
  197. });
  198. });
  199. });
  200. describe('constructed with result that is a DataQueryResponse and merging with previous results', () => {
  201. describe('when calling getRawData', () => {
  202. it('then it should return result.data', () => {
  203. const { result, resultProcessor } = testContext();
  204. const theResult = resultProcessor.getRawData();
  205. expect(theResult).toEqual(result.data);
  206. });
  207. });
  208. describe('when calling getGraphResult', () => {
  209. it('then it should return correct graph result', () => {
  210. const { resultProcessor } = testContext({
  211. replacePreviousResults: false,
  212. graphResult: [
  213. {
  214. alias: 'A-series',
  215. aliasEscaped: 'A-series',
  216. bars: {
  217. fillColor: '#7EB26D',
  218. },
  219. hasMsResolution: true,
  220. id: 'A-series',
  221. label: 'A-series',
  222. legend: true,
  223. stats: {},
  224. color: '#7EB26D',
  225. datapoints: [[19.91264531864214, 1558038518831], [20.35179822906545, 1558038519831]],
  226. unit: undefined,
  227. valueFormater: toFixed,
  228. },
  229. ],
  230. });
  231. const theResult = resultProcessor.getGraphResult();
  232. expect(theResult).toEqual([
  233. {
  234. alias: 'A-series',
  235. aliasEscaped: 'A-series',
  236. bars: {
  237. fillColor: '#7EB26D',
  238. },
  239. hasMsResolution: true,
  240. id: 'A-series',
  241. label: 'A-series',
  242. legend: true,
  243. stats: {},
  244. color: '#7EB26D',
  245. datapoints: [
  246. [19.91264531864214, 1558038518831],
  247. [20.35179822906545, 1558038519831],
  248. [39.91264531864214, 1559038518831],
  249. [40.35179822906545, 1559038519831],
  250. ],
  251. unit: undefined,
  252. valueFormater: toFixed,
  253. },
  254. ]);
  255. });
  256. });
  257. describe('when calling getTableResult', () => {
  258. it('then it should return correct table result', () => {
  259. const { resultProcessor } = testContext({
  260. replacePreviousResults: false,
  261. tableResult: {
  262. columnMap: {},
  263. columns: [{ text: 'Time' }, { text: 'Message' }, { text: 'Description' }, { text: 'Value' }],
  264. rows: [
  265. [1558038518831, 'This is a previous message 1', 'Previous Description 1', 21.1],
  266. [1558038519831, 'This is a previous message 2', 'Previous Description 2', 22.1],
  267. ],
  268. type: 'table',
  269. },
  270. });
  271. const theResult = resultProcessor.getTableResult();
  272. expect(theResult).toEqual({
  273. columnMap: {},
  274. columns: [{ text: 'Time' }, { text: 'Message' }, { text: 'Description' }, { text: 'Value' }],
  275. rows: [
  276. [1558038518831, 'This is a previous message 1', 'Previous Description 1', 21.1],
  277. [1558038519831, 'This is a previous message 2', 'Previous Description 2', 22.1],
  278. [1559038518831, 'This is a message', 'Description', 23.1],
  279. [1559038519831, 'This is a message', 'Description', 23.1],
  280. ],
  281. type: 'table',
  282. });
  283. });
  284. });
  285. describe('when calling getLogsResult', () => {
  286. it('then it should return correct logs result', () => {
  287. const { resultProcessor } = testContext({
  288. mode: ExploreMode.Logs,
  289. replacePreviousResults: false,
  290. logsResult: {
  291. hasUniqueLabels: false,
  292. meta: [],
  293. rows: [
  294. {
  295. entry: 'This is a previous message 1',
  296. fresh: true,
  297. hasAnsi: false,
  298. labels: { cluster: 'some-cluster' },
  299. logLevel: 'unknown',
  300. raw: 'This is a previous message 1',
  301. searchWords: [] as string[],
  302. timeEpochMs: 1558038519831,
  303. timeFromNow: 'fromNow() jest mocked',
  304. timeLocal: 'format() jest mocked',
  305. timeUtc: 'format() jest mocked',
  306. timestamp: 1558038519831,
  307. uniqueLabels: {},
  308. },
  309. {
  310. entry: 'This is a previous message 2',
  311. fresh: true,
  312. hasAnsi: false,
  313. labels: { cluster: 'some-cluster' },
  314. logLevel: 'unknown',
  315. raw: 'This is a previous message 2',
  316. searchWords: [] as string[],
  317. timeEpochMs: 1558038518831,
  318. timeFromNow: 'fromNow() jest mocked',
  319. timeLocal: 'format() jest mocked',
  320. timeUtc: 'format() jest mocked',
  321. timestamp: 1558038518831,
  322. uniqueLabels: {},
  323. },
  324. ],
  325. series: [
  326. {
  327. alias: 'A-series',
  328. aliasEscaped: 'A-series',
  329. bars: {
  330. fillColor: '#7EB26D',
  331. },
  332. hasMsResolution: true,
  333. id: 'A-series',
  334. label: 'A-series',
  335. legend: true,
  336. stats: {},
  337. color: '#7EB26D',
  338. datapoints: [[37.91264531864214, 1558038518831], [38.35179822906545, 1558038519831]],
  339. unit: undefined,
  340. valueFormater: toFixed,
  341. },
  342. ],
  343. },
  344. });
  345. const theResult = resultProcessor.getLogsResult();
  346. const expected = {
  347. hasUniqueLabels: false,
  348. meta: [] as LogsMetaItem[],
  349. rows: [
  350. {
  351. entry: 'This is a previous message 1',
  352. fresh: false,
  353. hasAnsi: false,
  354. labels: { cluster: 'some-cluster' },
  355. logLevel: 'unknown',
  356. raw: 'This is a previous message 1',
  357. searchWords: [] as string[],
  358. timeEpochMs: 1558038519831,
  359. timeFromNow: 'fromNow() jest mocked',
  360. timeLocal: 'format() jest mocked',
  361. timeUtc: 'format() jest mocked',
  362. timestamp: 1558038519831,
  363. uniqueLabels: {},
  364. },
  365. {
  366. entry: 'This is a previous message 2',
  367. fresh: false,
  368. hasAnsi: false,
  369. labels: { cluster: 'some-cluster' },
  370. logLevel: 'unknown',
  371. raw: 'This is a previous message 2',
  372. searchWords: [] as string[],
  373. timeEpochMs: 1558038518831,
  374. timeFromNow: 'fromNow() jest mocked',
  375. timeLocal: 'format() jest mocked',
  376. timeUtc: 'format() jest mocked',
  377. timestamp: 1558038518831,
  378. uniqueLabels: {},
  379. },
  380. {
  381. entry: 'This is a message',
  382. fresh: true,
  383. hasAnsi: false,
  384. labels: undefined,
  385. logLevel: 'unknown',
  386. raw: 'This is a message',
  387. searchWords: [] as string[],
  388. timeEpochMs: 1559038519831,
  389. timeFromNow: 'fromNow() jest mocked',
  390. timeLocal: 'format() jest mocked',
  391. timeUtc: 'format() jest mocked',
  392. timestamp: 1559038519831,
  393. uniqueLabels: {},
  394. },
  395. {
  396. entry: 'This is a message',
  397. fresh: true,
  398. hasAnsi: false,
  399. labels: undefined,
  400. logLevel: 'unknown',
  401. raw: 'This is a message',
  402. searchWords: [] as string[],
  403. timeEpochMs: 1559038518831,
  404. timeFromNow: 'fromNow() jest mocked',
  405. timeLocal: 'format() jest mocked',
  406. timeUtc: 'format() jest mocked',
  407. timestamp: 1559038518831,
  408. uniqueLabels: {},
  409. },
  410. ],
  411. series: [
  412. {
  413. alias: 'A-series',
  414. aliasEscaped: 'A-series',
  415. bars: {
  416. fillColor: '#7EB26D',
  417. },
  418. hasMsResolution: true,
  419. id: 'A-series',
  420. label: 'A-series',
  421. legend: true,
  422. stats: {},
  423. color: '#7EB26D',
  424. datapoints: [
  425. [37.91264531864214, 1558038518831],
  426. [38.35179822906545, 1558038519831],
  427. [39.91264531864214, 1559038518831],
  428. [40.35179822906545, 1559038519831],
  429. ],
  430. unit: undefined as string,
  431. valueFormater: toFixed,
  432. },
  433. ],
  434. };
  435. expect(theResult).toEqual(expected);
  436. });
  437. });
  438. });
  439. });