forked from GithubBackups/healthchecks
The "require_setting" decorator and more tests.
This commit is contained in:
parent
dc373dc054
commit
9389408cbc
18
hc/front/decorators.py
Normal file
18
hc/front/decorators.py
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
from functools import wraps
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.http import HttpResponse
|
||||||
|
|
||||||
|
|
||||||
|
def require_setting(key):
|
||||||
|
def decorator(f):
|
||||||
|
@wraps(f)
|
||||||
|
def wrapper(request, *args, **kwds):
|
||||||
|
if not getattr(settings, key):
|
||||||
|
return HttpResponse(status=404)
|
||||||
|
|
||||||
|
return f(request, *args, **kwds)
|
||||||
|
|
||||||
|
return wrapper
|
||||||
|
|
||||||
|
return decorator
|
@ -68,3 +68,9 @@ class AddDiscordCompleteTestCase(BaseTestCase):
|
|||||||
|
|
||||||
# Session should now be clean
|
# Session should now be clean
|
||||||
self.assertFalse("add_discord" in self.client.session)
|
self.assertFalse("add_discord" in self.client.session)
|
||||||
|
|
||||||
|
@override_settings(DISCORD_CLIENT_ID=None)
|
||||||
|
def test_it_requires_client_id(self):
|
||||||
|
self.client.login(username="alice@example.org", password="password")
|
||||||
|
r = self.client.get(self.url + "?code=12345678&state=bar")
|
||||||
|
self.assertEqual(r.status_code, 404)
|
||||||
|
@ -61,3 +61,11 @@ class AddPushbulletTestCase(BaseTestCase):
|
|||||||
|
|
||||||
# Session should now be clean
|
# Session should now be clean
|
||||||
self.assertFalse("add_pushbullet" in self.client.session)
|
self.assertFalse("add_pushbullet" in self.client.session)
|
||||||
|
|
||||||
|
@override_settings(PUSHBULLET_CLIENT_ID=None)
|
||||||
|
def test_it_requires_client_id(self):
|
||||||
|
url = self.url + "?code=12345678&state=bar&project=%s" % self.project.code
|
||||||
|
|
||||||
|
self.client.login(username="alice@example.org", password="password")
|
||||||
|
r = self.client.get(url)
|
||||||
|
self.assertEqual(r.status_code, 404)
|
||||||
|
@ -20,3 +20,9 @@ class AddSlackBtnTestCase(BaseTestCase):
|
|||||||
|
|
||||||
# There should now be a key in session
|
# There should now be a key in session
|
||||||
self.assertTrue("add_slack" in self.client.session)
|
self.assertTrue("add_slack" in self.client.session)
|
||||||
|
|
||||||
|
@override_settings(SLACK_CLIENT_ID=None)
|
||||||
|
def test_it_requires_client_id(self):
|
||||||
|
self.client.login(username="alice@example.org", password="password")
|
||||||
|
r = self.client.get(self.url)
|
||||||
|
self.assertEqual(r.status_code, 404)
|
||||||
|
@ -67,3 +67,9 @@ class AddSlackCompleteTestCase(BaseTestCase):
|
|||||||
r = self.client.get(url, follow=True)
|
r = self.client.get(url, follow=True)
|
||||||
self.assertRedirects(r, self.channels_url)
|
self.assertRedirects(r, self.channels_url)
|
||||||
self.assertContains(r, "something went wrong")
|
self.assertContains(r, "something went wrong")
|
||||||
|
|
||||||
|
@override_settings(SLACK_CLIENT_ID=None)
|
||||||
|
def test_it_requires_client_id(self):
|
||||||
|
self.client.login(username="alice@example.org", password="password")
|
||||||
|
r = self.client.get("/integrations/add_slack_btn/?code=12345678&state=foo")
|
||||||
|
self.assertEqual(r.status_code, 404)
|
||||||
|
@ -7,3 +7,8 @@ class AddSlackHelpTestCase(BaseTestCase):
|
|||||||
def test_instructions_work(self):
|
def test_instructions_work(self):
|
||||||
r = self.client.get("/integrations/add_slack/")
|
r = self.client.get("/integrations/add_slack/")
|
||||||
self.assertContains(r, "Setup Guide", status_code=200)
|
self.assertContains(r, "Setup Guide", status_code=200)
|
||||||
|
|
||||||
|
@override_settings(SLACK_CLIENT_ID=None)
|
||||||
|
def test_it_requires_client_id(self):
|
||||||
|
r = self.client.get("/integrations/add_slack/")
|
||||||
|
self.assertEqual(r.status_code, 404)
|
||||||
|
@ -5,18 +5,17 @@ from hc.api.models import Channel
|
|||||||
from hc.test import BaseTestCase
|
from hc.test import BaseTestCase
|
||||||
|
|
||||||
|
|
||||||
|
@override_settings(TRELLO_APP_KEY="foo")
|
||||||
class AddTrelloTestCase(BaseTestCase):
|
class AddTrelloTestCase(BaseTestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(AddTrelloTestCase, self).setUp()
|
super(AddTrelloTestCase, self).setUp()
|
||||||
self.url = "/projects/%s/add_trello/" % self.project.code
|
self.url = "/projects/%s/add_trello/" % self.project.code
|
||||||
|
|
||||||
@override_settings(TRELLO_APP_KEY="foo")
|
|
||||||
def test_instructions_work(self):
|
def test_instructions_work(self):
|
||||||
self.client.login(username="alice@example.org", password="password")
|
self.client.login(username="alice@example.org", password="password")
|
||||||
r = self.client.get(self.url)
|
r = self.client.get(self.url)
|
||||||
self.assertContains(r, "Trello")
|
self.assertContains(r, "Trello")
|
||||||
|
|
||||||
@override_settings(TRELLO_APP_KEY="foo")
|
|
||||||
def test_it_works(self):
|
def test_it_works(self):
|
||||||
form = {
|
form = {
|
||||||
"settings": json.dumps(
|
"settings": json.dumps(
|
||||||
@ -37,3 +36,9 @@ class AddTrelloTestCase(BaseTestCase):
|
|||||||
self.assertEqual(c.kind, "trello")
|
self.assertEqual(c.kind, "trello")
|
||||||
self.assertEqual(c.trello_token, "fake-token")
|
self.assertEqual(c.trello_token, "fake-token")
|
||||||
self.assertEqual(c.project, self.project)
|
self.assertEqual(c.project, self.project)
|
||||||
|
|
||||||
|
@override_settings(TRELLO_APP_KEY=None)
|
||||||
|
def test_it_requires_trello_app_key(self):
|
||||||
|
self.client.login(username="alice@example.org", password="password")
|
||||||
|
r = self.client.get(self.url)
|
||||||
|
self.assertEqual(r.status_code, 404)
|
||||||
|
26
hc/front/tests/test_trello_settings.py
Normal file
26
hc/front/tests/test_trello_settings.py
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
from mock import patch
|
||||||
|
|
||||||
|
from django.test.utils import override_settings
|
||||||
|
from hc.test import BaseTestCase
|
||||||
|
|
||||||
|
|
||||||
|
@override_settings(TRELLO_APP_KEY="foo")
|
||||||
|
class AddTrelloTestCase(BaseTestCase):
|
||||||
|
url = "/integrations/add_trello/settings/"
|
||||||
|
|
||||||
|
@patch("hc.front.views.requests.get")
|
||||||
|
def test_it_works(self, mock_get):
|
||||||
|
mock_get.return_value.json.return_value = [
|
||||||
|
{"name": "My Board", "lists": [{"name": "Alerts"}]}
|
||||||
|
]
|
||||||
|
|
||||||
|
self.client.login(username="alice@example.org", password="password")
|
||||||
|
r = self.client.post(self.url)
|
||||||
|
self.assertContains(r, "Please select the Trello list")
|
||||||
|
self.assertContains(r, "Alerts")
|
||||||
|
|
||||||
|
@override_settings(TRELLO_APP_KEY=None)
|
||||||
|
def test_it_requires_trello_app_key(self):
|
||||||
|
self.client.login(username="alice@example.org", password="password")
|
||||||
|
r = self.client.get(self.url)
|
||||||
|
self.assertEqual(r.status_code, 404)
|
@ -34,6 +34,7 @@ from hc.api.models import (
|
|||||||
Notification,
|
Notification,
|
||||||
)
|
)
|
||||||
from hc.api.transports import Telegram
|
from hc.api.transports import Telegram
|
||||||
|
from hc.front.decorators import require_setting
|
||||||
from hc.front.forms import (
|
from hc.front.forms import (
|
||||||
AddAppriseForm,
|
AddAppriseForm,
|
||||||
AddEmailForm,
|
AddEmailForm,
|
||||||
@ -878,11 +879,9 @@ def add_webhook(request, code):
|
|||||||
return render(request, "integrations/add_webhook.html", ctx)
|
return render(request, "integrations/add_webhook.html", ctx)
|
||||||
|
|
||||||
|
|
||||||
|
@require_setting("SHELL_ENABLED")
|
||||||
@login_required
|
@login_required
|
||||||
def add_shell(request, code):
|
def add_shell(request, code):
|
||||||
if not settings.SHELL_ENABLED:
|
|
||||||
raise Http404("shell integration is not available")
|
|
||||||
|
|
||||||
project = _get_project_for_user(request, code)
|
project = _get_project_for_user(request, code)
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
form = AddShellForm(request.POST)
|
form = AddShellForm(request.POST)
|
||||||
@ -925,19 +924,15 @@ def add_pd(request, code):
|
|||||||
return render(request, "integrations/add_pd.html", ctx)
|
return render(request, "integrations/add_pd.html", ctx)
|
||||||
|
|
||||||
|
|
||||||
|
@require_setting("PD_VENDOR_KEY")
|
||||||
def add_pdc_help(request):
|
def add_pdc_help(request):
|
||||||
if settings.PD_VENDOR_KEY is None:
|
|
||||||
raise Http404("pagerduty integration is not available")
|
|
||||||
|
|
||||||
ctx = {"page": "channels"}
|
ctx = {"page": "channels"}
|
||||||
return render(request, "integrations/add_pdc.html", ctx)
|
return render(request, "integrations/add_pdc.html", ctx)
|
||||||
|
|
||||||
|
|
||||||
|
@require_setting("PD_VENDOR_KEY")
|
||||||
@login_required
|
@login_required
|
||||||
def add_pdc(request, code):
|
def add_pdc(request, code):
|
||||||
if settings.PD_VENDOR_KEY is None:
|
|
||||||
raise Http404("pagerduty integration is not available")
|
|
||||||
|
|
||||||
project = _get_project_for_user(request, code)
|
project = _get_project_for_user(request, code)
|
||||||
|
|
||||||
state = token_urlsafe()
|
state = token_urlsafe()
|
||||||
@ -953,11 +948,9 @@ def add_pdc(request, code):
|
|||||||
return render(request, "integrations/add_pdc.html", ctx)
|
return render(request, "integrations/add_pdc.html", ctx)
|
||||||
|
|
||||||
|
|
||||||
|
@require_setting("PD_VENDOR_KEY")
|
||||||
@login_required
|
@login_required
|
||||||
def add_pdc_complete(request, code, state):
|
def add_pdc_complete(request, code, state):
|
||||||
if settings.PD_VENDOR_KEY is None:
|
|
||||||
raise Http404("pagerduty integration is not available")
|
|
||||||
|
|
||||||
if "pd" not in request.session:
|
if "pd" not in request.session:
|
||||||
return HttpResponseBadRequest()
|
return HttpResponseBadRequest()
|
||||||
|
|
||||||
@ -1048,19 +1041,15 @@ def add_slack(request, code):
|
|||||||
return render(request, "integrations/add_slack.html", ctx)
|
return render(request, "integrations/add_slack.html", ctx)
|
||||||
|
|
||||||
|
|
||||||
|
@require_setting("SLACK_CLIENT_ID")
|
||||||
def add_slack_help(request):
|
def add_slack_help(request):
|
||||||
if not settings.SLACK_CLIENT_ID:
|
|
||||||
raise Http404("slack integration is not available")
|
|
||||||
|
|
||||||
ctx = {"page": "channels"}
|
ctx = {"page": "channels"}
|
||||||
return render(request, "integrations/add_slack_btn.html", ctx)
|
return render(request, "integrations/add_slack_btn.html", ctx)
|
||||||
|
|
||||||
|
|
||||||
|
@require_setting("SLACK_CLIENT_ID")
|
||||||
@login_required
|
@login_required
|
||||||
def add_slack_btn(request, code):
|
def add_slack_btn(request, code):
|
||||||
if not settings.SLACK_CLIENT_ID:
|
|
||||||
raise Http404("slack integration is not available")
|
|
||||||
|
|
||||||
project = _get_project_for_user(request, code)
|
project = _get_project_for_user(request, code)
|
||||||
|
|
||||||
state = token_urlsafe()
|
state = token_urlsafe()
|
||||||
@ -1082,11 +1071,9 @@ def add_slack_btn(request, code):
|
|||||||
return render(request, "integrations/add_slack_btn.html", ctx)
|
return render(request, "integrations/add_slack_btn.html", ctx)
|
||||||
|
|
||||||
|
|
||||||
|
@require_setting("SLACK_CLIENT_ID")
|
||||||
@login_required
|
@login_required
|
||||||
def add_slack_complete(request):
|
def add_slack_complete(request):
|
||||||
if not settings.SLACK_CLIENT_ID:
|
|
||||||
raise Http404("slack integration is not available")
|
|
||||||
|
|
||||||
if "add_slack" not in request.session:
|
if "add_slack" not in request.session:
|
||||||
return HttpResponseForbidden()
|
return HttpResponseForbidden()
|
||||||
|
|
||||||
@ -1142,11 +1129,9 @@ def add_mattermost(request, code):
|
|||||||
return render(request, "integrations/add_mattermost.html", ctx)
|
return render(request, "integrations/add_mattermost.html", ctx)
|
||||||
|
|
||||||
|
|
||||||
|
@require_setting("PUSHBULLET_CLIENT_ID")
|
||||||
@login_required
|
@login_required
|
||||||
def add_pushbullet(request, code):
|
def add_pushbullet(request, code):
|
||||||
if settings.PUSHBULLET_CLIENT_ID is None:
|
|
||||||
raise Http404("pushbullet integration is not available")
|
|
||||||
|
|
||||||
project = _get_project_for_user(request, code)
|
project = _get_project_for_user(request, code)
|
||||||
redirect_uri = settings.SITE_ROOT + reverse("hc-add-pushbullet-complete")
|
redirect_uri = settings.SITE_ROOT + reverse("hc-add-pushbullet-complete")
|
||||||
|
|
||||||
@ -1170,11 +1155,9 @@ def add_pushbullet(request, code):
|
|||||||
return render(request, "integrations/add_pushbullet.html", ctx)
|
return render(request, "integrations/add_pushbullet.html", ctx)
|
||||||
|
|
||||||
|
|
||||||
|
@require_setting("PUSHBULLET_CLIENT_ID")
|
||||||
@login_required
|
@login_required
|
||||||
def add_pushbullet_complete(request):
|
def add_pushbullet_complete(request):
|
||||||
if settings.PUSHBULLET_CLIENT_ID is None:
|
|
||||||
raise Http404("pushbullet integration is not available")
|
|
||||||
|
|
||||||
if "add_pushbullet" not in request.session:
|
if "add_pushbullet" not in request.session:
|
||||||
return HttpResponseForbidden()
|
return HttpResponseForbidden()
|
||||||
|
|
||||||
@ -1211,11 +1194,9 @@ def add_pushbullet_complete(request):
|
|||||||
return redirect("hc-p-channels", project.code)
|
return redirect("hc-p-channels", project.code)
|
||||||
|
|
||||||
|
|
||||||
|
@require_setting("DISCORD_CLIENT_ID")
|
||||||
@login_required
|
@login_required
|
||||||
def add_discord(request, code):
|
def add_discord(request, code):
|
||||||
if settings.DISCORD_CLIENT_ID is None:
|
|
||||||
raise Http404("discord integration is not available")
|
|
||||||
|
|
||||||
project = _get_project_for_user(request, code)
|
project = _get_project_for_user(request, code)
|
||||||
redirect_uri = settings.SITE_ROOT + reverse("hc-add-discord-complete")
|
redirect_uri = settings.SITE_ROOT + reverse("hc-add-discord-complete")
|
||||||
state = token_urlsafe()
|
state = token_urlsafe()
|
||||||
@ -1235,11 +1216,9 @@ def add_discord(request, code):
|
|||||||
return render(request, "integrations/add_discord.html", ctx)
|
return render(request, "integrations/add_discord.html", ctx)
|
||||||
|
|
||||||
|
|
||||||
|
@require_setting("DISCORD_CLIENT_ID")
|
||||||
@login_required
|
@login_required
|
||||||
def add_discord_complete(request):
|
def add_discord_complete(request):
|
||||||
if settings.DISCORD_CLIENT_ID is None:
|
|
||||||
raise Http404("discord integration is not available")
|
|
||||||
|
|
||||||
if "add_discord" not in request.session:
|
if "add_discord" not in request.session:
|
||||||
return HttpResponseForbidden()
|
return HttpResponseForbidden()
|
||||||
|
|
||||||
@ -1283,11 +1262,9 @@ def add_pushover_help(request):
|
|||||||
return render(request, "integrations/add_pushover_help.html", ctx)
|
return render(request, "integrations/add_pushover_help.html", ctx)
|
||||||
|
|
||||||
|
|
||||||
|
@require_setting("PUSHOVER_API_TOKEN")
|
||||||
@login_required
|
@login_required
|
||||||
def add_pushover(request, code):
|
def add_pushover(request, code):
|
||||||
if settings.PUSHOVER_API_TOKEN is None:
|
|
||||||
raise Http404("pushover integration is not available")
|
|
||||||
|
|
||||||
project = _get_project_for_user(request, code)
|
project = _get_project_for_user(request, code)
|
||||||
|
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
@ -1451,11 +1428,9 @@ def add_telegram(request):
|
|||||||
return render(request, "integrations/add_telegram.html", ctx)
|
return render(request, "integrations/add_telegram.html", ctx)
|
||||||
|
|
||||||
|
|
||||||
|
@require_setting("TWILIO_AUTH")
|
||||||
@login_required
|
@login_required
|
||||||
def add_sms(request, code):
|
def add_sms(request, code):
|
||||||
if settings.TWILIO_AUTH is None:
|
|
||||||
raise Http404("sms integration is not available")
|
|
||||||
|
|
||||||
project = _get_project_for_user(request, code)
|
project = _get_project_for_user(request, code)
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
form = AddSmsForm(request.POST)
|
form = AddSmsForm(request.POST)
|
||||||
@ -1479,11 +1454,9 @@ def add_sms(request, code):
|
|||||||
return render(request, "integrations/add_sms.html", ctx)
|
return render(request, "integrations/add_sms.html", ctx)
|
||||||
|
|
||||||
|
|
||||||
|
@require_setting("TWILIO_USE_WHATSAPP")
|
||||||
@login_required
|
@login_required
|
||||||
def add_whatsapp(request, code):
|
def add_whatsapp(request, code):
|
||||||
if not settings.TWILIO_USE_WHATSAPP:
|
|
||||||
raise Http404("whatsapp integration is not available")
|
|
||||||
|
|
||||||
project = _get_project_for_user(request, code)
|
project = _get_project_for_user(request, code)
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
form = AddSmsForm(request.POST)
|
form = AddSmsForm(request.POST)
|
||||||
@ -1513,11 +1486,9 @@ def add_whatsapp(request, code):
|
|||||||
return render(request, "integrations/add_whatsapp.html", ctx)
|
return render(request, "integrations/add_whatsapp.html", ctx)
|
||||||
|
|
||||||
|
|
||||||
|
@require_setting("TRELLO_APP_KEY")
|
||||||
@login_required
|
@login_required
|
||||||
def add_trello(request, code):
|
def add_trello(request, code):
|
||||||
if settings.TRELLO_APP_KEY is None:
|
|
||||||
raise Http404("trello integration is not available")
|
|
||||||
|
|
||||||
project = _get_project_for_user(request, code)
|
project = _get_project_for_user(request, code)
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
channel = Channel(project=project, kind="trello")
|
channel = Channel(project=project, kind="trello")
|
||||||
@ -1548,11 +1519,9 @@ def add_trello(request, code):
|
|||||||
return render(request, "integrations/add_trello.html", ctx)
|
return render(request, "integrations/add_trello.html", ctx)
|
||||||
|
|
||||||
|
|
||||||
|
@require_setting("MATRIX_ACCESS_TOKEN")
|
||||||
@login_required
|
@login_required
|
||||||
def add_matrix(request, code):
|
def add_matrix(request, code):
|
||||||
if settings.MATRIX_ACCESS_TOKEN is None:
|
|
||||||
raise Http404("matrix integration is not available")
|
|
||||||
|
|
||||||
project = _get_project_for_user(request, code)
|
project = _get_project_for_user(request, code)
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
form = AddMatrixForm(request.POST)
|
form = AddMatrixForm(request.POST)
|
||||||
@ -1582,11 +1551,9 @@ def add_matrix(request, code):
|
|||||||
return render(request, "integrations/add_matrix.html", ctx)
|
return render(request, "integrations/add_matrix.html", ctx)
|
||||||
|
|
||||||
|
|
||||||
|
@require_setting("APPRISE_ENABLED")
|
||||||
@login_required
|
@login_required
|
||||||
def add_apprise(request, code):
|
def add_apprise(request, code):
|
||||||
if not settings.APPRISE_ENABLED:
|
|
||||||
raise Http404("apprise integration is not available")
|
|
||||||
|
|
||||||
project = _get_project_for_user(request, code)
|
project = _get_project_for_user(request, code)
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
form = AddAppriseForm(request.POST)
|
form = AddAppriseForm(request.POST)
|
||||||
@ -1605,6 +1572,7 @@ def add_apprise(request, code):
|
|||||||
return render(request, "integrations/add_apprise.html", ctx)
|
return render(request, "integrations/add_apprise.html", ctx)
|
||||||
|
|
||||||
|
|
||||||
|
@require_setting("TRELLO_APP_KEY")
|
||||||
@login_required
|
@login_required
|
||||||
@require_POST
|
@require_POST
|
||||||
def trello_settings(request):
|
def trello_settings(request):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user