eventsChart.spec.jsx 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. import React from 'react';
  2. import {EventsChart} from 'app/views/organizationEvents/eventsChart';
  3. import {chart, doZoom, mockZoomRange} from 'app-test/helpers/charts';
  4. import {getLocalDateObject} 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/organizationEvents/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. let newParams;
  56. const chartZoomInstance = wrapper.find('ChartZoom').instance();
  57. doZoom(wrapper, chart);
  58. expect(chartZoomInstance.history).toEqual([
  59. {
  60. period: '14d',
  61. start: null,
  62. end: null,
  63. },
  64. ]);
  65. expect(chartZoomInstance.currentPeriod.period).toEqual(null);
  66. expect(chartZoomInstance.currentPeriod.start).toEqual('2018-11-29T00:00:00');
  67. expect(chartZoomInstance.currentPeriod.end).toEqual('2018-12-02T00:00:00');
  68. // Zoom again
  69. mockZoomRange(1543536000000, 1543708800000);
  70. doZoom(wrapper, chart);
  71. expect(chartZoomInstance.currentPeriod.period).toEqual(null);
  72. expect(chartZoomInstance.currentPeriod.start).toEqual('2018-11-30T00:00:00');
  73. expect(chartZoomInstance.currentPeriod.end).toEqual('2018-12-02T00:00:00');
  74. expect(chartZoomInstance.history[0]).toEqual({
  75. period: '14d',
  76. start: null,
  77. end: null,
  78. });
  79. expect(chartZoomInstance.history[1].start).toEqual('2018-11-29T00:00:00');
  80. expect(chartZoomInstance.history[1].end).toEqual('2018-12-02T00:00:00');
  81. // go back in history
  82. mockZoomRange(null, null);
  83. doZoom(wrapper, chart);
  84. expect(chartZoomInstance.currentPeriod.period).toEqual(null);
  85. expect(chartZoomInstance.currentPeriod.start).toEqual('2018-11-29T00:00:00');
  86. expect(chartZoomInstance.currentPeriod.end).toEqual('2018-12-02T00:00:00');
  87. newParams = {
  88. period: null,
  89. start: '2018-11-29T00:00:00',
  90. end: '2018-12-02T00:00:00',
  91. };
  92. expect(updateParams).toHaveBeenCalledWith(newParams, router);
  93. wrapper.setProps({
  94. period: newParams.period,
  95. start: getLocalDateObject(newParams.start),
  96. end: getLocalDateObject(newParams.end),
  97. });
  98. wrapper.update();
  99. });
  100. it('updates url params when restoring zoom level on chart', function() {
  101. let newParams;
  102. doZoom(wrapper, chart);
  103. // Zoom again
  104. mockZoomRange(1543536000000, 1543708800000);
  105. doZoom(wrapper, chart);
  106. mockZoomRange(1543622400000, 1543708800000);
  107. doZoom(wrapper, chart);
  108. const chartZoomInstance = wrapper.find('ChartZoom').instance();
  109. expect(chartZoomInstance.history).toHaveLength(3);
  110. // Restore history
  111. chartZoomInstance.handleZoomRestore();
  112. chartZoomInstance.handleChartFinished();
  113. expect(chartZoomInstance.currentPeriod).toEqual({
  114. period: '14d',
  115. start: null,
  116. end: null,
  117. });
  118. newParams = {
  119. period: '14d',
  120. start: null,
  121. end: null,
  122. };
  123. expect(updateParams).toHaveBeenCalledWith(newParams, router);
  124. wrapper.setProps({
  125. period: '14d',
  126. start: null,
  127. end: null,
  128. });
  129. wrapper.update();
  130. expect(chartZoomInstance.history).toHaveLength(0);
  131. });
  132. });