ResultProcessor.test.ts 15 KB

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