2018-05-15 08:37:44 -05:00
|
|
|
import React from 'react';
|
|
|
|
import { shallow } from 'enzyme';
|
|
|
|
import sinon from 'sinon';
|
|
|
|
|
2019-05-06 05:36:42 -05:00
|
|
|
import * as dateMath from '@grafana/ui/src/utils/datemath';
|
|
|
|
import * as rangeUtil from '@grafana/ui/src/utils/rangeutil';
|
2019-04-29 11:28:41 -05:00
|
|
|
import TimePicker from './TimePicker';
|
|
|
|
import { RawTimeRange, TimeRange, TIME_FORMAT } from '@grafana/ui';
|
2019-05-08 06:51:44 -05:00
|
|
|
import { toUtc, isDateTime, dateTime } from '@grafana/ui/src/utils/moment_wrapper';
|
2019-04-29 11:28:41 -05:00
|
|
|
|
|
|
|
const DEFAULT_RANGE = {
|
|
|
|
from: 'now-6h',
|
|
|
|
to: 'now',
|
|
|
|
};
|
|
|
|
|
|
|
|
const fromRaw = (rawRange: RawTimeRange): TimeRange => {
|
|
|
|
const raw = {
|
2019-05-08 06:51:44 -05:00
|
|
|
from: isDateTime(rawRange.from) ? dateTime(rawRange.from) : rawRange.from,
|
|
|
|
to: isDateTime(rawRange.to) ? dateTime(rawRange.to) : rawRange.to,
|
2019-04-29 11:28:41 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
return {
|
|
|
|
from: dateMath.parse(raw.from, false),
|
|
|
|
to: dateMath.parse(raw.to, true),
|
|
|
|
raw: rawRange,
|
|
|
|
};
|
|
|
|
};
|
2018-05-15 08:37:44 -05:00
|
|
|
|
|
|
|
describe('<TimePicker />', () => {
|
2019-04-29 11:28:41 -05:00
|
|
|
it('render default values when closed and relative time range', () => {
|
|
|
|
const range = fromRaw(DEFAULT_RANGE);
|
2019-06-24 07:39:59 -05:00
|
|
|
const wrapper = shallow(<TimePicker range={range} timeZone="browser" />);
|
2019-04-29 11:28:41 -05:00
|
|
|
expect(wrapper.state('fromRaw')).toBe(DEFAULT_RANGE.from);
|
|
|
|
expect(wrapper.state('toRaw')).toBe(DEFAULT_RANGE.to);
|
|
|
|
expect(wrapper.find('.timepicker-rangestring').text()).toBe('Last 6 hours');
|
|
|
|
expect(wrapper.find('.gf-timepicker-dropdown').exists()).toBeFalsy();
|
|
|
|
expect(wrapper.find('.gf-timepicker-utc').exists()).toBeFalsy();
|
|
|
|
});
|
|
|
|
|
|
|
|
it('render default values when closed, utc and relative time range', () => {
|
|
|
|
const range = fromRaw(DEFAULT_RANGE);
|
2019-06-24 07:39:59 -05:00
|
|
|
const wrapper = shallow(<TimePicker range={range} timeZone="utc" />);
|
2019-04-29 11:28:41 -05:00
|
|
|
expect(wrapper.state('fromRaw')).toBe(DEFAULT_RANGE.from);
|
|
|
|
expect(wrapper.state('toRaw')).toBe(DEFAULT_RANGE.to);
|
|
|
|
expect(wrapper.find('.timepicker-rangestring').text()).toBe('Last 6 hours');
|
|
|
|
expect(wrapper.find('.gf-timepicker-dropdown').exists()).toBeFalsy();
|
|
|
|
expect(wrapper.find('.gf-timepicker-utc').exists()).toBeTruthy();
|
|
|
|
});
|
|
|
|
|
|
|
|
it('renders default values when open and relative range', () => {
|
|
|
|
const range = fromRaw(DEFAULT_RANGE);
|
2019-06-24 07:39:59 -05:00
|
|
|
const wrapper = shallow(<TimePicker range={range} isOpen timeZone="browser" />);
|
2019-04-29 11:28:41 -05:00
|
|
|
expect(wrapper.state('fromRaw')).toBe(DEFAULT_RANGE.from);
|
|
|
|
expect(wrapper.state('toRaw')).toBe(DEFAULT_RANGE.to);
|
|
|
|
expect(wrapper.find('.timepicker-rangestring').text()).toBe('Last 6 hours');
|
|
|
|
expect(wrapper.find('.gf-timepicker-dropdown').exists()).toBeTruthy();
|
|
|
|
expect(wrapper.find('.gf-timepicker-utc').exists()).toBeFalsy();
|
|
|
|
expect(wrapper.find('.timepicker-from').props().value).toBe(DEFAULT_RANGE.from);
|
|
|
|
expect(wrapper.find('.timepicker-to').props().value).toBe(DEFAULT_RANGE.to);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('renders default values when open, utc and relative range', () => {
|
|
|
|
const range = fromRaw(DEFAULT_RANGE);
|
2019-06-24 07:39:59 -05:00
|
|
|
const wrapper = shallow(<TimePicker range={range} isOpen timeZone="utc" />);
|
2019-04-29 11:28:41 -05:00
|
|
|
expect(wrapper.state('fromRaw')).toBe(DEFAULT_RANGE.from);
|
|
|
|
expect(wrapper.state('toRaw')).toBe(DEFAULT_RANGE.to);
|
|
|
|
expect(wrapper.find('.timepicker-rangestring').text()).toBe('Last 6 hours');
|
|
|
|
expect(wrapper.find('.gf-timepicker-dropdown').exists()).toBeTruthy();
|
|
|
|
expect(wrapper.find('.gf-timepicker-utc').exists()).toBeTruthy();
|
|
|
|
expect(wrapper.find('.timepicker-from').props().value).toBe(DEFAULT_RANGE.from);
|
|
|
|
expect(wrapper.find('.timepicker-to').props().value).toBe(DEFAULT_RANGE.to);
|
2018-05-15 08:37:44 -05:00
|
|
|
});
|
|
|
|
|
2019-04-29 11:28:41 -05:00
|
|
|
it('apply with absolute range and non-utc', () => {
|
2018-05-15 08:37:44 -05:00
|
|
|
const range = {
|
2019-05-08 06:51:44 -05:00
|
|
|
from: toUtc(1),
|
|
|
|
to: toUtc(1000),
|
2019-04-29 11:28:41 -05:00
|
|
|
raw: {
|
2019-05-08 06:51:44 -05:00
|
|
|
from: toUtc(1),
|
|
|
|
to: toUtc(1000),
|
2019-04-29 11:28:41 -05:00
|
|
|
},
|
2018-05-15 08:37:44 -05:00
|
|
|
};
|
2019-04-29 11:28:41 -05:00
|
|
|
const localRange = {
|
2019-05-08 06:51:44 -05:00
|
|
|
from: dateTime(1),
|
|
|
|
to: dateTime(1000),
|
2019-04-29 11:28:41 -05:00
|
|
|
raw: {
|
2019-05-08 06:51:44 -05:00
|
|
|
from: dateTime(1),
|
|
|
|
to: dateTime(1000),
|
2019-04-29 11:28:41 -05:00
|
|
|
},
|
|
|
|
};
|
|
|
|
const expectedRangeString = rangeUtil.describeTimeRange(localRange);
|
|
|
|
|
|
|
|
const onChangeTime = sinon.spy();
|
2019-06-24 07:39:59 -05:00
|
|
|
const wrapper = shallow(<TimePicker range={range} isOpen onChangeTime={onChangeTime} timeZone="browser" />);
|
2019-04-29 11:28:41 -05:00
|
|
|
expect(wrapper.state('fromRaw')).toBe(localRange.from.format(TIME_FORMAT));
|
|
|
|
expect(wrapper.state('toRaw')).toBe(localRange.to.format(TIME_FORMAT));
|
|
|
|
expect(wrapper.state('initialRange')).toBe(range.raw);
|
|
|
|
expect(wrapper.find('.timepicker-rangestring').text()).toBe(expectedRangeString);
|
|
|
|
expect(wrapper.find('.timepicker-from').props().value).toBe(localRange.from.format(TIME_FORMAT));
|
|
|
|
expect(wrapper.find('.timepicker-to').props().value).toBe(localRange.to.format(TIME_FORMAT));
|
|
|
|
|
|
|
|
wrapper.find('button.gf-form-btn').simulate('click');
|
|
|
|
expect(onChangeTime.calledOnce).toBeTruthy();
|
|
|
|
expect(onChangeTime.getCall(0).args[0].from.valueOf()).toBe(0);
|
|
|
|
expect(onChangeTime.getCall(0).args[0].to.valueOf()).toBe(1000);
|
|
|
|
|
|
|
|
expect(wrapper.state('isOpen')).toBeFalsy();
|
|
|
|
expect(wrapper.state('rangeString')).toBe(expectedRangeString);
|
2018-05-15 08:37:44 -05:00
|
|
|
});
|
|
|
|
|
2019-04-29 11:28:41 -05:00
|
|
|
it('apply with absolute range and utc', () => {
|
2018-05-15 08:37:44 -05:00
|
|
|
const range = {
|
2019-05-08 06:51:44 -05:00
|
|
|
from: toUtc(1),
|
|
|
|
to: toUtc(1000),
|
2019-04-29 11:28:41 -05:00
|
|
|
raw: {
|
2019-05-08 06:51:44 -05:00
|
|
|
from: toUtc(1),
|
|
|
|
to: toUtc(1000),
|
2019-04-29 11:28:41 -05:00
|
|
|
},
|
2018-05-15 08:37:44 -05:00
|
|
|
};
|
2019-04-29 11:28:41 -05:00
|
|
|
const onChangeTime = sinon.spy();
|
2019-06-24 07:39:59 -05:00
|
|
|
const wrapper = shallow(<TimePicker range={range} timeZone="utc" isOpen onChangeTime={onChangeTime} />);
|
2018-05-15 08:37:44 -05:00
|
|
|
expect(wrapper.state('fromRaw')).toBe('1970-01-01 00:00:00');
|
|
|
|
expect(wrapper.state('toRaw')).toBe('1970-01-01 00:00:01');
|
2019-04-29 11:28:41 -05:00
|
|
|
expect(wrapper.state('initialRange')).toBe(range.raw);
|
2019-06-24 07:39:59 -05:00
|
|
|
expect(wrapper.find('.timepicker-rangestring').text()).toBe('1970-01-01 00:00:00 to 1970-01-01 00:00:01');
|
2018-05-15 08:37:44 -05:00
|
|
|
expect(wrapper.find('.timepicker-from').props().value).toBe('1970-01-01 00:00:00');
|
|
|
|
expect(wrapper.find('.timepicker-to').props().value).toBe('1970-01-01 00:00:01');
|
2019-04-29 11:28:41 -05:00
|
|
|
|
|
|
|
wrapper.find('button.gf-form-btn').simulate('click');
|
|
|
|
expect(onChangeTime.calledOnce).toBeTruthy();
|
|
|
|
expect(onChangeTime.getCall(0).args[0].from.valueOf()).toBe(0);
|
|
|
|
expect(onChangeTime.getCall(0).args[0].to.valueOf()).toBe(1000);
|
|
|
|
|
|
|
|
expect(wrapper.state('isOpen')).toBeFalsy();
|
2019-06-24 07:39:59 -05:00
|
|
|
expect(wrapper.state('rangeString')).toBe('1970-01-01 00:00:00 to 1970-01-01 00:00:01');
|
2018-05-15 08:37:44 -05:00
|
|
|
});
|
|
|
|
|
2019-04-29 11:28:41 -05:00
|
|
|
it('moves ranges backward by half the range on left arrow click when utc', () => {
|
|
|
|
const rawRange = {
|
2019-05-08 06:51:44 -05:00
|
|
|
from: toUtc(2000),
|
|
|
|
to: toUtc(4000),
|
2019-04-29 11:28:41 -05:00
|
|
|
raw: {
|
2019-05-08 06:51:44 -05:00
|
|
|
from: toUtc(2000),
|
|
|
|
to: toUtc(4000),
|
2019-04-29 11:28:41 -05:00
|
|
|
},
|
2018-05-15 08:37:44 -05:00
|
|
|
};
|
2019-04-29 11:28:41 -05:00
|
|
|
const range = fromRaw(rawRange);
|
2018-05-15 08:37:44 -05:00
|
|
|
|
|
|
|
const onChangeTime = sinon.spy();
|
2019-06-24 07:39:59 -05:00
|
|
|
const wrapper = shallow(<TimePicker range={range} isOpen onChangeTime={onChangeTime} timeZone="utc" />);
|
2018-05-15 08:37:44 -05:00
|
|
|
expect(wrapper.state('fromRaw')).toBe('1970-01-01 00:00:02');
|
|
|
|
expect(wrapper.state('toRaw')).toBe('1970-01-01 00:00:04');
|
|
|
|
|
|
|
|
wrapper.find('.timepicker-left').simulate('click');
|
2019-04-29 11:28:41 -05:00
|
|
|
expect(onChangeTime.calledOnce).toBeTruthy();
|
|
|
|
expect(onChangeTime.getCall(0).args[0].from.valueOf()).toBe(1000);
|
|
|
|
expect(onChangeTime.getCall(0).args[0].to.valueOf()).toBe(3000);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('moves ranges backward by half the range on left arrow click when not utc', () => {
|
|
|
|
const range = {
|
2019-05-08 06:51:44 -05:00
|
|
|
from: toUtc(2000),
|
|
|
|
to: toUtc(4000),
|
2019-04-29 11:28:41 -05:00
|
|
|
raw: {
|
2019-05-08 06:51:44 -05:00
|
|
|
from: toUtc(2000),
|
|
|
|
to: toUtc(4000),
|
2019-04-29 11:28:41 -05:00
|
|
|
},
|
|
|
|
};
|
|
|
|
const localRange = {
|
2019-05-08 06:51:44 -05:00
|
|
|
from: dateTime(2000),
|
|
|
|
to: dateTime(4000),
|
2019-04-29 11:28:41 -05:00
|
|
|
raw: {
|
2019-05-08 06:51:44 -05:00
|
|
|
from: dateTime(2000),
|
|
|
|
to: dateTime(4000),
|
2019-04-29 11:28:41 -05:00
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
const onChangeTime = sinon.spy();
|
2019-06-24 07:39:59 -05:00
|
|
|
const wrapper = shallow(<TimePicker range={range} isOpen onChangeTime={onChangeTime} timeZone="browser" />);
|
2019-04-29 11:28:41 -05:00
|
|
|
expect(wrapper.state('fromRaw')).toBe(localRange.from.format(TIME_FORMAT));
|
|
|
|
expect(wrapper.state('toRaw')).toBe(localRange.to.format(TIME_FORMAT));
|
|
|
|
|
|
|
|
wrapper.find('.timepicker-left').simulate('click');
|
|
|
|
expect(onChangeTime.calledOnce).toBeTruthy();
|
|
|
|
expect(onChangeTime.getCall(0).args[0].from.valueOf()).toBe(1000);
|
|
|
|
expect(onChangeTime.getCall(0).args[0].to.valueOf()).toBe(3000);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('moves ranges forward by half the range on right arrow click when utc', () => {
|
|
|
|
const range = {
|
2019-05-08 06:51:44 -05:00
|
|
|
from: toUtc(1000),
|
|
|
|
to: toUtc(3000),
|
2019-04-29 11:28:41 -05:00
|
|
|
raw: {
|
2019-05-08 06:51:44 -05:00
|
|
|
from: toUtc(1000),
|
|
|
|
to: toUtc(3000),
|
2019-04-29 11:28:41 -05:00
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
const onChangeTime = sinon.spy();
|
2019-06-24 07:39:59 -05:00
|
|
|
const wrapper = shallow(<TimePicker range={range} isOpen onChangeTime={onChangeTime} timeZone="utc" />);
|
2018-05-15 08:37:44 -05:00
|
|
|
expect(wrapper.state('fromRaw')).toBe('1970-01-01 00:00:01');
|
|
|
|
expect(wrapper.state('toRaw')).toBe('1970-01-01 00:00:03');
|
|
|
|
|
|
|
|
wrapper.find('.timepicker-right').simulate('click');
|
2019-04-29 11:28:41 -05:00
|
|
|
expect(onChangeTime.calledOnce).toBeTruthy();
|
|
|
|
expect(onChangeTime.getCall(0).args[0].from.valueOf()).toBe(2000);
|
|
|
|
expect(onChangeTime.getCall(0).args[0].to.valueOf()).toBe(4000);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('moves ranges forward by half the range on right arrow click when not utc', () => {
|
|
|
|
const range = {
|
2019-05-08 06:51:44 -05:00
|
|
|
from: toUtc(1000),
|
|
|
|
to: toUtc(3000),
|
2019-04-29 11:28:41 -05:00
|
|
|
raw: {
|
2019-05-08 06:51:44 -05:00
|
|
|
from: toUtc(1000),
|
|
|
|
to: toUtc(3000),
|
2019-04-29 11:28:41 -05:00
|
|
|
},
|
|
|
|
};
|
|
|
|
const localRange = {
|
2019-05-08 06:51:44 -05:00
|
|
|
from: dateTime(1000),
|
|
|
|
to: dateTime(3000),
|
2019-04-29 11:28:41 -05:00
|
|
|
raw: {
|
2019-05-08 06:51:44 -05:00
|
|
|
from: dateTime(1000),
|
|
|
|
to: dateTime(3000),
|
2019-04-29 11:28:41 -05:00
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
const onChangeTime = sinon.spy();
|
2019-06-24 07:39:59 -05:00
|
|
|
const wrapper = shallow(<TimePicker range={range} isOpen onChangeTime={onChangeTime} timeZone="browser" />);
|
2019-04-29 11:28:41 -05:00
|
|
|
expect(wrapper.state('fromRaw')).toBe(localRange.from.format(TIME_FORMAT));
|
|
|
|
expect(wrapper.state('toRaw')).toBe(localRange.to.format(TIME_FORMAT));
|
|
|
|
|
|
|
|
wrapper.find('.timepicker-right').simulate('click');
|
|
|
|
expect(onChangeTime.calledOnce).toBeTruthy();
|
|
|
|
expect(onChangeTime.getCall(0).args[0].from.valueOf()).toBe(2000);
|
|
|
|
expect(onChangeTime.getCall(0).args[0].to.valueOf()).toBe(4000);
|
2018-05-15 08:37:44 -05:00
|
|
|
});
|
|
|
|
});
|