Browse Source

Fix the pause action to clear Profile.next_nag_date if all checks up

pull/504/head
Pēteris Caune 4 years ago
parent
commit
05db43f95d
No known key found for this signature in database GPG Key ID: E28D7679E9A9EDE2
5 changed files with 51 additions and 21 deletions
  1. +1
    -0
      CHANGELOG.md
  2. +30
    -21
      hc/api/tests/test_pause.py
  3. +5
    -0
      hc/api/views.py
  4. +11
    -0
      hc/front/tests/test_pause.py
  5. +4
    -0
      hc/front/views.py

+ 1
- 0
CHANGELOG.md View File

@ -15,6 +15,7 @@ All notable changes to this project will be documented in this file.
- Fix downtime summary to handle months when the check didn't exist yet (#472) - Fix downtime summary to handle months when the check didn't exist yet (#472)
- Relax cron expression validation: accept all expressions that croniter accepts - Relax cron expression validation: accept all expressions that croniter accepts
- Fix sendalerts to clear Profile.next_nag_date if all checks up - Fix sendalerts to clear Profile.next_nag_date if all checks up
- Fix the pause action to clear Profile.next_nag_date if all checks up
## v1.19.0 - 2021-02-03 ## v1.19.0 - 2021-02-03


+ 30
- 21
hc/api/tests/test_pause.py View File

@ -6,31 +6,30 @@ from hc.test import BaseTestCase
class PauseTestCase(BaseTestCase): class PauseTestCase(BaseTestCase):
def test_it_works(self):
check = Check.objects.create(project=self.project, status="up")
def setUp(self):
super().setUp()
url = "/api/v1/checks/%s/pause" % check.code
self.check = Check.objects.create(project=self.project, status="up")
self.url = f"/api/v1/checks/{self.check.code}/pause"
def test_it_works(self):
r = self.client.post( r = self.client.post(
url, "", content_type="application/json", HTTP_X_API_KEY="X" * 32
self.url, "", content_type="application/json", HTTP_X_API_KEY="X" * 32
) )
self.assertEqual(r.status_code, 200) self.assertEqual(r.status_code, 200)
self.assertEqual(r["Access-Control-Allow-Origin"], "*") self.assertEqual(r["Access-Control-Allow-Origin"], "*")
check.refresh_from_db()
self.assertEqual(check.status, "paused")
self.check.refresh_from_db()
self.assertEqual(self.check.status, "paused")
def test_it_handles_options(self): def test_it_handles_options(self):
check = Check.objects.create(project=self.project, status="up")
r = self.client.options("/api/v1/checks/%s/pause" % check.code)
r = self.client.options(self.url)
self.assertEqual(r.status_code, 204) self.assertEqual(r.status_code, 204)
self.assertIn("POST", r["Access-Control-Allow-Methods"]) self.assertIn("POST", r["Access-Control-Allow-Methods"])
def test_it_only_allows_post(self): def test_it_only_allows_post(self):
url = "/api/v1/checks/1659718b-21ad-4ed1-8740-43afc6c41524/pause"
r = self.client.get(url, HTTP_X_API_KEY="X" * 32)
r = self.client.get(self.url, HTTP_X_API_KEY="X" * 32)
self.assertEqual(r.status_code, 405) self.assertEqual(r.status_code, 405)
def test_it_validates_ownership(self): def test_it_validates_ownership(self):
@ -60,19 +59,29 @@ class PauseTestCase(BaseTestCase):
self.assertEqual(r.status_code, 404) self.assertEqual(r.status_code, 404)
def test_it_clears_last_start_alert_after(self): def test_it_clears_last_start_alert_after(self):
check = Check(project=self.project, status="up")
check.last_start = now()
check.alert_after = check.last_start + td(hours=1)
check.save()
self.check.last_start = now()
self.check.alert_after = self.check.last_start + td(hours=1)
self.check.save()
url = "/api/v1/checks/%s/pause" % check.code
r = self.client.post( r = self.client.post(
url, "", content_type="application/json", HTTP_X_API_KEY="X" * 32
self.url, "", content_type="application/json", HTTP_X_API_KEY="X" * 32
) )
self.assertEqual(r.status_code, 200) self.assertEqual(r.status_code, 200)
self.assertEqual(r["Access-Control-Allow-Origin"], "*") self.assertEqual(r["Access-Control-Allow-Origin"], "*")
check.refresh_from_db()
self.assertEqual(check.last_start, None)
self.assertEqual(check.alert_after, None)
self.check.refresh_from_db()
self.assertEqual(self.check.last_start, None)
self.assertEqual(self.check.alert_after, None)
def test_it_clears_next_nag_date(self):
self.profile.nag_period = td(hours=1)
self.profile.next_nag_date = now() + td(minutes=30)
self.profile.save()
self.client.post(
self.url, "", content_type="application/json", HTTP_X_API_KEY="X" * 32
)
self.profile.refresh_from_db()
self.assertIsNone(self.profile.next_nag_date)

+ 5
- 0
hc/api/views.py View File

@ -293,6 +293,11 @@ def pause(request, code):
check.last_start = None check.last_start = None
check.alert_after = None check.alert_after = None
check.save() check.save()
# After pausing a check we must check if all checks are up,
# and Profile.next_nag_date needs to be cleared out:
check.project.update_next_nag_dates()
return JsonResponse(check.to_dict()) return JsonResponse(check.to_dict())


+ 11
- 0
hc/front/tests/test_pause.py View File

@ -54,3 +54,14 @@ class PauseTestCase(BaseTestCase):
self.client.login(username="[email protected]", password="password") self.client.login(username="[email protected]", password="password")
r = self.client.post(self.url) r = self.client.post(self.url)
self.assertEqual(r.status_code, 403) self.assertEqual(r.status_code, 403)
def test_it_clears_next_nag_date(self):
self.profile.nag_period = td(hours=1)
self.profile.next_nag_date = now() + td(minutes=30)
self.profile.save()
self.client.login(username="[email protected]", password="password")
self.client.post(self.url)
self.profile.refresh_from_db()
self.assertIsNone(self.profile.next_nag_date)

+ 4
- 0
hc/front/views.py View File

@ -535,6 +535,10 @@ def pause(request, code):
check.alert_after = None check.alert_after = None
check.save() check.save()
# After pausing a check we must check if all checks are up,
# and Profile.next_nag_date needs to be cleared out:
check.project.update_next_nag_dates()
# Don't redirect after an AJAX request: # Don't redirect after an AJAX request:
if request.META.get("HTTP_X_REQUESTED_WITH") == "XMLHttpRequest": if request.META.get("HTTP_X_REQUESTED_WITH") == "XMLHttpRequest":
return HttpResponse() return HttpResponse()


Loading…
Cancel
Save