def test_DailyEveryDayOnThatDay(self): ri = RepetitionIntervalClass("DAILY:03:15:+++++++:Europe/London") self.checkNextRun( ri, pytz.timezone('UTC').localize( datetime.datetime(2018, 10, 29, 0, 30, 0, 0)), pytz.timezone('Europe/London').localize( datetime.datetime(2018, 10, 29, 15, 3, 0, 0))) #6 may 2018 is a sunday. Check at 4 o'clock for next 3 weeks we have correct next runs (always the next day) # 3 weeks won't go over month boundary days_of_week = ['Mon', 'Tue', 'Wed', 'Thur', 'Fri', 'Sat', 'Sun'] cur_day_of_week = 6 for DayOfMonthBeforeRunIsDue in range(6, 6 + (3 * 7)): #cur_day_of_week = cur_day_of_week+1 if cur_day_of_week > 6: cur_day_of_week = 0 print(DayOfMonthBeforeRunIsDue) self.checkNextRun( ri, pytz.timezone('UTC').localize( datetime.datetime(2018, 5, DayOfMonthBeforeRunIsDue, 16, 30, 0, 0)), pytz.timezone('Europe/London').localize( datetime.datetime(2018, 5, (DayOfMonthBeforeRunIsDue + 1), 15, 3, 0, 0)), 'Test was for ' + days_of_week[cur_day_of_week]) self.assertEqual(ri.__str__(), 'DAILY:03:15:+++++++:Europe/London')
def test_MonthlyDayBefore(self): ri = RepetitionIntervalClass("MONTHLY:03:15:11:Europe/London") self.checkNextRun(ri, pytz.timezone('UTC').localize(datetime.datetime(2018,10,10,16,30,0,0)), pytz.timezone('Europe/London').localize(datetime.datetime(2018,10,11,15,3,0,0)) ) self.assertEqual(ri.__str__(),'MONTHLY:03:15:11:Europe/London')
def test_monthlyFourTimesPerMonthWrongOrder(self): ri = RepetitionIntervalClass( "MONTHLY:02:15:3,10,000005,15:Europe/London") self.checkNextRun( ri, pytz.timezone('UTC').localize( datetime.datetime(2016, 1, 1, 13, 0, 1, 0)), pytz.timezone('UTC').localize( datetime.datetime(2016, 1, 3, 15, 2, 0, 0))) self.checkNextRun( ri, pytz.timezone('UTC').localize( datetime.datetime(2016, 1, 3, 17, 0, 1, 0)), pytz.timezone('UTC').localize( datetime.datetime(2016, 1, 5, 15, 2, 0, 0))) self.checkNextRun( ri, pytz.timezone('UTC').localize( datetime.datetime(2016, 1, 5, 17, 0, 1, 0)), pytz.timezone('UTC').localize( datetime.datetime(2016, 1, 10, 15, 2, 0, 0))) self.checkNextRun( ri, pytz.timezone('UTC').localize( datetime.datetime(2016, 1, 10, 17, 0, 1, 0)), pytz.timezone('UTC').localize( datetime.datetime(2016, 1, 15, 15, 2, 0, 0))) self.checkNextRun( ri, pytz.timezone('UTC').localize( datetime.datetime(2016, 1, 15, 17, 0, 1, 0)), pytz.timezone('UTC').localize( datetime.datetime(2016, 2, 3, 15, 2, 0, 0))) self.assertEqual(ri.__str__(), 'MONTHLY:02:15:03,05,10,15:Europe/London')
def test_hourlyFourTimesPerHourWrongOrder(self): ri = RepetitionIntervalClass("HOURLY:0,30,15,45") self.checkNextRun( ri, pytz.timezone('UTC').localize( datetime.datetime(2016, 1, 14, 13, 0, 1, 0)), pytz.timezone('UTC').localize( datetime.datetime(2016, 1, 14, 13, 15, 0, 0))) self.checkNextRun( ri, pytz.timezone('UTC').localize( datetime.datetime(2016, 1, 14, 13, 16, 1, 0)), pytz.timezone('UTC').localize( datetime.datetime(2016, 1, 14, 13, 30, 0, 0))) self.checkNextRun( ri, pytz.timezone('UTC').localize( datetime.datetime(2016, 1, 14, 13, 31, 1, 0)), pytz.timezone('UTC').localize( datetime.datetime(2016, 1, 14, 13, 45, 0, 0))) self.checkNextRun( ri, pytz.timezone('UTC').localize( datetime.datetime(2016, 1, 14, 13, 46, 1, 0)), pytz.timezone('UTC').localize( datetime.datetime(2016, 1, 14, 14, 0, 0, 0))) self.assertEqual(ri.__str__(), 'HOURLY:00,15,30,45')
def test_hourlyDoubleZeroMinute(self): ri = RepetitionIntervalClass("HOURLY:00") self.checkNextRun(ri, pytz.timezone('UTC').localize(datetime.datetime(2016,1,14,23,3,1,0)), pytz.timezone('UTC').localize(datetime.datetime(2016,1,15,00,0,0,0)) ) self.assertEqual(ri.__str__(),'HOURLY:00')
def test_PassedInDatetimeMustBeUTC(self): ri = RepetitionIntervalClass("SETHOUR:03:1,2,3:UTC") with self.assertRaises(Exception) as context: nextRun = ri.getNextOccuranceDatetime( datetime.datetime(2016, 1, 5, 14, 2, 59, 0, pytz.timezone('Europe/London'))) self.checkGotRightException(context, curDateTimeTimezoneNotUTCException)
def test_nextdateHourlyModeJustBeforeMinute(self): ri = RepetitionIntervalClass("HOURLY:03") self.checkNextRun( ri, pytz.timezone('UTC').localize(datetime.datetime(2016,1,5,14,2,59,0)), pytz.timezone('Europe/London').localize(datetime.datetime(2016,1,5,14,3,0,0)) ) self.assertEqual(ri.__str__(),'HOURLY:03')
def setNextScheduledRun(self, curTime): ri = None if self.enabled == False: self.nextScheduledRun = None else: if (self.repetitionInterval != None): if (self.repetitionInterval != ''): ri = RepetitionIntervalClass(self.repetitionInterval) self.nextScheduledRun = ri.getNextOccuranceDatetime(curTime).isoformat()
def test_HourlyWithMutipleCommasWillError(self): with self.assertRaises(Exception) as context: ri = RepetitionIntervalClass("HOURLY:0,15,,30,45") self.checkGotRightException(context, badParamater) with self.assertRaises(Exception) as context2: ri = RepetitionIntervalClass("HOURLY:,,") self.checkGotRightException(context2, badParamater) with self.assertRaises(Exception) as context3: ri = RepetitionIntervalClass("HOURLY:,0,15,30,45") self.checkGotRightException(context3, badParamater) with self.assertRaises(Exception) as context4: ri = RepetitionIntervalClass("HOURLY:0,15,30,45,") self.checkGotRightException(context4, badParamater)
def test_InitValueCheck(self): ri = RepetitionIntervalClass("SETHOUR:03:1,2,3:UTC") self.assertEqual(ri.mode, ModeType.SETHOUR) self.assertEqual(ri.minute, 3) self.assertEqual(ri.sethourModeHours, SortedDict({1: 1, 2: 2, 3: 3})) self.assertEqual(ri.timezone, pytz.timezone("UTC")) self.assertEqual(str(ri), "SETHOUR:03:01,02,03:UTC")
def test_RepeatedHoursRemoved(self): ri = RepetitionIntervalClass("SETHOUR:03:1,5,3,1,1,1,3,5:UTC") self.assertEqual(ri.mode, ModeType.SETHOUR) self.assertEqual(ri.minute, 3) self.assertEqual(ri.sethourModeHours, SortedDict({1: 1, 3: 3, 5: 5})) self.assertEqual(ri.timezone, pytz.timezone("UTC")) self.assertEqual(str(ri), "SETHOUR:03:01,03,05:UTC")
def test_nextdateHourlyModeLastMinuteDayBefore(self): ri = RepetitionIntervalClass("HOURLY:03") self.checkNextRun(ri, curTime=pytz.timezone('UTC').localize( datetime.datetime(2016, 1, 14, 23, 3, 1, 0)), expTime=pytz.timezone('Europe/London').localize( datetime.datetime(2016, 1, 15, 00, 3, 0, 0)))
def test_HourlyBeforeDSTJumpBack(self): #29 oct 2018 2am becomes 1am # there won't be a 1:03 so it should jump to 2:03` ri = RepetitionIntervalClass("HOURLY:03") # the time 1:03 can't be represented in Europe/London as it has two UTC values # so the test specifies a UTC time self.checkNextRun(ri,pytz.timezone('UTC').localize(datetime.datetime(2018,10,29,0,30,0,0)),pytz.timezone('UTC').localize(datetime.datetime(2018,10,29,1,3,0,0)))
def test_MonthlyDayBeforeBST(self): ri = RepetitionIntervalClass("MONTHLY:03:15:11:Europe/London") # Next run Expected result is in Europe/London self.checkNextRun( ri, pytz.timezone('UTC').localize(datetime.datetime(2018,3,27,16,30,0,0)), pytz.timezone('Europe/London').localize(datetime.datetime(2018,4,11,15,3,0,0)) )
def test_MonthlyOnDayTimeBefore(self): ri = RepetitionIntervalClass("MONTHLY:03:15:11:Europe/London") self.checkNextRun( ri, pytz.timezone('UTC').localize( datetime.datetime(2018, 10, 11, 10, 30, 0, 0)), pytz.timezone('Europe/London').localize( datetime.datetime(2018, 10, 11, 15, 3, 0, 0)))
def test_DailyEveryDayOnFri(self): ri = RepetitionIntervalClass("DAILY:03:15:----+--:Europe/London") self.checkNextRun( ri, pytz.timezone('UTC').localize( datetime.datetime(2018, 10, 29, 16, 30, 0, 0)), pytz.timezone('Europe/London').localize( datetime.datetime(2018, 11, 2, 15, 3, 0, 0)))
def test_HourlyBeforeDSTJumpForward(self): #25 mar 2018 1am becomes 2am # there won't be a 1:03 so it should jump to 2:03 ri = RepetitionIntervalClass("HOURLY:03") self.checkNextRun(ri, pytz.timezone('UTC').localize(datetime.datetime(2018,3,25,0,30,0,0)), pytz.timezone('Europe/London').localize(datetime.datetime(2018,3,25,2,3,0,0)) )
def test_twoHourInterval_middletime_shouldPushForwardToNextHour(self): ri = RepetitionIntervalClass("SETHOUR:03:15,18:UTC") self.checkNextRun( ri, pytz.timezone('UTC').localize( datetime.datetime(2016, 1, 14, 16, 3, 0, 0)), pytz.timezone('Europe/London').localize( datetime.datetime(2016, 1, 14, 18, 3, 0, 0)))
def test_MonthlyYearRollover(self): ri = RepetitionIntervalClass("MONTHLY:03:15:11:Europe/London") self.checkNextRun( ri, pytz.timezone('UTC').localize( datetime.datetime(2018, 12, 12, 16, 30, 0, 0)), pytz.timezone('Europe/London').localize( datetime.datetime(2019, 1, 11, 15, 3, 0, 0)))
def test_nextdateHourlyModeJustAfterMinute(self): ri = RepetitionIntervalClass("HOURLY:03") self.checkNextRun( ri, pytz.timezone('UTC').localize( datetime.datetime(2016, 1, 14, 14, 3, 1, 0)), pytz.timezone('Europe/London').localize( datetime.datetime(2016, 1, 14, 15, 3, 0, 0)))
def test_twoHourInterval_startingbeforehour_shouldPushForwardSameDay(self): ri = RepetitionIntervalClass("SETHOUR:03:15,18:UTC") self.checkNextRun( ri, pytz.timezone('UTC').localize( datetime.datetime(2016, 1, 14, 14, 3, 0, 0)), pytz.timezone('Europe/London').localize( datetime.datetime(2016, 1, 14, 15, 3, 0, 0)))
def assertValidRepetitionInterval(ri, enabled): if ri is None: ri = '' if ri == '': if enabled: raise BadRequest('Repetition interval not set but enabled is true') return None try: return RepetitionIntervalClass(ri) except: raise BadRequest('Invalid Repetition Interval')
def test_initDaily(self): a = RepetitionIntervalClass("DAILY:1:11:+++++--:UTC")
def test_initDailyWithInvalidTimezone(self): with self.assertRaises(Exception) as context: a = RepetitionIntervalClass("DAILY:1:11:+++++--:dfsf") self.checkGotRightException(context, unknownTimezone)
def test_PassedInDatetimeMustHaveTimezoneType(self): with self.assertRaises(Exception) as context: ri = RepetitionIntervalClass("SETHOUR:03:1:") self.checkGotRightException(context, unknownTimezone)
def test_PassedInDatetimeMustHaveHours(self): with self.assertRaises(Exception) as context: ri = RepetitionIntervalClass("SETHOUR:03::UTC") self.checkGotRightException(context, badParamater)
def test_WrongNumberOfParams(self): with self.assertRaises(Exception) as context: ri = RepetitionIntervalClass("SETHOUR:03:1,2,3:UTC:A:B:C") self.checkGotRightException(context, badNumberOfModeParamaters)
def test_initDailyWithNoDaysErrors(self): with self.assertRaises(Exception) as context: a = RepetitionIntervalClass("DAILY:1:11:-------:UTC") self.checkGotRightException(context, badParamater)
def test_initDailyWithNoneTimezoneErrors(self): with self.assertRaises(Exception) as context: a = RepetitionIntervalClass("DAILY:1:11:+++++++:None") self.checkGotRightException(context, unknownTimezone)
def test_initDailyWithInvalidChar(self): with self.assertRaises(Exception) as context: a = RepetitionIntervalClass("DAILY:1:11:+++++XX:UTC") self.checkGotRightException(context, badParamater)