forked from GithubBackups/healthchecks
croniter.is_valid() throws exceptions for some bad inputs, so must use try ... except
This commit is contained in:
parent
a402dce293
commit
25e48f1b9f
@ -16,7 +16,14 @@ class CronPreviewTestCase(BaseTestCase):
|
|||||||
self.assertContains(r, "cron-preview-title", status_code=200)
|
self.assertContains(r, "cron-preview-title", status_code=200)
|
||||||
|
|
||||||
def test_it_rejects_invalid_cron_expression(self):
|
def test_it_rejects_invalid_cron_expression(self):
|
||||||
for schedule in [None, "", "*", "100 100 100 100 100", "* * * * * *"]:
|
samples = [None,
|
||||||
|
"",
|
||||||
|
"*",
|
||||||
|
"100 100 100 100 100",
|
||||||
|
"* * * * * *",
|
||||||
|
"1,2 3,* * * *"]
|
||||||
|
|
||||||
|
for schedule in samples:
|
||||||
payload = {"schedule": schedule, "tz": "UTC"}
|
payload = {"schedule": schedule, "tz": "UTC"}
|
||||||
r = self.client.post("/checks/cron_preview/", payload)
|
r = self.client.post("/checks/cron_preview/", payload)
|
||||||
self.assertContains(r, "Invalid cron expression", status_code=200)
|
self.assertContains(r, "Invalid cron expression", status_code=200)
|
||||||
|
@ -67,16 +67,19 @@ class UpdateTimeoutTestCase(BaseTestCase):
|
|||||||
self.assertEqual(self.check.schedule, "5 * * * *")
|
self.assertEqual(self.check.schedule, "5 * * * *")
|
||||||
|
|
||||||
def test_it_validates_cron_expression(self):
|
def test_it_validates_cron_expression(self):
|
||||||
payload = {
|
|
||||||
"kind": "cron",
|
|
||||||
"schedule": "* invalid *",
|
|
||||||
"tz": "UTC",
|
|
||||||
"grace": 60
|
|
||||||
}
|
|
||||||
|
|
||||||
self.client.login(username="alice@example.org", password="password")
|
self.client.login(username="alice@example.org", password="password")
|
||||||
r = self.client.post(self.url, data=payload)
|
samples = ["* invalid *", "1,2 3,* * * *"]
|
||||||
self.assertEqual(r.status_code, 400)
|
|
||||||
|
for sample in samples:
|
||||||
|
payload = {
|
||||||
|
"kind": "cron",
|
||||||
|
"schedule": sample,
|
||||||
|
"tz": "UTC",
|
||||||
|
"grace": 60
|
||||||
|
}
|
||||||
|
|
||||||
|
r = self.client.post(self.url, data=payload)
|
||||||
|
self.assertEqual(r.status_code, 400)
|
||||||
|
|
||||||
# Check should still have its original data:
|
# Check should still have its original data:
|
||||||
self.check.refresh_from_db()
|
self.check.refresh_from_db()
|
||||||
|
@ -24,7 +24,9 @@ class CronExpressionValidator(object):
|
|||||||
if len(value.split()) != 5:
|
if len(value.split()) != 5:
|
||||||
raise ValidationError(message=self.message)
|
raise ValidationError(message=self.message)
|
||||||
|
|
||||||
if not croniter.is_valid(value):
|
try:
|
||||||
|
croniter(value)
|
||||||
|
except:
|
||||||
raise ValidationError(message=self.message)
|
raise ValidationError(message=self.message)
|
||||||
|
|
||||||
|
|
||||||
|
@ -325,20 +325,20 @@ def cron_preview(request):
|
|||||||
tz = request.POST.get("tz")
|
tz = request.POST.get("tz")
|
||||||
ctx = {"tz": tz, "dates": []}
|
ctx = {"tz": tz, "dates": []}
|
||||||
|
|
||||||
if len(schedule.split()) != 5:
|
try:
|
||||||
ctx["bad_schedule"] = True
|
zone = pytz.timezone(tz)
|
||||||
elif not croniter.is_valid(schedule):
|
now_local = timezone.localtime(timezone.now(), zone)
|
||||||
ctx["bad_schedule"] = True
|
|
||||||
|
|
||||||
if "bad_schedule" not in ctx:
|
if len(schedule.split()) != 5:
|
||||||
try:
|
raise ValueError()
|
||||||
zone = pytz.timezone(tz)
|
|
||||||
now_local = timezone.localtime(timezone.now(), zone)
|
it = croniter(schedule, now_local)
|
||||||
it = croniter(schedule, now_local)
|
for i in range(0, 6):
|
||||||
for i in range(0, 6):
|
ctx["dates"].append(it.get_next(datetime))
|
||||||
ctx["dates"].append(it.get_next(datetime))
|
except UnknownTimeZoneError:
|
||||||
except UnknownTimeZoneError:
|
ctx["bad_tz"] = True
|
||||||
ctx["bad_tz"] = True
|
except:
|
||||||
|
ctx["bad_schedule"] = True
|
||||||
|
|
||||||
return render(request, "front/cron_preview.html", ctx)
|
return render(request, "front/cron_preview.html", ctx)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user