index.spec.jsx 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. import {mountWithTheme} from 'sentry-test/enzyme';
  2. import TimeRangeSelector from 'app/components/organizations/timeRangeSelector';
  3. import ConfigStore from 'app/stores/configStore';
  4. describe('TimeRangeSelector', function () {
  5. let wrapper;
  6. const onChange = jest.fn();
  7. const routerContext = TestStubs.routerContext();
  8. const createWrapper = (props = {}) =>
  9. mountWithTheme(
  10. <TimeRangeSelector
  11. showAbsolute
  12. showRelative
  13. onChange={onChange}
  14. organization={TestStubs.Organization()}
  15. {...props}
  16. />,
  17. routerContext
  18. );
  19. beforeEach(function () {
  20. ConfigStore.loadInitialData({
  21. user: {options: {timezone: 'America/New_York'}},
  22. });
  23. onChange.mockReset();
  24. });
  25. it('renders when given relative period not in dropdown', function () {
  26. wrapper = mountWithTheme(
  27. <TimeRangeSelector showAbsolute={false} showRelative={false} relative="9d" />,
  28. routerContext
  29. );
  30. expect(wrapper.find('HeaderItem').text()).toEqual('Other');
  31. });
  32. it('renders when given an invalid relative period', function () {
  33. wrapper = mountWithTheme(
  34. <TimeRangeSelector showAbsolute={false} showRelative={false} relative="1w" />,
  35. routerContext
  36. );
  37. expect(wrapper.find('HeaderItem').text()).toEqual('Invalid period');
  38. });
  39. it('hides relative and absolute selectors', async function () {
  40. wrapper = mountWithTheme(
  41. <TimeRangeSelector showAbsolute={false} showRelative={false} />,
  42. routerContext
  43. );
  44. await wrapper.find('HeaderItem').simulate('click');
  45. expect(wrapper.find('RelativeSelector SelectorItem')).toHaveLength(0);
  46. expect(wrapper.find('SelectorItem[value="absolute"]')).toHaveLength(0);
  47. });
  48. it('selects absolute item', async function () {
  49. wrapper = createWrapper();
  50. await wrapper.find('HeaderItem').simulate('click');
  51. expect(wrapper.find('[data-test-id="date-range"]')).toHaveLength(0);
  52. await wrapper.find('SelectorItem[value="absolute"]').simulate('click');
  53. const newProps = {
  54. relative: null,
  55. start: new Date('2017-10-03T02:41:20.000Z'),
  56. end: new Date('2017-10-17T02:41:20.000Z'),
  57. };
  58. expect(onChange).toHaveBeenLastCalledWith(newProps);
  59. wrapper.setProps(newProps);
  60. wrapper.update();
  61. expect(wrapper.find('[data-test-id="date-range"]')).toHaveLength(1);
  62. });
  63. it('selects absolute item with utc enabled', async function () {
  64. wrapper = createWrapper({utc: true});
  65. await wrapper.find('HeaderItem').simulate('click');
  66. expect(wrapper.find('[data-test-id="date-range"]')).toHaveLength(0);
  67. await wrapper.find('SelectorItem[value="absolute"]').simulate('click');
  68. const newProps = {
  69. relative: null,
  70. start: new Date('2017-10-02T22:41:20.000Z'),
  71. end: new Date('2017-10-16T22:41:20.000Z'),
  72. utc: true,
  73. };
  74. expect(onChange).toHaveBeenLastCalledWith(newProps);
  75. wrapper.setProps(newProps);
  76. wrapper.update();
  77. expect(wrapper.find('[data-test-id="date-range"]')).toHaveLength(1);
  78. });
  79. it('switches from relative to absolute while maintaining equivalent date range', async function () {
  80. wrapper = createWrapper({
  81. relative: '7d',
  82. utc: false,
  83. });
  84. await wrapper.find('HeaderItem').simulate('click');
  85. wrapper.find('SelectorItem[value="absolute"]').simulate('click');
  86. expect(onChange).toHaveBeenCalledWith({
  87. relative: null,
  88. start: new Date('2017-10-10T02:41:20.000Z'),
  89. end: new Date('2017-10-17T02:41:20.000Z'),
  90. utc: false,
  91. });
  92. wrapper.find('SelectorItem[value="14d"]').simulate('click');
  93. expect(onChange).toHaveBeenLastCalledWith({
  94. relative: '14d',
  95. start: undefined,
  96. end: undefined,
  97. });
  98. wrapper.setProps({relative: '14d', start: null, end: null});
  99. await wrapper.find('HeaderItem').simulate('click');
  100. wrapper.find('SelectorItem[value="absolute"]').simulate('click');
  101. expect(onChange).toHaveBeenLastCalledWith({
  102. relative: null,
  103. start: new Date('2017-10-03T02:41:20.000Z'),
  104. end: new Date('2017-10-17T02:41:20.000Z'),
  105. utc: false,
  106. });
  107. });
  108. it('switches from relative to absolute while maintaining equivalent date range (in utc)', async function () {
  109. wrapper = createWrapper({
  110. relative: '7d',
  111. utc: true,
  112. });
  113. await wrapper.find('HeaderItem').simulate('click');
  114. wrapper.find('SelectorItem[value="absolute"]').simulate('click');
  115. expect(onChange).toHaveBeenCalledWith({
  116. relative: null,
  117. start: new Date('2017-10-09T22:41:20.000Z'),
  118. end: new Date('2017-10-16T22:41:20.000Z'),
  119. utc: true,
  120. });
  121. wrapper.find('SelectorItem[value="14d"]').simulate('click');
  122. expect(onChange).toHaveBeenLastCalledWith({
  123. relative: '14d',
  124. start: undefined,
  125. end: undefined,
  126. });
  127. wrapper.setProps({relative: '14d', start: null, end: null});
  128. await wrapper.find('HeaderItem').simulate('click');
  129. wrapper.find('SelectorItem[value="absolute"]').simulate('click');
  130. expect(onChange).toHaveBeenLastCalledWith({
  131. relative: null,
  132. start: new Date('2017-10-02T22:41:20.000Z'),
  133. end: new Date('2017-10-16T22:41:20.000Z'),
  134. utc: true,
  135. });
  136. });
  137. it('switches from relative to absolute and then toggling UTC (starting with UTC)', async function () {
  138. wrapper = createWrapper({
  139. relative: '7d',
  140. utc: true,
  141. });
  142. await wrapper.find('HeaderItem').simulate('click');
  143. // Local time is 22:41:20-0500 -- this is what date picker should show
  144. wrapper.find('SelectorItem[value="absolute"]').simulate('click');
  145. expect(onChange).toHaveBeenCalledWith({
  146. relative: null,
  147. start: new Date('2017-10-09T22:41:20.000Z'),
  148. end: new Date('2017-10-16T22:41:20.000Z'),
  149. utc: true,
  150. });
  151. wrapper.find('UtcPicker Checkbox').simulate('change');
  152. expect(onChange).toHaveBeenLastCalledWith({
  153. relative: null,
  154. start: new Date('2017-10-09T22:41:20.000Z'),
  155. end: new Date('2017-10-16T22:41:20.000Z'),
  156. utc: false,
  157. });
  158. wrapper.find('UtcPicker Checkbox').simulate('change');
  159. expect(onChange).toHaveBeenLastCalledWith({
  160. relative: null,
  161. start: new Date('2017-10-10T02:41:20.000Z'),
  162. end: new Date('2017-10-17T02:41:20.000Z'),
  163. utc: true,
  164. });
  165. });
  166. it('switches from relative to absolute and then toggling UTC (starting with non-UTC)', async function () {
  167. wrapper = createWrapper({
  168. relative: '7d',
  169. utc: false,
  170. });
  171. await wrapper.find('HeaderItem').simulate('click');
  172. wrapper.find('SelectorItem[value="absolute"]').simulate('click');
  173. expect(onChange).toHaveBeenCalledWith({
  174. relative: null,
  175. start: new Date('2017-10-09T22:41:20.000-0400'),
  176. end: new Date('2017-10-16T22:41:20.000-0400'),
  177. utc: false,
  178. });
  179. wrapper.find('UtcPicker Checkbox').simulate('change');
  180. expect(onChange).toHaveBeenLastCalledWith({
  181. relative: null,
  182. start: new Date('2017-10-10T02:41:20.000Z'),
  183. end: new Date('2017-10-17T02:41:20.000Z'),
  184. utc: true,
  185. });
  186. wrapper.find('UtcPicker Checkbox').simulate('change');
  187. expect(onChange).toHaveBeenLastCalledWith({
  188. relative: null,
  189. start: new Date('2017-10-09T22:41:20.000Z'),
  190. end: new Date('2017-10-16T22:41:20.000Z'),
  191. utc: false,
  192. });
  193. });
  194. it('maintains time when switching UTC to local time', async function () {
  195. // Times should never change when changing UTC option
  196. // Instead, the utc flagged is used when querying to create proper date
  197. let state;
  198. wrapper = createWrapper({
  199. relative: null,
  200. start: new Date('2017-10-10T00:00:00.000Z'),
  201. end: new Date('2017-10-17T23:59:59.000Z'),
  202. utc: true,
  203. });
  204. wrapper.find('HeaderItem').simulate('click');
  205. // Local
  206. wrapper.find('UtcPicker Checkbox').simulate('change');
  207. state = {
  208. relative: null,
  209. start: new Date('2017-10-10T00:00:00.000Z'),
  210. end: new Date('2017-10-17T23:59:59.000Z'),
  211. utc: false,
  212. };
  213. expect(onChange).toHaveBeenLastCalledWith(state);
  214. wrapper.setProps(state);
  215. // UTC
  216. wrapper.find('UtcPicker Checkbox').simulate('change');
  217. state = {
  218. relative: null,
  219. start: new Date('2017-10-10T00:00:00.000Z'),
  220. end: new Date('2017-10-17T23:59:59.000Z'),
  221. utc: true,
  222. };
  223. expect(onChange).toHaveBeenLastCalledWith(state);
  224. wrapper.setProps(state);
  225. // Local
  226. wrapper.find('UtcPicker Checkbox').simulate('change');
  227. expect(onChange).toHaveBeenLastCalledWith({
  228. relative: null,
  229. start: new Date('2017-10-10T00:00:00.000Z'),
  230. end: new Date('2017-10-17T23:59:59.000Z'),
  231. utc: false,
  232. });
  233. });
  234. it('deselects default filter when absolute date selected', async function () {
  235. wrapper = createWrapper({
  236. relative: '14d',
  237. utc: false,
  238. });
  239. await wrapper.find('HeaderItem').simulate('click');
  240. await wrapper.find('SelectorItem[value="absolute"]').simulate('click');
  241. expect(wrapper.find('SelectorItem[value="absolute"]').prop('selected')).toBe(true);
  242. expect(wrapper.find('SelectorItem[value="14d"]').prop('selected')).toBe(false);
  243. });
  244. });