processQueryResultsEpic.test.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import { mockExploreState } from 'test/mocks/mockExploreState';
  2. import { epicTester, MOCKED_ABSOLUTE_RANGE } from 'test/core/redux/epicTester';
  3. import {
  4. processQueryResultsAction,
  5. resetQueryErrorAction,
  6. querySuccessAction,
  7. scanStopAction,
  8. updateTimeRangeAction,
  9. runQueriesAction,
  10. } from '../actionTypes';
  11. import { DataFrame, LoadingState, toDataFrame } from '@grafana/data';
  12. import { processQueryResultsEpic } from './processQueryResultsEpic';
  13. import TableModel from 'app/core/table_model';
  14. const testContext = () => {
  15. const serieA: DataFrame = toDataFrame({
  16. fields: [],
  17. refId: 'A',
  18. });
  19. const serieB: DataFrame = toDataFrame({
  20. fields: [],
  21. refId: 'B',
  22. });
  23. const series = [serieA, serieB];
  24. const latency = 0;
  25. const loadingState = LoadingState.Done;
  26. return {
  27. latency,
  28. series,
  29. loadingState,
  30. };
  31. };
  32. describe('processQueryResultsEpic', () => {
  33. describe('when processQueryResultsAction is dispatched', () => {
  34. describe('and datasourceInstance is the same', () => {
  35. describe('and explore is not scanning', () => {
  36. it('then resetQueryErrorAction and querySuccessAction are dispatched and eventBridge emits correct message', () => {
  37. const { datasourceId, exploreId, state, eventBridge } = mockExploreState();
  38. const { latency, series, loadingState } = testContext();
  39. const graphResult: any[] = [];
  40. const tableResult = new TableModel();
  41. const logsResult: any = null;
  42. epicTester(processQueryResultsEpic, state)
  43. .whenActionIsDispatched(
  44. processQueryResultsAction({ exploreId, datasourceId, loadingState, series, latency })
  45. )
  46. .thenResultingActionsEqual(
  47. resetQueryErrorAction({ exploreId, refIds: ['A', 'B'] }),
  48. querySuccessAction({ exploreId, loadingState, graphResult, tableResult, logsResult, latency })
  49. );
  50. expect(eventBridge.emit).toBeCalledTimes(1);
  51. expect(eventBridge.emit).toBeCalledWith('data-received', series);
  52. });
  53. });
  54. describe('and explore is scanning', () => {
  55. describe('and we have a result', () => {
  56. it('then correct actions are dispatched', () => {
  57. const { datasourceId, exploreId, state } = mockExploreState({ scanning: true });
  58. const { latency, series, loadingState } = testContext();
  59. const graphResult: any[] = [];
  60. const tableResult = new TableModel();
  61. const logsResult: any = null;
  62. epicTester(processQueryResultsEpic, state)
  63. .whenActionIsDispatched(
  64. processQueryResultsAction({ exploreId, datasourceId, loadingState, series, latency })
  65. )
  66. .thenResultingActionsEqual(
  67. resetQueryErrorAction({ exploreId, refIds: ['A', 'B'] }),
  68. querySuccessAction({ exploreId, loadingState, graphResult, tableResult, logsResult, latency }),
  69. scanStopAction({ exploreId })
  70. );
  71. });
  72. });
  73. describe('and we do not have a result', () => {
  74. it('then correct actions are dispatched', () => {
  75. const { datasourceId, exploreId, state } = mockExploreState({ scanning: true });
  76. const { latency, loadingState } = testContext();
  77. const graphResult: any[] = [];
  78. const tableResult = new TableModel();
  79. const logsResult: any = null;
  80. epicTester(processQueryResultsEpic, state)
  81. .whenActionIsDispatched(
  82. processQueryResultsAction({ exploreId, datasourceId, loadingState, series: [], latency })
  83. )
  84. .thenResultingActionsEqual(
  85. resetQueryErrorAction({ exploreId, refIds: [] }),
  86. querySuccessAction({ exploreId, loadingState, graphResult, tableResult, logsResult, latency }),
  87. updateTimeRangeAction({ exploreId, absoluteRange: MOCKED_ABSOLUTE_RANGE }),
  88. runQueriesAction({ exploreId })
  89. );
  90. });
  91. });
  92. });
  93. });
  94. describe('and datasourceInstance is not the same', () => {
  95. it('then no actions are dispatched and eventBridge does not emit message', () => {
  96. const { exploreId, state, eventBridge } = mockExploreState();
  97. const { series, loadingState } = testContext();
  98. epicTester(processQueryResultsEpic, state)
  99. .whenActionIsDispatched(
  100. processQueryResultsAction({ exploreId, datasourceId: 'other id', loadingState, series, latency: 0 })
  101. )
  102. .thenNoActionsWhereDispatched();
  103. expect(eventBridge.emit).not.toBeCalled();
  104. });
  105. });
  106. });
  107. });