Persist intl fields on notification

This commit is contained in:
Imdad Ahad
2017-04-27 12:41:10 +01:00
parent a8ea333606
commit 252c3235d7
2 changed files with 95 additions and 20 deletions

View File

@@ -2,9 +2,13 @@ from datetime import datetime
from flask import current_app from flask import current_app
from notifications_utils.recipients import (
get_international_phone_info,
validate_and_format_phone_number
)
from app import redis_store from app import redis_store
from app.celery import provider_tasks from app.celery import provider_tasks
from notifications_utils.recipients import validate_and_format_phone_number
from notifications_utils.clients import redis from notifications_utils.clients import redis
from app.dao.notifications_dao import dao_create_notification, dao_delete_notifications_and_history_by_id from app.dao.notifications_dao import dao_create_notification, dao_delete_notifications_and_history_by_id
from app.models import SMS_TYPE, Notification, KEY_TYPE_TEST, EMAIL_TYPE from app.models import SMS_TYPE, Notification, KEY_TYPE_TEST, EMAIL_TYPE
@@ -25,22 +29,23 @@ def check_placeholders(template_object):
raise BadRequestError(fields=[{'template': message}], message=message) raise BadRequestError(fields=[{'template': message}], message=message)
def persist_notification(template_id, def persist_notification(
template_version, template_id,
recipient, template_version,
service, recipient,
personalisation, service,
notification_type, personalisation,
api_key_id, notification_type,
key_type, api_key_id,
created_at=None, key_type,
job_id=None, created_at=None,
job_row_number=None, job_id=None,
reference=None, job_row_number=None,
client_reference=None, reference=None,
notification_id=None, client_reference=None,
simulated=False): notification_id=None,
# if simulated create a Notification model to return but do not persist the Notification to the dB simulated=False
):
notification = Notification( notification = Notification(
id=notification_id, id=notification_id,
template_id=template_id, template_id=template_id,
@@ -58,6 +63,15 @@ def persist_notification(template_id,
client_reference=client_reference, client_reference=client_reference,
reference=reference reference=reference
) )
if notification_type == SMS_TYPE:
formatted_recipient = validate_and_format_phone_number(recipient, international=True)
recipient_info = get_international_phone_info(formatted_recipient)
notification.international = recipient_info.international
notification.phone_prefix = recipient_info.country_prefix
notification.rate_multiplier = recipient_info.billable_units
# if simulated create a Notification model to return but do not persist the Notification to the dB
if not simulated: if not simulated:
dao_create_notification(notification) dao_create_notification(notification)
if key_type != KEY_TYPE_TEST: if key_type != KEY_TYPE_TEST:

View File

@@ -1,7 +1,7 @@
import datetime import datetime
import uuid import uuid
import pytest import pytest
from boto3.exceptions import Boto3Error from boto3.exceptions import Boto3Error
from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.exc import SQLAlchemyError
from freezegun import freeze_time from freezegun import freeze_time
@@ -199,8 +199,8 @@ def test_persist_notification_with_optionals(sample_job, sample_api_key, mocker)
assert persisted_notification.client_reference == "ref from client" assert persisted_notification.client_reference == "ref from client"
assert persisted_notification.reference is None assert persisted_notification.reference is None
assert persisted_notification.international is False assert persisted_notification.international is False
assert persisted_notification.phone_prefix is None assert persisted_notification.phone_prefix == '44'
assert persisted_notification.rate_multiplier is None assert persisted_notification.rate_multiplier == 1
@freeze_time("2016-01-01 11:09:00.061258") @freeze_time("2016-01-01 11:09:00.061258")
@@ -297,3 +297,64 @@ def test_simulated_recipient(notify_api, to_address, notification_type, expected
is_simulated_address = simulated_recipient(formatted_address, notification_type) is_simulated_address = simulated_recipient(formatted_address, notification_type)
assert is_simulated_address == expected assert is_simulated_address == expected
@pytest.mark.parametrize('recipient, expected_international, expected_prefix, expected_units', [
('7900900123', False, '44', 1), # UK
('+447900900123', False, '44', 1), # UK
('07700900222', False, '44', 1), # UK
('73122345678', True, '7', 1), # Russia
('360623400400', True, '36', 3)] # Hungary
)
def test_persist_notification_with_international_info_stores_correct_info(
sample_job,
sample_api_key,
mocker,
recipient,
expected_international,
expected_prefix,
expected_units
):
persist_notification(
template_id=sample_job.template.id,
template_version=sample_job.template.version,
recipient=recipient,
service=sample_job.service,
personalisation=None,
notification_type='sms',
api_key_id=sample_api_key.id,
key_type=sample_api_key.key_type,
job_id=sample_job.id,
job_row_number=10,
client_reference="ref from client"
)
persisted_notification = Notification.query.all()[0]
assert persisted_notification.international is expected_international
assert persisted_notification.phone_prefix == expected_prefix
assert persisted_notification.rate_multiplier == expected_units
def test_persist_notification_with_international_info_does_not_store_for_email(
sample_job,
sample_api_key,
mocker
):
persist_notification(
template_id=sample_job.template.id,
template_version=sample_job.template.version,
recipient='foo@bar.com',
service=sample_job.service,
personalisation=None,
notification_type='email',
api_key_id=sample_api_key.id,
key_type=sample_api_key.key_type,
job_id=sample_job.id,
job_row_number=10,
client_reference="ref from client"
)
persisted_notification = Notification.query.all()[0]
assert persisted_notification.international is False
assert persisted_notification.phone_prefix is None
assert persisted_notification.rate_multiplier is None