eventsChart.spec.jsx 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import React from 'react';
  2. import {EventsChart} from 'app/views/events/eventsChart';
  3. import {chart, doZoom, mockZoomRange} from 'app-test/helpers/charts';
  4. import {getUtcToLocalDateObject} from 'app/utils/dates';
  5. import {initializeOrg} from 'app-test/helpers/initializeOrg';
  6. import {mount} from 'enzyme';
  7. import {updateParams} from 'app/actionCreators/globalSelection';
  8. jest.mock('app/views/events/utils/eventsRequest', () => jest.fn(() => null));
  9. jest.mock('app/actionCreators/globalSelection', () => ({
  10. updateParams: jest.fn(),
  11. }));
  12. describe('EventsChart', function() {
  13. const {router, routerContext, org} = initializeOrg();
  14. let render;
  15. let wrapper;
  16. beforeEach(function() {
  17. mockZoomRange(1543449600000, 1543708800000);
  18. wrapper = mount(
  19. <EventsChart
  20. api={new MockApiClient()}
  21. location={{query: {}}}
  22. organization={org}
  23. project={[]}
  24. environment={[]}
  25. period="14d"
  26. start={null}
  27. end={null}
  28. utc={false}
  29. router={router}
  30. />,
  31. routerContext
  32. );
  33. // XXX: Note we spy on this AFTER it has already rendered once!
  34. render = jest.spyOn(wrapper.find('ChartZoom').instance(), 'render');
  35. });
  36. it('renders', function() {
  37. expect(render).toHaveBeenCalledTimes(0);
  38. });
  39. it('re-renders if period from props changes', function() {
  40. wrapper.setProps({period: '7d'});
  41. wrapper.update();
  42. expect(render).toHaveBeenCalledTimes(1);
  43. });
  44. it('re-renders if query from props changes', function() {
  45. wrapper.setProps({query: 'newQuery'});
  46. wrapper.update();
  47. expect(render).toHaveBeenCalledTimes(1);
  48. });
  49. it('re-renders if project from props changes', function() {
  50. wrapper.setProps({project: [2]});
  51. wrapper.update();
  52. expect(render).toHaveBeenCalledTimes(1);
  53. });
  54. it('has correct history entries when zooming', function() {
  55. const chartZoomInstance = wrapper.find('ChartZoom').instance();
  56. doZoom(wrapper, chart);
  57. expect(chartZoomInstance.history).toEqual([
  58. {
  59. period: '14d',
  60. start: null,
  61. end: null,
  62. },
  63. ]);
  64. expect(chartZoomInstance.currentPeriod.period).toEqual(null);
  65. expect(chartZoomInstance.currentPeriod.start).toEqual('2018-11-29T00:00:00');
  66. expect(chartZoomInstance.currentPeriod.end).toEqual('2018-12-02T00:00:00');
  67. // Zoom again
  68. mockZoomRange(1543536000000, 1543708800000);
  69. doZoom(wrapper, chart);
  70. expect(chartZoomInstance.currentPeriod.period).toEqual(null);
  71. expect(chartZoomInstance.currentPeriod.start).toEqual('2018-11-30T00:00:00');
  72. expect(chartZoomInstance.currentPeriod.end).toEqual('2018-12-02T00:00:00');
  73. expect(chartZoomInstance.history[0]).toEqual({
  74. period: '14d',
  75. start: null,
  76. end: null,
  77. });
  78. expect(chartZoomInstance.history[1].start).toEqual('2018-11-29T00:00:00');
  79. expect(chartZoomInstance.history[1].end).toEqual('2018-12-02T00:00:00');
  80. // go back in history
  81. mockZoomRange(null, null);
  82. doZoom(wrapper, chart);
  83. expect(chartZoomInstance.currentPeriod.period).toEqual(null);
  84. expect(chartZoomInstance.currentPeriod.start).toEqual('2018-11-29T00:00:00');
  85. expect(chartZoomInstance.currentPeriod.end).toEqual('2018-12-02T00:00:00');
  86. const newParams = {
  87. period: null,
  88. start: '2018-11-29T00:00:00',
  89. end: '2018-12-02T00:00:00',
  90. };
  91. expect(updateParams).toHaveBeenCalledWith(newParams, router);
  92. wrapper.setProps({
  93. period: newParams.period,
  94. start: getUtcToLocalDateObject(newParams.start),
  95. end: getUtcToLocalDateObject(newParams.end),
  96. });
  97. wrapper.update();
  98. });
  99. it('updates url params when restoring zoom level on chart', function() {
  100. doZoom(wrapper, chart);
  101. // Zoom again
  102. mockZoomRange(1543536000000, 1543708800000);
  103. doZoom(wrapper, chart);
  104. mockZoomRange(1543622400000, 1543708800000);
  105. doZoom(wrapper, chart);
  106. const chartZoomInstance = wrapper.find('ChartZoom').instance();
  107. expect(chartZoomInstance.history).toHaveLength(3);
  108. // Restore history
  109. chartZoomInstance.handleZoomRestore();
  110. chartZoomInstance.handleChartFinished();
  111. expect(chartZoomInstance.currentPeriod).toEqual({
  112. period: '14d',
  113. start: null,
  114. end: null,
  115. });
  116. const newParams = {
  117. period: '14d',
  118. start: null,
  119. end: null,
  120. };
  121. expect(updateParams).toHaveBeenCalledWith(newParams, router);
  122. wrapper.setProps({
  123. period: '14d',
  124. start: null,
  125. end: null,
  126. });
  127. wrapper.update();
  128. expect(chartZoomInstance.history).toHaveLength(0);
  129. });
  130. });