mirror of
https://github.com/GSA/notifications-api.git
synced 2025-12-22 08:21:13 -05:00
139 lines
5.3 KiB
Python
139 lines
5.3 KiB
Python
import json
|
|
|
|
import pytest
|
|
import requests_mock
|
|
from requests import HTTPError
|
|
from requests.exceptions import ConnectTimeout, ReadTimeout
|
|
|
|
from app import mmg_client
|
|
from app.clients.sms import SmsClientResponseException
|
|
|
|
from app.clients.sms.mmg import get_mmg_responses, MMGClientResponseException
|
|
|
|
|
|
def test_should_return_correct_details_for_delivery():
|
|
response_dict = get_mmg_responses('3')
|
|
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']
|
|
|
|
|
|
def test_send_sms_successful_returns_mmg_response(notify_api, mocker):
|
|
to = content = reference = 'foo'
|
|
response_dict = {'Reference': 12345678}
|
|
|
|
with requests_mock.Mocker() as request_mock:
|
|
request_mock.post('https://api.mmg.co.uk/json/api.php', json=response_dict, status_code=200)
|
|
response = mmg_client.send_sms(to, content, reference)
|
|
|
|
response_json = response.json()
|
|
assert response.status_code == 200
|
|
assert response_json['Reference'] == 12345678
|
|
|
|
|
|
def test_send_sms_calls_mmg_correctly(notify_api, mocker):
|
|
to = '+447234567890'
|
|
content = 'my message'
|
|
reference = 'my reference'
|
|
response_dict = {'Reference': 12345678}
|
|
|
|
with requests_mock.Mocker() as request_mock:
|
|
request_mock.post('https://api.mmg.co.uk/json/api.php', json=response_dict, status_code=200)
|
|
mmg_client.send_sms(to, content, reference)
|
|
|
|
assert request_mock.call_count == 1
|
|
assert request_mock.request_history[0].url == 'https://api.mmg.co.uk/json/api.php'
|
|
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
|
|
assert request_args['sender'] == 'testing'
|
|
assert request_args['cid'] == reference
|
|
assert request_args['multi'] is True
|
|
|
|
|
|
def test_send_sms_raises_if_mmg_rejects(notify_api, mocker):
|
|
to = content = reference = 'foo'
|
|
response_dict = {
|
|
'Error': 206,
|
|
'Description': 'Some kind of error'
|
|
}
|
|
|
|
with pytest.raises(SmsClientResponseException) as exc, requests_mock.Mocker() as request_mock:
|
|
request_mock.post('https://api.mmg.co.uk/json/api.php', json=response_dict, status_code=400)
|
|
mmg_client.send_sms(to, content, reference)
|
|
|
|
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
|
|
|
|
|
|
def test_send_sms_override_configured_shortcode_with_sender(notify_api, mocker):
|
|
to = '+447234567890'
|
|
content = 'my message'
|
|
reference = 'my reference'
|
|
response_dict = {'Reference': 12345678}
|
|
sender = 'fromservice'
|
|
|
|
with requests_mock.Mocker() as request_mock:
|
|
request_mock.post('https://api.mmg.co.uk/json/api.php', json=response_dict, status_code=200)
|
|
mmg_client.send_sms(to, content, reference, sender=sender)
|
|
|
|
request_args = request_mock.request_history[0].json()
|
|
assert request_args['sender'] == 'fromservice'
|
|
|
|
|
|
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"}}'
|
|
|
|
|
|
def test_send_sms_raises_if_mmg_rejects_with_connect_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_mmg_rejects_with_read_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'
|