diff --git a/app/clients/__init__.py b/app/clients/__init__.py index 06495ccbe..1f7743786 100644 --- a/app/clients/__init__.py +++ b/app/clients/__init__.py @@ -11,3 +11,24 @@ class Client(object): Base client for sending notifications. ''' pass + + +class ClientResponse: + def __init__(self): + self.__response_model__ = None + + def response_code_to_object(self, response_code): + return self.__response_model__[response_code] + + def response_code_to_message(self, response_code): + return self.response_code_to_object(response_code)['message'] + + def response_code_to_notification_status(self, response_code): + print(response_code) + return self.response_code_to_object(response_code)['notification_status'] + + def response_code_to_notification_statistics_status(self, response_code): + return self.response_code_to_object(response_code)['notification_statistics_status'] + + def response_code_to_notification_success(self, response_code): + return self.response_code_to_object(response_code)['success'] diff --git a/app/clients/email/aws_ses.py b/app/clients/email/aws_ses.py index 4255f69e8..6eb4e7b26 100644 --- a/app/clients/email/aws_ses.py +++ b/app/clients/email/aws_ses.py @@ -1,22 +1,33 @@ import boto3 from flask import current_app from monotonic import monotonic +from app.clients import ClientResponse from app.clients.email import (EmailClientException, EmailClient) -ses_response_status = { - 'Bounce': { - "success": False, - "notify_status": 'bounce' - }, - 'Delivery': { - "success": True, - "notify_status": 'delivered' - }, - 'Complaint': { - "success": False, - "notify_status": 'complaint' - } -} + +class AwsSesResponses(ClientResponse): + def __init__(self): + ClientResponse.__init__(self) + self.__response_model__ = { + 'Bounce': { + "message": 'Bounced', + "success": False, + "notification_status": 'bounce', + "notification_statistics_status": 'failed' + }, + 'Delivery': { + "message": 'Delivered', + "success": True, + "notification_status": 'delivered', + "notification_statistics_status": 'delivered' + }, + 'Complaint': { + "message": 'Complaint', + "success": False, + "notification_status": 'complaint', + "notification_statistics_status": 'failed' + } + } class AwsSesClientException(EmailClientException): diff --git a/app/clients/sms/firetext.py b/app/clients/sms/firetext.py index 9fdf95c2f..c50e4b079 100644 --- a/app/clients/sms/firetext.py +++ b/app/clients/sms/firetext.py @@ -6,58 +6,34 @@ from app.clients.sms import ( ) from flask import current_app from requests import request, RequestException, HTTPError +from app.clients import ClientResponse logger = logging.getLogger(__name__) -firetext_response_status = { - '0': { - "firetext_message": 'delivered', - "success": True, - "notify_status": 'delivered' - }, - '1': { - "firetext_message": 'declined', - "success": False, - "notify_status": 'failed' - }, - '2': { - "firetext_message": 'Undelivered (Pending with Network)', - "success": False, - "notify_status": 'sent' - } -} - -class FiretextResponses: - response_model = { - '0': { - "firetext_message": 'delivered', - "stats_mapping": 'delivered', - "success": True, - "notify_status": 'delivered' - }, - '1': { - "firetext_message": 'declined', - "success": False, - "stats_mapping": 'failure', - "notify_status": 'failed' - }, - '2': { - "firetext_message": 'Undelivered (Pending with Network)', - "success": False, - "stats_mapping": None, - "notify_status": 'sent' +class FiretextResponses(ClientResponse): + def __init__(self): + ClientResponse.__init__(self) + self.__response_model__ = { + '0': { + "message": 'Delivered', + "notification_statistics_status": 'delivered', + "success": True, + "notification_status": 'delivered' + }, + '1': { + "message": 'Declined', + "success": False, + "notification_statistics_status": 'failed', + "notification_status": 'failed' + }, + '2': { + "message": 'Undelivered (Pending with Network)', + "success": False, + "notification_statistics_status": None, + "notification_status": 'sent' + } } - } - - def response_code_to_message(self, response_code): - return self.response_model.get(response_code)['firetext_message'] - - def response_code_to_notify_status(self, response_code): - return self.response_model.get(response_code)['notify_status'] - - def response_code_to_notify_stats(self, response_code): - return self.response_model.get(response_code)['stats_mapping'] class FiretextClientException(SmsClientException): diff --git a/tests/app/clients/__init__.py b/tests/app/clients/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/app/clients/test_aws_ses.py b/tests/app/clients/test_aws_ses.py new file mode 100644 index 000000000..da527dd3e --- /dev/null +++ b/tests/app/clients/test_aws_ses.py @@ -0,0 +1,32 @@ +import pytest + +from app.clients.email import aws_ses + +aws_responses = aws_ses.AwsSesResponses() + + +def test_should_return_correct_details_for_delivery(): + assert aws_responses.response_code_to_message('Delivery') == 'Delivered' + assert aws_responses.response_code_to_notification_status('Delivery') == 'delivered' + assert aws_responses.response_code_to_notification_statistics_status('Delivery') == 'delivered' + assert aws_responses.response_code_to_notification_success('Delivery') + + +def test_should_return_correct_details_for_bounced(): + assert aws_responses.response_code_to_message('Bounce') == 'Bounced' + assert aws_responses.response_code_to_notification_status('Bounce') == 'bounce' + assert aws_responses.response_code_to_notification_statistics_status('Bounce') == 'failed' + assert not aws_responses.response_code_to_notification_success('Bounce') + + +def test_should_return_correct_details_for_complaint(): + assert aws_responses.response_code_to_message('Complaint') == 'Complaint' + assert aws_responses.response_code_to_notification_status('Complaint') == 'complaint' + assert aws_responses.response_code_to_notification_statistics_status('Complaint') == 'failed' + assert not aws_responses.response_code_to_notification_success('Complaint') + + +def test_should_be_none_if_unrecognised_status_code(): + with pytest.raises(KeyError) as e: + aws_responses.response_code_to_object('99') + assert '99' in str(e.value) diff --git a/tests/app/clients/test_firetext.py b/tests/app/clients/test_firetext.py new file mode 100644 index 000000000..f38e4ec4e --- /dev/null +++ b/tests/app/clients/test_firetext.py @@ -0,0 +1,32 @@ +import pytest + +from app.clients.sms import firetext + +responses = firetext.FiretextResponses() + + +def test_should_return_correct_details_for_delivery(): + assert responses.response_code_to_message('0') == 'Delivered' + assert responses.response_code_to_notification_status('0') == 'delivered' + assert responses.response_code_to_notification_statistics_status('0') == 'delivered' + assert responses.response_code_to_notification_success('0') + + +def test_should_return_correct_details_for_bounced(): + assert responses.response_code_to_message('1') == 'Declined' + assert responses.response_code_to_notification_status('1') == 'failed' + assert responses.response_code_to_notification_statistics_status('1') == 'failed' + assert not responses.response_code_to_notification_success('1') + + +def test_should_return_correct_details_for_complaint(): + assert responses.response_code_to_message('2') == 'Undelivered (Pending with Network)' + assert responses.response_code_to_notification_status('2') == 'sent' + assert not responses.response_code_to_notification_statistics_status('2') + assert not responses.response_code_to_notification_success('2') + + +def test_should_be_none_if_unrecognised_status_code(): + with pytest.raises(KeyError) as e: + responses.response_code_to_object('99') + assert '99' in str(e.value)