76 lines
3.6 KiB
Python
76 lines
3.6 KiB
Python
# standard imports
|
|
import logging
|
|
import os
|
|
|
|
# external imports
|
|
import pytest
|
|
import requests_mock
|
|
|
|
|
|
# local imports
|
|
from cic_notify.error import NotInitializedError, AlreadyInitializedError, NotificationSendError
|
|
from cic_notify.tasks.sms.africastalking import AfricasTalkingNotifier
|
|
|
|
# test imports
|
|
from tests.helpers.phone import phone_number
|
|
|
|
|
|
def test_africas_talking_notifier(africastalking_response, caplog):
|
|
caplog.set_level(logging.DEBUG)
|
|
with pytest.raises(NotInitializedError) as error:
|
|
AfricasTalkingNotifier()
|
|
assert str(error.value) == ''
|
|
|
|
api_key = os.urandom(24).hex()
|
|
sender_id = 'bar'
|
|
username = 'sandbox'
|
|
AfricasTalkingNotifier.initialize(username, api_key, sender_id)
|
|
africastalking_notifier = AfricasTalkingNotifier()
|
|
assert africastalking_notifier.sender_id == sender_id
|
|
assert africastalking_notifier.initiated is True
|
|
|
|
with pytest.raises(AlreadyInitializedError) as error:
|
|
AfricasTalkingNotifier.initialize(username, api_key, sender_id)
|
|
assert str(error.value) == ''
|
|
|
|
with requests_mock.Mocker(real_http=False) as request_mocker:
|
|
message = 'Hello world.'
|
|
recipient = phone_number()
|
|
africastalking_response.get('SMSMessageData').get('Recipients')[0]['number'] = recipient
|
|
request_mocker.register_uri(method='POST',
|
|
headers={'content-type': 'application/json'},
|
|
json=africastalking_response,
|
|
url='https://api.sandbox.africastalking.com/version1/messaging',
|
|
status_code=200)
|
|
africastalking_notifier.send(message, recipient)
|
|
assert f'Africastalking response sender-id {africastalking_response}' in caplog.text
|
|
africastalking_notifier.sender_id = None
|
|
africastalking_notifier.send(message, recipient)
|
|
assert f'africastalking response no-sender-id {africastalking_response}' in caplog.text
|
|
with pytest.raises(NotificationSendError) as error:
|
|
status = 'InvalidPhoneNumber'
|
|
status_code = 403
|
|
africastalking_response.get('SMSMessageData').get('Recipients')[0]['status'] = status
|
|
africastalking_response.get('SMSMessageData').get('Recipients')[0]['statusCode'] = status_code
|
|
|
|
request_mocker.register_uri(method='POST',
|
|
headers={'content-type': 'application/json'},
|
|
json=africastalking_response,
|
|
url='https://api.sandbox.africastalking.com/version1/messaging',
|
|
status_code=200)
|
|
africastalking_notifier.send(message, recipient)
|
|
assert str(error.value) == f'Sending notification failed due to: {status}'
|
|
with pytest.raises(NotificationSendError) as error:
|
|
recipients = []
|
|
status = 'InsufficientBalance'
|
|
africastalking_response.get('SMSMessageData')['Recipients'] = recipients
|
|
africastalking_response.get('SMSMessageData')['Message'] = status
|
|
|
|
request_mocker.register_uri(method='POST',
|
|
headers={'content-type': 'application/json'},
|
|
json=africastalking_response,
|
|
url='https://api.sandbox.africastalking.com/version1/messaging',
|
|
status_code=200)
|
|
africastalking_notifier.send(message, recipient)
|
|
assert str(error.value) == f'Unexpected number of recipients: {len(recipients)}. Status: {status}'
|