diff --git a/opentech/apply/activity/messaging.py b/opentech/apply/activity/messaging.py index ecfcd71bbc3e5bc762ee201d5eba5831b9753e56..62f76957567deeec3e496a059e82864a0287e64c 100644 --- a/opentech/apply/activity/messaging.py +++ b/opentech/apply/activity/messaging.py @@ -29,7 +29,12 @@ class AdapterBase: always_send = False def message(self, message_type, **kwargs): - message = self.messages[message_type] + try: + message = self.messages[message_type] + except KeyError: + # We don't know how to handle that message type + return + try: # see if its a method on the adapter method = getattr(self, message) @@ -127,14 +132,14 @@ class SlackAdapter(AdapterBase): return f'<{user.slack}>' def send_message(self, message, **kwargs): - if not self.destination and not self.target_room: + if not self.destination or not self.target_room: return data = { "room": self.target_room, "message": message, } - requests.post(self.destination, data=data) + requests.post(self.destination, json=data) class MessengerBackend: diff --git a/opentech/apply/activity/tests/test_messaging.py b/opentech/apply/activity/tests/test_messaging.py index adbd07a09e7f59fb36e911438fc6c9bdbc3b412a..c0fa21b54e069485630e4d27fc1c86cd92351cad 100644 --- a/opentech/apply/activity/tests/test_messaging.py +++ b/opentech/apply/activity/tests/test_messaging.py @@ -1,5 +1,8 @@ +import json from unittest.mock import Mock, patch +import responses + from django.test import TestCase, override_settings from django.contrib.messages import get_messages @@ -13,6 +16,7 @@ from ..messaging import ( ActivityAdapter, MessengerBackend, MESSAGES, + SlackAdapter, ) @@ -149,3 +153,47 @@ class TestActivityAdapter(TestCase): self.assertTrue('Removed' in message) self.assertTrue('1' in message) self.assertTrue('2' in message) + + +class TestSlackAdapter(TestCase): + target_url = 'https://my-slack-backend.com/incoming/my-very-secret-key' + target_room = '<ROOM ID>' + + @override_settings( + SLACK_DESTINATION_URL=target_url, + SLACK_DESTINATION_ROOM=None, + ) + @responses.activate + def test_cant_send_with_no_room(self): + adapter = SlackAdapter() + adapter.send_message('my message') + self.assertEqual(len(responses.calls), 0) + + @override_settings( + SLACK_DESTINATION_URL=None, + SLACK_DESTINATION_ROOM=target_room, + ) + @responses.activate + def test_cant_send_with_no_url(self): + adapter = SlackAdapter() + adapter.send_message('my message') + self.assertEqual(len(responses.calls), 0) + + @override_settings( + SLACK_DESTINATION_URL=target_url, + SLACK_DESTINATION_ROOM=target_room, + ) + @responses.activate + def test_correct_payload(self): + responses.add(responses.POST, self.target_url, status=200) + adapter = SlackAdapter() + message = 'my message' + adapter.send_message(message) + self.assertEqual(len(responses.calls), 1) + self.assertDictEqual( + json.loads(responses.calls[0].request.body), + { + 'room': self.target_room, + 'message': message, + } + ) diff --git a/requirements.txt b/requirements.txt index c70c8301fb265f72ceedb8649edfec45da1ac284..beb571c642a3e18eba3c76d4ec83563eaed9a745 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,6 +16,7 @@ django-hijack==2.1.9 factory_boy==2.9.2 # wagtail_factories - waiting on merge and release form master branch git+git://github.com/mvantellingen/wagtail-factories.git#egg=wagtail_factories +responses == 0.9.0 flake8