sms: factorize OVH & SMS Factor low credit alert tests (#81143)

This commit is contained in:
Corentin Sechet 2023-09-18 18:57:30 +02:00
parent aed4c44107
commit 5fe9b9a1e6
3 changed files with 55 additions and 77 deletions

View File

@ -111,6 +111,17 @@ class OVHSMSGateway(TrackCreditSMSResource):
],
}
TEST_CREDIT_LEFT = {
'create_kwargs': {
'account': 'sms-test42',
'application_key': 'RHrTdU2oTsrVC0pu',
'application_secret': 'CLjtS69tTcPgCKxedeoZlgMSoQGSiXMa',
'consumer_key': 'iF0zi0MJrbjNcI3hvuvwkhNk8skrigxz',
},
'url': (API_URL % {'serviceName': 'sms-test42'}),
'get_credit_left_payload': lambda x: {'creditsLeft': x},
}
class Meta:
verbose_name = 'OVH'
db_table = 'sms_ovh'

View File

@ -92,6 +92,14 @@ class SMSFactorSMSGateway(TrackCreditSMSResource):
}
URL = 'https://api.smsfactor.com'
TEST_CREDIT_LEFT = {
'create_kwargs': {
'auth_token': 'yyy',
},
'url': urllib.parse.urljoin(URL, 'credits'),
'get_credit_left_payload': lambda x: {'credits': str(x)},
}
def request(self, method, endpoint, **kwargs):
url = urllib.parse.urljoin(self.URL, endpoint)

View File

@ -497,59 +497,6 @@ def test_ovh_new_api_credit(app, freezer, admin_user):
connector.check_status()
def test_ovh_alert_emails(app, freezer, mailoutbox):
connector = OVHSMSGateway.objects.create(
slug='test-ovh',
title='Test OVH',
account='sms-test42',
application_key='RHrTdU2oTsrVC0pu',
application_secret='CLjtS69tTcPgCKxedeoZlgMSoQGSiXMa',
consumer_key='iF0zi0MJrbjNcI3hvuvwkhNk8skrigxz',
credit_threshold_alert=100,
credit_left=102,
alert_emails=['test@entrouvert.org'],
)
api = ApiUser.objects.create(username='apiuser')
obj_type = ContentType.objects.get_for_model(connector)
AccessRight.objects.create(
codename='can_send_messages', apiuser=api, resource_type=obj_type, resource_pk=connector.pk
)
freezer.move_to('2019-01-01 00:00:00')
resp = {'creditsLeft': 101}
ovh_url = connector.API_URL % {'serviceName': 'sms-test42'}
with tests.utils.mock_url(ovh_url, resp, 200):
connector.check_status()
assert len(mailoutbox) == 0
resp = {'creditsLeft': 99}
ovh_url = connector.API_URL % {'serviceName': 'sms-test42'}
with tests.utils.mock_url(ovh_url, resp, 200):
connector.check_status()
assert len(mailoutbox) == 1
mail = mailoutbox[0]
assert mail.recipients() == ['test@entrouvert.org']
assert mail.subject == 'SMS alert: only 99 credits left'
for body in (mail.body, mail.alternatives[0][0]):
assert connector.title in body
assert 'http://localhost/ovh/test-ovh/' in body
mailoutbox.clear()
# alert is sent again daily
freezer.move_to('2019-01-01 12:00:00')
resp = {'creditsLeft': 99}
ovh_url = connector.API_URL % {'serviceName': 'sms-test42'}
with tests.utils.mock_url(ovh_url, resp, 200):
connector.check_status()
assert len(mailoutbox) == 0
freezer.move_to('2019-01-02 01:00:07')
with tests.utils.mock_url(ovh_url, resp, 200):
connector.check_status()
assert len(mailoutbox) == 1
def test_ovh_token_request(admin_user, app):
connector = OVHSMSGateway.objects.create(
slug='test-ovh',
@ -783,52 +730,64 @@ def test_sfr_unicode_message(connector):
_check_media_type('unicode message 😀', 'SMSUnicodeLong')
def test_sms_factor_alert_emails(app, freezer, mailoutbox):
connector = SMSFactorSMSGateway.objects.create(
slug='test-sms-factor',
title='Test SMS Factor',
auth_token='foo',
credit_threshold_alert=100,
credit_left=102,
alert_emails=['test@entrouvert.org'],
credit_klasses = TrackCreditSMSResource.__subclasses__()
@pytest.fixture(params=credit_klasses)
def track_credit_connector(request, db):
klass = request.param
kwargs = getattr(klass, 'TEST_CREDIT_LEFT', {}).get('create_kwargs', {})
kwargs.update(
{
'title': klass.__name__,
'slug': klass.__name__.lower(),
'description': klass.__name__,
'credit_threshold_alert': 100,
'credit_left': 102,
'alert_emails': ['test@entrouvert.org'],
}
)
api = ApiUser.objects.create(username='apiuser')
obj_type = ContentType.objects.get_for_model(connector)
c = klass.objects.create(**kwargs)
api = ApiUser.objects.create(username='apiuser', fullname='Api User', description='api')
obj_type = ContentType.objects.get_for_model(c)
# no access check
AccessRight.objects.create(
codename='can_send_messages', apiuser=api, resource_type=obj_type, resource_pk=connector.pk
codename='can_send_messages', apiuser=api, resource_type=obj_type, resource_pk=c.pk
)
return c
def test_send_alert_emails(track_credit_connector, app, freezer, mailoutbox):
get_credit_left_payload = track_credit_connector.TEST_CREDIT_LEFT['get_credit_left_payload']
url = track_credit_connector.TEST_CREDIT_LEFT['url']
freezer.move_to('2019-01-01 00:00:00')
resp = {'credits': '101'}
url = connector.URL
resp = get_credit_left_payload(101)
with tests.utils.mock_url(url, resp, 200):
connector.check_status()
track_credit_connector.check_status()
assert len(mailoutbox) == 0
resp = {'credits': '99'}
url = connector.URL
resp = get_credit_left_payload(99)
with tests.utils.mock_url(url, resp, 200):
connector.check_status()
track_credit_connector.check_status()
assert len(mailoutbox) == 1
mail = mailoutbox[0]
assert mail.recipients() == ['test@entrouvert.org']
assert mail.subject == 'SMS alert: only 99 credits left'
for body in (mail.body, mail.alternatives[0][0]):
assert 'SMS Factor' in body
assert connector.title in body
assert 'http://localhost/smsfactor/test-sms-factor/' in body
assert track_credit_connector.title in body
assert track_credit_connector.get_absolute_url() in body
mailoutbox.clear()
# alert is sent again daily
freezer.move_to('2019-01-01 12:00:00')
resp = {'credits': 99}
url = connector.URL
resp = get_credit_left_payload(99)
with tests.utils.mock_url(url, resp, 200):
connector.check_status()
track_credit_connector.check_status()
assert len(mailoutbox) == 0
freezer.move_to('2019-01-02 01:00:07')
with tests.utils.mock_url(url, resp, 200):
connector.check_status()
track_credit_connector.check_status()
assert len(mailoutbox) == 1