TimePicker.test.tsx 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. import React from 'react';
  2. import { shallow } from 'enzyme';
  3. import sinon from 'sinon';
  4. import * as dateMath from '@grafana/ui/src/utils/datemath';
  5. import * as rangeUtil from '@grafana/ui/src/utils/rangeutil';
  6. import TimePicker from './TimePicker';
  7. import { RawTimeRange, TimeRange, TIME_FORMAT } from '@grafana/ui';
  8. import { toUtc, isDateTime, dateTime } from '@grafana/ui/src/utils/moment_wrapper';
  9. const DEFAULT_RANGE = {
  10. from: 'now-6h',
  11. to: 'now',
  12. };
  13. const fromRaw = (rawRange: RawTimeRange): TimeRange => {
  14. const raw = {
  15. from: isDateTime(rawRange.from) ? dateTime(rawRange.from) : rawRange.from,
  16. to: isDateTime(rawRange.to) ? dateTime(rawRange.to) : rawRange.to,
  17. };
  18. return {
  19. from: dateMath.parse(raw.from, false),
  20. to: dateMath.parse(raw.to, true),
  21. raw: rawRange,
  22. };
  23. };
  24. describe('<TimePicker />', () => {
  25. it('render default values when closed and relative time range', () => {
  26. const range = fromRaw(DEFAULT_RANGE);
  27. const wrapper = shallow(<TimePicker range={range} />);
  28. expect(wrapper.state('fromRaw')).toBe(DEFAULT_RANGE.from);
  29. expect(wrapper.state('toRaw')).toBe(DEFAULT_RANGE.to);
  30. expect(wrapper.find('.timepicker-rangestring').text()).toBe('Last 6 hours');
  31. expect(wrapper.find('.gf-timepicker-dropdown').exists()).toBeFalsy();
  32. expect(wrapper.find('.gf-timepicker-utc').exists()).toBeFalsy();
  33. });
  34. it('render default values when closed, utc and relative time range', () => {
  35. const range = fromRaw(DEFAULT_RANGE);
  36. const wrapper = shallow(<TimePicker range={range} isUtc />);
  37. expect(wrapper.state('fromRaw')).toBe(DEFAULT_RANGE.from);
  38. expect(wrapper.state('toRaw')).toBe(DEFAULT_RANGE.to);
  39. expect(wrapper.find('.timepicker-rangestring').text()).toBe('Last 6 hours');
  40. expect(wrapper.find('.gf-timepicker-dropdown').exists()).toBeFalsy();
  41. expect(wrapper.find('.gf-timepicker-utc').exists()).toBeTruthy();
  42. });
  43. it('renders default values when open and relative range', () => {
  44. const range = fromRaw(DEFAULT_RANGE);
  45. const wrapper = shallow(<TimePicker range={range} isOpen />);
  46. expect(wrapper.state('fromRaw')).toBe(DEFAULT_RANGE.from);
  47. expect(wrapper.state('toRaw')).toBe(DEFAULT_RANGE.to);
  48. expect(wrapper.find('.timepicker-rangestring').text()).toBe('Last 6 hours');
  49. expect(wrapper.find('.gf-timepicker-dropdown').exists()).toBeTruthy();
  50. expect(wrapper.find('.gf-timepicker-utc').exists()).toBeFalsy();
  51. expect(wrapper.find('.timepicker-from').props().value).toBe(DEFAULT_RANGE.from);
  52. expect(wrapper.find('.timepicker-to').props().value).toBe(DEFAULT_RANGE.to);
  53. });
  54. it('renders default values when open, utc and relative range', () => {
  55. const range = fromRaw(DEFAULT_RANGE);
  56. const wrapper = shallow(<TimePicker range={range} isOpen isUtc />);
  57. expect(wrapper.state('fromRaw')).toBe(DEFAULT_RANGE.from);
  58. expect(wrapper.state('toRaw')).toBe(DEFAULT_RANGE.to);
  59. expect(wrapper.find('.timepicker-rangestring').text()).toBe('Last 6 hours');
  60. expect(wrapper.find('.gf-timepicker-dropdown').exists()).toBeTruthy();
  61. expect(wrapper.find('.gf-timepicker-utc').exists()).toBeTruthy();
  62. expect(wrapper.find('.timepicker-from').props().value).toBe(DEFAULT_RANGE.from);
  63. expect(wrapper.find('.timepicker-to').props().value).toBe(DEFAULT_RANGE.to);
  64. });
  65. it('apply with absolute range and non-utc', () => {
  66. const range = {
  67. from: toUtc(1),
  68. to: toUtc(1000),
  69. raw: {
  70. from: toUtc(1),
  71. to: toUtc(1000),
  72. },
  73. };
  74. const localRange = {
  75. from: dateTime(1),
  76. to: dateTime(1000),
  77. raw: {
  78. from: dateTime(1),
  79. to: dateTime(1000),
  80. },
  81. };
  82. const expectedRangeString = rangeUtil.describeTimeRange(localRange);
  83. const onChangeTime = sinon.spy();
  84. const wrapper = shallow(<TimePicker range={range} isOpen onChangeTime={onChangeTime} />);
  85. expect(wrapper.state('fromRaw')).toBe(localRange.from.format(TIME_FORMAT));
  86. expect(wrapper.state('toRaw')).toBe(localRange.to.format(TIME_FORMAT));
  87. expect(wrapper.state('initialRange')).toBe(range.raw);
  88. expect(wrapper.find('.timepicker-rangestring').text()).toBe(expectedRangeString);
  89. expect(wrapper.find('.timepicker-from').props().value).toBe(localRange.from.format(TIME_FORMAT));
  90. expect(wrapper.find('.timepicker-to').props().value).toBe(localRange.to.format(TIME_FORMAT));
  91. wrapper.find('button.gf-form-btn').simulate('click');
  92. expect(onChangeTime.calledOnce).toBeTruthy();
  93. expect(onChangeTime.getCall(0).args[0].from.valueOf()).toBe(0);
  94. expect(onChangeTime.getCall(0).args[0].to.valueOf()).toBe(1000);
  95. expect(wrapper.state('isOpen')).toBeFalsy();
  96. expect(wrapper.state('rangeString')).toBe(expectedRangeString);
  97. });
  98. it('apply with absolute range and utc', () => {
  99. const range = {
  100. from: toUtc(1),
  101. to: toUtc(1000),
  102. raw: {
  103. from: toUtc(1),
  104. to: toUtc(1000),
  105. },
  106. };
  107. const onChangeTime = sinon.spy();
  108. const wrapper = shallow(<TimePicker range={range} isUtc isOpen onChangeTime={onChangeTime} />);
  109. expect(wrapper.state('fromRaw')).toBe('1970-01-01 00:00:00');
  110. expect(wrapper.state('toRaw')).toBe('1970-01-01 00:00:01');
  111. expect(wrapper.state('initialRange')).toBe(range.raw);
  112. expect(wrapper.find('.timepicker-rangestring').text()).toBe('Jan 1, 1970 00:00:00 to Jan 1, 1970 00:00:01');
  113. expect(wrapper.find('.timepicker-from').props().value).toBe('1970-01-01 00:00:00');
  114. expect(wrapper.find('.timepicker-to').props().value).toBe('1970-01-01 00:00:01');
  115. wrapper.find('button.gf-form-btn').simulate('click');
  116. expect(onChangeTime.calledOnce).toBeTruthy();
  117. expect(onChangeTime.getCall(0).args[0].from.valueOf()).toBe(0);
  118. expect(onChangeTime.getCall(0).args[0].to.valueOf()).toBe(1000);
  119. expect(wrapper.state('isOpen')).toBeFalsy();
  120. expect(wrapper.state('rangeString')).toBe('Jan 1, 1970 00:00:00 to Jan 1, 1970 00:00:01');
  121. });
  122. it('moves ranges backward by half the range on left arrow click when utc', () => {
  123. const rawRange = {
  124. from: toUtc(2000),
  125. to: toUtc(4000),
  126. raw: {
  127. from: toUtc(2000),
  128. to: toUtc(4000),
  129. },
  130. };
  131. const range = fromRaw(rawRange);
  132. const onChangeTime = sinon.spy();
  133. const wrapper = shallow(<TimePicker range={range} isUtc isOpen onChangeTime={onChangeTime} />);
  134. expect(wrapper.state('fromRaw')).toBe('1970-01-01 00:00:02');
  135. expect(wrapper.state('toRaw')).toBe('1970-01-01 00:00:04');
  136. wrapper.find('.timepicker-left').simulate('click');
  137. expect(onChangeTime.calledOnce).toBeTruthy();
  138. expect(onChangeTime.getCall(0).args[0].from.valueOf()).toBe(1000);
  139. expect(onChangeTime.getCall(0).args[0].to.valueOf()).toBe(3000);
  140. });
  141. it('moves ranges backward by half the range on left arrow click when not utc', () => {
  142. const range = {
  143. from: toUtc(2000),
  144. to: toUtc(4000),
  145. raw: {
  146. from: toUtc(2000),
  147. to: toUtc(4000),
  148. },
  149. };
  150. const localRange = {
  151. from: dateTime(2000),
  152. to: dateTime(4000),
  153. raw: {
  154. from: dateTime(2000),
  155. to: dateTime(4000),
  156. },
  157. };
  158. const onChangeTime = sinon.spy();
  159. const wrapper = shallow(<TimePicker range={range} isUtc={false} isOpen onChangeTime={onChangeTime} />);
  160. expect(wrapper.state('fromRaw')).toBe(localRange.from.format(TIME_FORMAT));
  161. expect(wrapper.state('toRaw')).toBe(localRange.to.format(TIME_FORMAT));
  162. wrapper.find('.timepicker-left').simulate('click');
  163. expect(onChangeTime.calledOnce).toBeTruthy();
  164. expect(onChangeTime.getCall(0).args[0].from.valueOf()).toBe(1000);
  165. expect(onChangeTime.getCall(0).args[0].to.valueOf()).toBe(3000);
  166. });
  167. it('moves ranges forward by half the range on right arrow click when utc', () => {
  168. const range = {
  169. from: toUtc(1000),
  170. to: toUtc(3000),
  171. raw: {
  172. from: toUtc(1000),
  173. to: toUtc(3000),
  174. },
  175. };
  176. const onChangeTime = sinon.spy();
  177. const wrapper = shallow(<TimePicker range={range} isUtc isOpen onChangeTime={onChangeTime} />);
  178. expect(wrapper.state('fromRaw')).toBe('1970-01-01 00:00:01');
  179. expect(wrapper.state('toRaw')).toBe('1970-01-01 00:00:03');
  180. wrapper.find('.timepicker-right').simulate('click');
  181. expect(onChangeTime.calledOnce).toBeTruthy();
  182. expect(onChangeTime.getCall(0).args[0].from.valueOf()).toBe(2000);
  183. expect(onChangeTime.getCall(0).args[0].to.valueOf()).toBe(4000);
  184. });
  185. it('moves ranges forward by half the range on right arrow click when not utc', () => {
  186. const range = {
  187. from: toUtc(1000),
  188. to: toUtc(3000),
  189. raw: {
  190. from: toUtc(1000),
  191. to: toUtc(3000),
  192. },
  193. };
  194. const localRange = {
  195. from: dateTime(1000),
  196. to: dateTime(3000),
  197. raw: {
  198. from: dateTime(1000),
  199. to: dateTime(3000),
  200. },
  201. };
  202. const onChangeTime = sinon.spy();
  203. const wrapper = shallow(<TimePicker range={range} isOpen onChangeTime={onChangeTime} />);
  204. expect(wrapper.state('fromRaw')).toBe(localRange.from.format(TIME_FORMAT));
  205. expect(wrapper.state('toRaw')).toBe(localRange.to.format(TIME_FORMAT));
  206. wrapper.find('.timepicker-right').simulate('click');
  207. expect(onChangeTime.calledOnce).toBeTruthy();
  208. expect(onChangeTime.getCall(0).args[0].from.valueOf()).toBe(2000);
  209. expect(onChangeTime.getCall(0).args[0].to.valueOf()).toBe(4000);
  210. });
  211. });