diff --git a/hc/api/models.py b/hc/api/models.py index 8dd38195..25e16721 100644 --- a/hc/api/models.py +++ b/hc/api/models.py @@ -118,8 +118,13 @@ class Channel(models.Model): emails.alert(self.value, ctx) n.save() elif self.kind == "webhook" and check.status == "down": - r = requests.get(self.value) - n.status = r.status_code + try: + r = requests.get(self.value, timeout=5) + n.status = r.status_code + except requests.exceptions.Timeout: + # Well, we tried + pass + n.save() elif self.kind == "pd": if check.status == "down": diff --git a/hc/api/tests/test_notify.py b/hc/api/tests/test_notify.py index 8d5fd745..74c229a9 100644 --- a/hc/api/tests/test_notify.py +++ b/hc/api/tests/test_notify.py @@ -1,14 +1,15 @@ from django.contrib.auth.models import User from django.test import TestCase from mock import patch +from requests.exceptions import ReadTimeout -from hc.api.models import Channel, Check +from hc.api.models import Channel, Check, Notification class NotifyTestCase(TestCase): - @patch("hc.api.models.requests") - def test_webhook(self, mock_requests): + @patch("hc.api.models.requests.get") + def test_webhook(self, mock_get): alice = User(username="alice") alice.save() @@ -21,4 +22,21 @@ class NotifyTestCase(TestCase): channel.checks.add(check) channel.notify(check) - mock_requests.get.assert_called_with(u"http://example") + mock_get.assert_called_with(u"http://example", timeout=5) + + @patch("hc.api.models.requests.get", side_effect=ReadTimeout) + def test_it_handles_requests_exceptions(self, mock_get): + alice = User(username="alice") + alice.save() + + check = Check() + check.status = "down" + check.save() + + channel = Channel(user=alice, kind="webhook", value="http://example") + channel.save() + channel.checks.add(check) + + channel.notify(check) + + assert Notification.objects.count() == 1