2016-09-22 17:18:05 +01:00
import json
2016-06-01 15:59:44 +01:00
import pytest
import requests_mock
2016-09-22 17:18:05 +01:00
from requests import HTTPError
2017-04-05 15:31:37 +01:00
from requests . exceptions import ConnectTimeout , ReadTimeout
2016-09-22 17:18:05 +01:00
2016-07-20 10:40:50 +01:00
from app import mmg_client
2016-09-22 17:18:05 +01:00
from app . clients . sms import SmsClientResponseException
2016-06-01 15:59:44 +01:00
2017-04-05 15:31:37 +01:00
from app . clients . sms . mmg import get_mmg_responses , MMGClientResponseException
2016-04-06 14:31:33 +01:00
def test_should_return_correct_details_for_delivery ( ) :
2016-04-20 14:29:31 +01:00
response_dict = get_mmg_responses ( ' 3 ' )
2016-04-06 14:31:33 +01:00
assert response_dict [ ' message ' ] == ' Delivered '
assert response_dict [ ' notification_status ' ] == ' delivered '
assert response_dict [ ' notification_statistics_status ' ] == ' delivered '
assert response_dict [ ' success ' ]
def test_should_return_correct_details_for_bounced ( ) :
response_dict = get_mmg_responses ( ' 50 ' )
assert response_dict [ ' message ' ] == ' Declined '
assert response_dict [ ' notification_status ' ] == ' failed '
assert response_dict [ ' notification_statistics_status ' ] == ' failure '
assert not response_dict [ ' success ' ]
def test_should_be_none_if_unrecognised_status_code ( ) :
response_dict = get_mmg_responses ( ' blah ' )
assert response_dict [ ' message ' ] == ' Declined '
assert response_dict [ ' notification_status ' ] == ' failed '
assert response_dict [ ' notification_statistics_status ' ] == ' failure '
assert not response_dict [ ' success ' ]
2016-06-01 15:59:44 +01:00
2016-07-20 10:40:50 +01:00
def test_send_sms_successful_returns_mmg_response ( notify_api , mocker ) :
2016-06-01 15:59:44 +01:00
to = content = reference = ' foo '
response_dict = { ' Reference ' : 12345678 }
with requests_mock . Mocker ( ) as request_mock :
2016-07-19 16:16:12 +01:00
request_mock . post ( ' https://api.mmg.co.uk/json/api.php ' , json = response_dict , status_code = 200 )
2016-07-20 10:40:50 +01:00
response = mmg_client . send_sms ( to , content , reference )
2016-06-01 15:59:44 +01:00
response_json = response . json ( )
assert response . status_code == 200
assert response_json [ ' Reference ' ] == 12345678
2016-07-20 10:40:50 +01:00
def test_send_sms_calls_mmg_correctly ( notify_api , mocker ) :
2016-06-01 15:59:44 +01:00
to = ' +447234567890 '
content = ' my message '
reference = ' my reference '
response_dict = { ' Reference ' : 12345678 }
with requests_mock . Mocker ( ) as request_mock :
2016-07-19 16:16:12 +01:00
request_mock . post ( ' https://api.mmg.co.uk/json/api.php ' , json = response_dict , status_code = 200 )
2016-07-20 10:40:50 +01:00
mmg_client . send_sms ( to , content , reference )
2016-06-01 15:59:44 +01:00
assert request_mock . call_count == 1
2016-07-19 16:16:12 +01:00
assert request_mock . request_history [ 0 ] . url == ' https://api.mmg.co.uk/json/api.php '
2016-06-01 15:59:44 +01:00
assert request_mock . request_history [ 0 ] . method == ' POST '
request_args = request_mock . request_history [ 0 ] . json ( )
assert request_args [ ' reqType ' ] == ' BULK '
assert request_args [ ' MSISDN ' ] == to
assert request_args [ ' msg ' ] == content
2016-09-07 09:35:31 +01:00
assert request_args [ ' sender ' ] == ' testing '
2016-06-01 15:59:44 +01:00
assert request_args [ ' cid ' ] == reference
assert request_args [ ' multi ' ] is True
2016-07-20 10:40:50 +01:00
def test_send_sms_raises_if_mmg_rejects ( notify_api , mocker ) :
2016-06-01 15:59:44 +01:00
to = content = reference = ' foo '
response_dict = {
' Error ' : 206 ,
' Description ' : ' Some kind of error '
}
2016-09-22 17:18:05 +01:00
with pytest . raises ( SmsClientResponseException ) as exc , requests_mock . Mocker ( ) as request_mock :
2016-07-19 16:16:12 +01:00
request_mock . post ( ' https://api.mmg.co.uk/json/api.php ' , json = response_dict , status_code = 400 )
2016-07-20 10:40:50 +01:00
mmg_client . send_sms ( to , content , reference )
2016-06-01 15:59:44 +01:00
2016-09-22 17:18:05 +01:00
assert exc . value . status_code == 400
assert ' " Error " : 206 ' in exc . value . text
assert ' " Description " : " Some kind of error " ' in exc . value . text
assert type ( exc . value . exception ) == HTTPError
2016-07-01 14:06:32 +01:00
2016-07-20 10:40:50 +01:00
def test_send_sms_override_configured_shortcode_with_sender ( notify_api , mocker ) :
2016-07-01 14:06:32 +01:00
to = ' +447234567890 '
content = ' my message '
reference = ' my reference '
response_dict = { ' Reference ' : 12345678 }
sender = ' fromservice '
with requests_mock . Mocker ( ) as request_mock :
2016-07-19 16:16:12 +01:00
request_mock . post ( ' https://api.mmg.co.uk/json/api.php ' , json = response_dict , status_code = 200 )
2016-07-20 10:40:50 +01:00
mmg_client . send_sms ( to , content , reference , sender = sender )
2016-07-01 14:06:32 +01:00
request_args = request_mock . request_history [ 0 ] . json ( )
assert request_args [ ' sender ' ] == ' fromservice '
2016-09-22 17:18:05 +01:00
def test_send_sms_raises_if_mmg_fails_to_return_json ( notify_api , mocker ) :
to = content = reference = ' foo '
response_dict = ' NOT AT ALL VALID JSON { " key " : " value " }} '
with pytest . raises ( SmsClientResponseException ) as exc , requests_mock . Mocker ( ) as request_mock :
request_mock . post ( ' https://api.mmg.co.uk/json/api.php ' , text = response_dict , status_code = 200 )
mmg_client . send_sms ( to , content , reference )
assert ' app.clients.sms.mmg.MMGClientResponseException: Code 200 text NOT AT ALL VALID JSON { " key " : " value " }} exception Expecting value: line 1 column 1 (char 0) ' in str ( exc ) # noqa
assert exc . value . status_code == 200
assert exc . value . text == ' NOT AT ALL VALID JSON { " key " : " value " }} '
2017-04-05 15:31:37 +01:00
def test_send_sms_raises_if_mmg_rejects_with_timeout ( rmock ) :
to = content = reference = ' foo '
with pytest . raises ( MMGClientResponseException ) as exc :
rmock . register_uri ( ' POST ' , ' https://api.mmg.co.uk/json/api.php ' , exc = ConnectTimeout )
mmg_client . send_sms ( to , content , reference )
assert exc . value . status_code == 504
assert exc . value . text == ' Gateway Time-out '
def test_send_sms_raises_if_firetext_rejects_with_timeout ( rmock ) :
to = content = reference = ' foo '
with pytest . raises ( MMGClientResponseException ) as exc :
rmock . register_uri ( ' POST ' , ' https://api.mmg.co.uk/json/api.php ' , exc = ReadTimeout )
mmg_client . send_sms ( to , content , reference )
assert exc . value . status_code == 504
assert exc . value . text == ' Gateway Time-out '