processQueryResultsEpic.test.ts 4.6 KB

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