Если я правильно понимаю:
1 / время начала должно быть не менее 5:00 (AM)
2 / время окончания до 5:00 (AM) означает «следующий» "день
Так что
1 / время начала до 5 неверно (просто)
2 / если у вас время окончания до 5:00, это" следующий " день "(простой)
3 / если это после 5:00 (включительно), но до времени начала, это неправильно (просто)
4 / если это после времени запуска, предполагается, что быть в тот же день.
IOW, это должно дать ожидаемые результаты:
# mock Django's ValidationError
class ValidationError(Exception):
pass
def check(start, end):
# start: datetime
# end: datetime
if start.hour < 5:
raise ValidationError("start time must be >= 5:00 AM")
if end.hour < 5:
# end hour < 5 means 'next day'
end = end + timedelta(days=1)
elif end.hour < start.hour:
# unless it's between 0 and 4, end hour must be greater
# than start hour
raise ValidationError("end time must be either <= 4:59 or greater than start time")
return start, end
# and the tests:
def test_ok():
start = datetime(2020, 4, 29, 5, 0)
end = datetime(2020, 4, 29, 7, 0)
try:
new_start, new_end = check(start, end)
except ValidationError as e:
assert False, "should not have raised {}".format(e)
assert new_start == start, "s should equal start"
assert new_end == end, "e should equal end"
def test_start_before_5():
start = datetime(2020, 4, 29, 4, 50)
end = datetime(2020, 4, 29, 7, 0)
try:
check(start, end)
except ValidationError as e:
assert e.args[0] == "start time must be >= 5:00 AM"
else:
assert False, "should have raised a validation error for start < 5"
def test_end_before_5():
start = datetime(2020, 4, 29, 8)
end = datetime(2020, 4, 29, 4, 59)
try:
start, end = check(start, end)
except ValidationError as e:
assert False, "should not have raised {}".format(e)
else:
endt = (end.year, end.month, end.day, end.hour, end.minute)
expected = (2020, 4, 30, 4, 59)
assert endt == expected, "should have set end date on next day"
def test_end_after_5_but_before_start():
start = datetime(2020, 4, 29, 8)
end = datetime(2020, 4, 29, 6)
try:
check(start, end)
except ValidationError as e:
assert e.args[0] == "end time must be either <= 4:59 or greater than start time"
else:
assert False, "should have raised a ValidationError"
if __name__ == "__main__":
test_ok()
test_start_before_5()
test_end_before_5()
test_end_after_5_but_before_start()
В качестве примечания я настоятельно рекомендую вам использовать Django Form
(или ModelForm
если необходимо) для проверки ваших пользовательских данных.