epicTester.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import { Epic, ActionsObservable, StateObservable } from 'redux-observable';
  2. import { Subject } from 'rxjs';
  3. import {
  4. DataSourceApi,
  5. DataQuery,
  6. DataSourceJsonData,
  7. DataQueryRequest,
  8. DataStreamObserver,
  9. DataQueryResponse,
  10. DataStreamState,
  11. } from '@grafana/ui';
  12. import { ActionOf } from 'app/core/redux/actionCreatorFactory';
  13. import { StoreState } from 'app/types/store';
  14. import { EpicDependencies } from 'app/store/configureStore';
  15. export const epicTester = (
  16. epic: Epic<ActionOf<any>, ActionOf<any>, StoreState, EpicDependencies>,
  17. state?: Partial<StoreState>
  18. ) => {
  19. const resultingActions: Array<ActionOf<any>> = [];
  20. const action$ = new Subject<ActionOf<any>>();
  21. const state$ = new Subject<StoreState>();
  22. const actionObservable$ = new ActionsObservable(action$);
  23. const stateObservable$ = new StateObservable(state$, (state as StoreState) || ({} as StoreState));
  24. const queryResponse$ = new Subject<DataQueryResponse>();
  25. const observer$ = new Subject<DataStreamState>();
  26. const getQueryResponse = (
  27. datasourceInstance: DataSourceApi<DataQuery, DataSourceJsonData>,
  28. options: DataQueryRequest<DataQuery>,
  29. observer?: DataStreamObserver
  30. ) => {
  31. if (observer) {
  32. observer$.subscribe({ next: event => observer(event) });
  33. }
  34. return queryResponse$;
  35. };
  36. const dependencies: EpicDependencies = {
  37. getQueryResponse,
  38. };
  39. epic(actionObservable$, stateObservable$, dependencies).subscribe({ next: action => resultingActions.push(action) });
  40. const whenActionIsDispatched = (action: ActionOf<any>) => {
  41. action$.next(action);
  42. return instance;
  43. };
  44. const whenQueryReceivesResponse = (response: DataQueryResponse) => {
  45. queryResponse$.next(response);
  46. return instance;
  47. };
  48. const whenQueryThrowsError = (error: any) => {
  49. queryResponse$.error(error);
  50. return instance;
  51. };
  52. const whenQueryObserverReceivesEvent = (event: DataStreamState) => {
  53. observer$.next(event);
  54. return instance;
  55. };
  56. const thenResultingActionsEqual = (...actions: Array<ActionOf<any>>) => {
  57. expect(actions).toEqual(resultingActions);
  58. return instance;
  59. };
  60. const thenNoActionsWhereDispatched = () => {
  61. expect(resultingActions).toEqual([]);
  62. return instance;
  63. };
  64. const instance = {
  65. whenActionIsDispatched,
  66. whenQueryReceivesResponse,
  67. whenQueryThrowsError,
  68. whenQueryObserverReceivesEvent,
  69. thenResultingActionsEqual,
  70. thenNoActionsWhereDispatched,
  71. };
  72. return instance;
  73. };