From 52c6beccef2ac90c0b55b4f6b4ce95b829eff6ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=93teris=20Caune?= Date: Tue, 18 Aug 2015 19:41:48 +0300 Subject: [PATCH] Webhooks have timeout --- hc/api/models.py | 9 +++++++-- hc/api/tests/test_notify.py | 26 ++++++++++++++++++++++---- 2 files changed, 29 insertions(+), 6 deletions(-) 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