def test_slice_without_start(): dr = DateRange(start=datetime(2016, 1, 1), stop=datetime(2016, 2, 1), step=timedelta(days=1))[:10] expected = DateRange(start=datetime(2016, 1, 1), stop=datetime(2016, 1, 11), step=timedelta(days=1)) assert dr == expected
def test_full_slice(): dr = DateRange(start=datetime(2016, 1, 1), stop=datetime(2016, 2, 1), step=timedelta(days=1))[1:-1:2] expected = DateRange(start=datetime(2016, 1, 2), stop=datetime(2016, 1, 31), step=timedelta(days=2)) assert dr == expected
def test_raises_if_out_of_range(): dr = DateRange(start=datetime(2016, 1, 1), stop=datetime(2016, 1, 11), step=timedelta(days=1)) with pytest.raises(IndexError): dr[11]
def test_get_next_valid_thursday(self): skipranges = [ DateRange(start=date(2019, 1, 1), stop=date(2019, 2, 1), step=timedelta(days=1)), DateRange(start=date(2019, 2, 1), stop=date(2019, 3, 1), step=timedelta(days=1)), DateRange(start=date(2019, 6, 21), stop=date(2019, 6, 22), step=timedelta(days=1)) ] expected = date(2019, 3, 7) # start from 1.1 skipranges should push this to first thursday of march self.assertEqual(expected, get_next_valid_thursday(date(2019, 1, 1), skipranges))
def test_negative_index_out_of_range(): dr = DateRange(start=datetime(2016, 1, 1), stop=datetime(2016, 2, 1), step=timedelta(days=1)) with pytest.raises(IndexError): dr[-32]
def test_reverses_properly(): dr = DateRange(start=datetime(2016, 1, 1), stop=datetime(2016, 1, 1, 23), step=timedelta(minutes=60)) assert list( reversed(dr)) == [datetime(2016, 1, 1, x) for x in range(23, 0, -1)]
def test_valid_date(self): # january and february as two different ranges (plus one for the end dates) # and one single day (midsummer) skipranges = [ DateRange(start=date(2019, 1, 1), stop=date(2019, 2, 1), step=timedelta(days=1)), DateRange(start=date(2019, 2, 1), stop=date(2019, 3, 1), step=timedelta(days=1)), DateRange(start=date(2019, 6, 21), stop=date(2019, 6, 22), step=timedelta(days=1)) ] # before our ranges self.assertTrue(valid_date(date(2018, 12, 31), skipranges)) # just on the range start, middle and ends self.assertFalse(valid_date(date(2019, 1, 1), skipranges)) self.assertFalse(valid_date(date(2019, 1, 12), skipranges)) self.assertFalse(valid_date(date(2019, 1, 31), skipranges)) # second range self.assertFalse(valid_date(date(2019, 2, 1), skipranges)) self.assertFalse(valid_date(date(2019, 2, 12), skipranges)) self.assertFalse(valid_date(date(2019, 2, 28), skipranges)) # just after the ranges self.assertTrue(valid_date(date(2019, 3, 1), skipranges)) # random day not in ranges self.assertTrue(valid_date(date(2019, 5, 6), skipranges)) # single day, just before, at the day and after self.assertTrue(valid_date(date(2019, 6, 20), skipranges)) self.assertFalse(valid_date(date(2019, 6, 21), skipranges)) self.assertTrue(valid_date(date(2019, 6, 22), skipranges))
def parse_skiprange(s): try: start, end = s.split('-') except ValueError: # handle one day as a range of one day start = s end = s try: startdate = dateutil.parser.parse(start) # important to add one day to end date, the check is still time specific and this way # we will check from 2019-01-01 00:00 to 2019-01-02 00:00 enddate = dateutil.parser.parse(end) + dt.timedelta(days=1) return DateRange(start=startdate, stop=enddate, step=dt.timedelta(hours=1)) except ValueError: msg = "Not a valid date range: '{0}'.".format(s) raise argparse.ArgumentTypeError(msg)
def test_does_not_contain_end(): dr = DateRange(date(2016, 1, 1), date(2016, 1, 31), timedelta(days=2)) assert date(2016, 1, 31) not in dr assert date(2016, 1, 31) == dr.stop
def test_properly_reports_a_contained_date(when): dr = DateRange(start=date(2016, 1, 1), stop=date(2016, 1, 31), step=timedelta(days=2)) assert when in dr
def test_raises_error_if_infinite_length(): dr = DateRange(start=date(2016, 1, 1), step=timedelta(days=1)) with pytest.raises(TypeError): len(dr)
def test_indexes_properly(idx, expected): dr = DateRange(start=datetime(2016, 1, 1), step=timedelta(days=2)) assert dr[idx] == expected
def test_iterates_properly(): dr = DateRange(start=date(2016, 1, 1), stop=date(2016, 1, 31), step=timedelta(days=1)) assert list(dr) == [date(2016, 1, x) for x in range(1, 31)]
def test_reports_does_not_contain_greater_than_start_with_neg_step(): dr = DateRange(start=datetime(2016, 1, 23), step=timedelta(days=-1)) assert datetime(2016, 1, 31) not in dr
def test_reports_contains_a_precise_datetime(): dr = DateRange(start=datetime(2000, 4, 25, 18, 30), step=timedelta(minutes=57)) assert datetime(2000, 4, 29, 7, 3) in dr
def test_empty_slice_is_a_copy(): dr = DateRange(start=datetime(2016, 1, 1), step=timedelta(days=1)) copy = dr[:] assert dr == copy assert dr is not copy
def test_raises_with_infinite_range_and_neg_step(): dr = DateRange(start=datetime(2016, 1, 1), step=timedelta(days=-1)) with pytest.raises(IndexError): dr[-1]
def test_complains_if_step_is_zero(): with pytest.raises(TypeError): DateRange(start=date(2016, 1, 1), step=timedelta(0))
def test_equals_other_daterange(): dr = DateRange(datetime(2016, 1, 23), step=timedelta(1)) other_dr = DateRange(datetime(2016, 1, 23), step=timedelta(1)) assert dr == other_dr
def test_not_equal_other_daterange(): dr = DateRange(datetime(2016, 1, 23), step=timedelta(days=10)) other_dr = DateRange(datetime(2016, 1, 23), step=timedelta(days=1)) assert dr != other_dr
def test_negative_index(): dr = DateRange(start=datetime(2016, 1, 1), stop=datetime(2016, 2, 1), step=timedelta(days=1)) assert dr[-1] == datetime(2016, 1, 31)
def test_complains_if_start_not_provided(): with pytest.raises(TypeError): DateRange(start=None, stop=datetime(2016, 1, 1), step=timedelta(days=1))
def test_properly_reports_a_contained_datetime(when): dr = DateRange(start=datetime(2016, 1, 1, 0, 0, 0), stop=datetime(2016, 1, 1, 23, 0, 0), step=timedelta(minutes=60)) assert when in dr
def test_empty_if_start_is_higher_than_stop_without_negative_step(): assert [] == list( DateRange(start=date(2016, 1, 31), stop=date(2016, 1, 1), step=timedelta(days=1)))
def test_reports_contains_a_datetime_with_stop_and_neg_step(): dr = DateRange(start=datetime(2016, 1, 23), stop=datetime(2016, 1, 1), step=timedelta(days=-1)) assert datetime(2016, 1, 20) in dr
def test_cant_reverse_infinite_range(): with pytest.raises(ValueError): reversed(DateRange(datetime(2016, 1, 1), step=timedelta(days=1)))
def test_reports_contains_with_negative_step(when): dr = DateRange(start=datetime(2000, 1, 1, 23), stop=datetime(2000, 1, 1), step=timedelta(minutes=-60)) assert when in dr
def test_properly_calculates_length(): dr = DateRange(start=date(2016, 1, 1), stop=date(2016, 1, 6), step=timedelta(days=1)) assert len(dr) == 5
def test_fails_to_negative_slice_infinite_range(s): dr = DateRange(start=datetime(2016, 1, 1), step=timedelta(days=-1)) with pytest.raises(IndexError): dr[s]
def test_raises_with_bad_subscription(idx): dr = DateRange(datetime(2016, 1, 23), step=timedelta(days=1)) with pytest.raises(TypeError): dr[idx]