2016-02-16 17:17:02 +00:00
|
|
|
|
import uuid
|
2016-09-28 17:02:57 +01:00
|
|
|
|
import pytest
|
2016-07-06 14:31:52 +01:00
|
|
|
|
from datetime import datetime
|
2016-06-20 13:33:53 +01:00
|
|
|
|
|
|
|
|
|
|
from freezegun import freeze_time
|
|
|
|
|
|
from sqlalchemy.exc import SQLAlchemyError
|
|
|
|
|
|
from sqlalchemy.orm.exc import NoResultFound
|
2016-03-16 13:33:12 +00:00
|
|
|
|
|
2016-08-05 10:44:43 +01:00
|
|
|
|
from app import (encryption, DATETIME_FORMAT)
|
2016-06-07 12:53:31 +01:00
|
|
|
|
from app.celery import provider_tasks
|
2016-06-20 13:33:53 +01:00
|
|
|
|
from app.celery import tasks
|
2016-09-07 15:35:12 +01:00
|
|
|
|
from app.celery.tasks import s3
|
2016-03-09 17:46:01 +00:00
|
|
|
|
from app.celery.tasks import (
|
|
|
|
|
|
send_sms,
|
|
|
|
|
|
process_job,
|
2016-06-17 16:39:03 +01:00
|
|
|
|
send_email
|
2016-03-09 17:46:01 +00:00
|
|
|
|
)
|
2016-09-28 13:53:05 +01:00
|
|
|
|
from app.dao import jobs_dao, services_dao
|
2016-09-28 17:02:57 +01:00
|
|
|
|
from app.models import Notification, KEY_TYPE_TEAM, KEY_TYPE_TEST, KEY_TYPE_NORMAL
|
2016-02-24 17:12:30 +00:00
|
|
|
|
from tests.app import load_example_csv
|
2016-03-03 12:05:18 +00:00
|
|
|
|
from tests.app.conftest import (
|
|
|
|
|
|
sample_service,
|
|
|
|
|
|
sample_user,
|
2016-03-09 11:28:52 +00:00
|
|
|
|
sample_template,
|
|
|
|
|
|
sample_job,
|
2016-03-09 13:57:53 +00:00
|
|
|
|
sample_email_template,
|
|
|
|
|
|
sample_notification
|
2016-03-03 12:05:18 +00:00
|
|
|
|
)
|
2016-02-24 17:12:30 +00:00
|
|
|
|
|
|
|
|
|
|
|
2016-03-18 11:47:01 +00:00
|
|
|
|
class AnyStringWith(str):
|
|
|
|
|
|
def __eq__(self, other):
|
|
|
|
|
|
return self in other
|
|
|
|
|
|
|
2016-05-10 09:04:22 +01:00
|
|
|
|
|
2016-04-06 14:31:33 +01:00
|
|
|
|
mmg_error = {'Error': '40', 'Description': 'error'}
|
|
|
|
|
|
|
2016-03-10 15:40:41 +00:00
|
|
|
|
|
2016-06-20 16:23:56 +01:00
|
|
|
|
def _notification_json(template, to, personalisation=None, job_id=None, row_number=None):
|
|
|
|
|
|
notification = {
|
|
|
|
|
|
"template": str(template.id),
|
|
|
|
|
|
"template_version": template.version,
|
|
|
|
|
|
"to": to,
|
2016-06-29 11:23:02 +01:00
|
|
|
|
"notification_type": template.template_type
|
2016-06-20 16:23:56 +01:00
|
|
|
|
}
|
|
|
|
|
|
if personalisation:
|
|
|
|
|
|
notification.update({"personalisation": personalisation})
|
|
|
|
|
|
if job_id:
|
|
|
|
|
|
notification.update({"job": str(job_id)})
|
|
|
|
|
|
if row_number:
|
|
|
|
|
|
notification['row_number'] = row_number
|
|
|
|
|
|
return notification
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-08-05 10:44:43 +01:00
|
|
|
|
def test_should_have_decorated_tasks_functions():
|
|
|
|
|
|
assert process_job.__wrapped__.__name__ == 'process_job'
|
|
|
|
|
|
assert send_sms.__wrapped__.__name__ == 'send_sms'
|
|
|
|
|
|
assert send_email.__wrapped__.__name__ == 'send_email'
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-02-25 11:23:04 +00:00
|
|
|
|
@freeze_time("2016-01-01 11:09:00.061258")
|
2016-09-07 15:35:12 +01:00
|
|
|
|
def test_should_process_sms_job(sample_job, mocker):
|
2016-02-24 17:12:30 +00:00
|
|
|
|
mocker.patch('app.celery.tasks.s3.get_job_from_s3', return_value=load_example_csv('sms'))
|
|
|
|
|
|
mocker.patch('app.celery.tasks.send_sms.apply_async')
|
|
|
|
|
|
mocker.patch('app.encryption.encrypt', return_value="something_encrypted")
|
|
|
|
|
|
mocker.patch('app.celery.tasks.create_uuid', return_value="uuid")
|
|
|
|
|
|
|
|
|
|
|
|
process_job(sample_job.id)
|
2016-04-07 13:44:04 +01:00
|
|
|
|
s3.get_job_from_s3.assert_called_once_with(
|
|
|
|
|
|
str(sample_job.service.id),
|
|
|
|
|
|
str(sample_job.id)
|
|
|
|
|
|
)
|
2016-03-09 07:27:26 +00:00
|
|
|
|
assert encryption.encrypt.call_args[0][0]['to'] == '+441234123123'
|
2016-05-13 16:25:05 +01:00
|
|
|
|
assert encryption.encrypt.call_args[0][0]['template'] == str(sample_job.template.id)
|
|
|
|
|
|
assert encryption.encrypt.call_args[0][0]['template_version'] == sample_job.template.version
|
2016-03-09 07:27:26 +00:00
|
|
|
|
assert encryption.encrypt.call_args[0][0]['personalisation'] == {}
|
2016-05-19 10:46:03 +01:00
|
|
|
|
assert encryption.encrypt.call_args[0][0]['row_number'] == 0
|
2016-02-24 17:12:30 +00:00
|
|
|
|
tasks.send_sms.apply_async.assert_called_once_with(
|
|
|
|
|
|
(str(sample_job.service_id),
|
|
|
|
|
|
"uuid",
|
2016-02-25 11:23:04 +00:00
|
|
|
|
"something_encrypted",
|
2016-03-08 17:45:37 +00:00
|
|
|
|
"2016-01-01T11:09:00.061258"),
|
2016-08-30 17:27:01 +01:00
|
|
|
|
queue="db-sms"
|
2016-02-24 17:12:30 +00:00
|
|
|
|
)
|
|
|
|
|
|
job = jobs_dao.dao_get_job_by_id(sample_job.id)
|
2016-10-05 14:56:32 +01:00
|
|
|
|
assert job.job_status == 'finished'
|
2016-02-24 17:12:30 +00:00
|
|
|
|
|
|
|
|
|
|
|
2016-09-28 13:53:05 +01:00
|
|
|
|
@freeze_time("2016-01-01 11:09:00.061258")
|
|
|
|
|
|
def test_should_process_sms_job_into_research_mode_queue_if_research_mode_service(notify_db, notify_db_session, mocker):
|
|
|
|
|
|
mocker.patch('app.celery.tasks.s3.get_job_from_s3', return_value=load_example_csv('sms'))
|
|
|
|
|
|
mocker.patch('app.celery.tasks.send_sms.apply_async')
|
|
|
|
|
|
mocker.patch('app.encryption.encrypt', return_value="something_encrypted")
|
|
|
|
|
|
mocker.patch('app.celery.tasks.create_uuid', return_value="uuid")
|
|
|
|
|
|
|
|
|
|
|
|
service = sample_service(notify_db, notify_db_session)
|
|
|
|
|
|
service.research_mode = True
|
|
|
|
|
|
services_dao.dao_update_service(service)
|
|
|
|
|
|
job = sample_job(notify_db, notify_db_session, service=service)
|
|
|
|
|
|
|
|
|
|
|
|
process_job(job.id)
|
|
|
|
|
|
s3.get_job_from_s3.assert_called_once_with(
|
|
|
|
|
|
str(job.service.id),
|
|
|
|
|
|
str(job.id)
|
|
|
|
|
|
)
|
|
|
|
|
|
tasks.send_sms.apply_async.assert_called_once_with(
|
|
|
|
|
|
(str(job.service_id),
|
|
|
|
|
|
"uuid",
|
|
|
|
|
|
"something_encrypted",
|
|
|
|
|
|
"2016-01-01T11:09:00.061258"),
|
|
|
|
|
|
queue="research-mode"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@freeze_time("2016-01-01 11:09:00.061258")
|
|
|
|
|
|
def test_should_process_email_job_into_research_mode_queue_if_research_mode_service(
|
|
|
|
|
|
notify_db, notify_db_session, mocker
|
|
|
|
|
|
):
|
|
|
|
|
|
mocker.patch('app.celery.tasks.s3.get_job_from_s3', return_value=load_example_csv('sms'))
|
|
|
|
|
|
mocker.patch('app.celery.tasks.send_email.apply_async')
|
|
|
|
|
|
mocker.patch('app.encryption.encrypt', return_value="something_encrypted")
|
|
|
|
|
|
mocker.patch('app.celery.tasks.create_uuid', return_value="uuid")
|
|
|
|
|
|
|
|
|
|
|
|
service = sample_service(notify_db, notify_db_session)
|
|
|
|
|
|
service.research_mode = True
|
|
|
|
|
|
services_dao.dao_update_service(service)
|
|
|
|
|
|
template = sample_email_template(notify_db, notify_db_session, service=service)
|
|
|
|
|
|
job = sample_job(notify_db, notify_db_session, template=template, service=service)
|
|
|
|
|
|
|
|
|
|
|
|
process_job(job.id)
|
|
|
|
|
|
s3.get_job_from_s3.assert_called_once_with(
|
|
|
|
|
|
str(job.service.id),
|
|
|
|
|
|
str(job.id)
|
|
|
|
|
|
)
|
|
|
|
|
|
tasks.send_email.apply_async.assert_called_once_with(
|
|
|
|
|
|
(str(job.service_id),
|
|
|
|
|
|
"uuid",
|
|
|
|
|
|
"something_encrypted",
|
|
|
|
|
|
"2016-01-01T11:09:00.061258"),
|
|
|
|
|
|
queue="research-mode"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-03-09 11:28:52 +00:00
|
|
|
|
@freeze_time("2016-01-01 11:09:00.061258")
|
2016-04-05 14:28:19 +01:00
|
|
|
|
def test_should_not_process_sms_job_if_would_exceed_send_limits(notify_db,
|
|
|
|
|
|
notify_db_session,
|
2016-09-07 15:35:12 +01:00
|
|
|
|
mocker):
|
2016-03-09 11:28:52 +00:00
|
|
|
|
service = sample_service(notify_db, notify_db_session, limit=9)
|
2016-03-09 14:49:14 +00:00
|
|
|
|
job = sample_job(notify_db, notify_db_session, service=service, notification_count=10)
|
2016-03-09 11:28:52 +00:00
|
|
|
|
|
|
|
|
|
|
mocker.patch('app.celery.tasks.s3.get_job_from_s3', return_value=load_example_csv('multiple_sms'))
|
|
|
|
|
|
mocker.patch('app.celery.tasks.send_sms.apply_async')
|
|
|
|
|
|
mocker.patch('app.encryption.encrypt', return_value="something_encrypted")
|
|
|
|
|
|
mocker.patch('app.celery.tasks.create_uuid', return_value="uuid")
|
|
|
|
|
|
|
|
|
|
|
|
process_job(job.id)
|
|
|
|
|
|
|
|
|
|
|
|
job = jobs_dao.dao_get_job_by_id(job.id)
|
2016-10-05 14:56:32 +01:00
|
|
|
|
assert job.job_status == 'sending limits exceeded'
|
2016-10-07 12:48:58 +01:00
|
|
|
|
assert s3.get_job_from_s3.called is False
|
|
|
|
|
|
assert tasks.send_sms.apply_async.called is False
|
2016-03-09 13:57:53 +00:00
|
|
|
|
|
|
|
|
|
|
|
2016-04-05 14:28:19 +01:00
|
|
|
|
def test_should_not_process_sms_job_if_would_exceed_send_limits_inc_today(notify_db,
|
|
|
|
|
|
notify_db_session,
|
2016-09-07 15:35:12 +01:00
|
|
|
|
mocker):
|
2016-03-09 13:57:53 +00:00
|
|
|
|
service = sample_service(notify_db, notify_db_session, limit=1)
|
|
|
|
|
|
job = sample_job(notify_db, notify_db_session, service=service)
|
|
|
|
|
|
|
|
|
|
|
|
sample_notification(notify_db, notify_db_session, service=service, job=job)
|
|
|
|
|
|
|
|
|
|
|
|
mocker.patch('app.celery.tasks.s3.get_job_from_s3', return_value=load_example_csv('sms'))
|
|
|
|
|
|
mocker.patch('app.celery.tasks.send_sms.apply_async')
|
|
|
|
|
|
mocker.patch('app.encryption.encrypt', return_value="something_encrypted")
|
|
|
|
|
|
mocker.patch('app.celery.tasks.create_uuid', return_value="uuid")
|
|
|
|
|
|
|
|
|
|
|
|
process_job(job.id)
|
|
|
|
|
|
|
|
|
|
|
|
job = jobs_dao.dao_get_job_by_id(job.id)
|
2016-10-05 14:56:32 +01:00
|
|
|
|
assert job.job_status == 'sending limits exceeded'
|
2016-10-07 12:48:58 +01:00
|
|
|
|
assert s3.get_job_from_s3.called is False
|
|
|
|
|
|
assert tasks.send_sms.apply_async.called is False
|
2016-03-09 13:57:53 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_should_not_process_email_job_if_would_exceed_send_limits_inc_today(notify_db, notify_db_session, mocker):
|
|
|
|
|
|
service = sample_service(notify_db, notify_db_session, limit=1)
|
|
|
|
|
|
template = sample_email_template(notify_db, notify_db_session, service=service)
|
|
|
|
|
|
job = sample_job(notify_db, notify_db_session, service=service, template=template)
|
|
|
|
|
|
|
|
|
|
|
|
sample_notification(notify_db, notify_db_session, service=service, job=job)
|
|
|
|
|
|
|
2016-03-09 14:49:14 +00:00
|
|
|
|
mocker.patch('app.celery.tasks.s3.get_job_from_s3', return_value=load_example_csv('email'))
|
2016-03-09 13:57:53 +00:00
|
|
|
|
mocker.patch('app.celery.tasks.send_email.apply_async')
|
|
|
|
|
|
mocker.patch('app.encryption.encrypt', return_value="something_encrypted")
|
|
|
|
|
|
mocker.patch('app.celery.tasks.create_uuid', return_value="uuid")
|
|
|
|
|
|
|
|
|
|
|
|
process_job(job.id)
|
|
|
|
|
|
|
|
|
|
|
|
job = jobs_dao.dao_get_job_by_id(job.id)
|
2016-10-05 14:56:32 +01:00
|
|
|
|
assert job.job_status == 'sending limits exceeded'
|
2016-10-07 12:48:58 +01:00
|
|
|
|
assert s3.get_job_from_s3.called is False
|
|
|
|
|
|
assert tasks.send_email.apply_async.called is False
|
2016-03-09 11:28:52 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@freeze_time("2016-01-01 11:09:00.061258")
|
2016-03-09 14:49:14 +00:00
|
|
|
|
def test_should_not_process_email_job_if_would_exceed_send_limits(notify_db, notify_db_session, mocker):
|
2016-03-09 13:57:53 +00:00
|
|
|
|
service = sample_service(notify_db, notify_db_session, limit=0)
|
2016-03-09 11:28:52 +00:00
|
|
|
|
template = sample_email_template(notify_db, notify_db_session, service=service)
|
|
|
|
|
|
job = sample_job(notify_db, notify_db_session, service=service, template=template)
|
|
|
|
|
|
|
2016-10-07 12:48:58 +01:00
|
|
|
|
mocker.patch('app.celery.tasks.s3.get_job_from_s3')
|
2016-03-09 11:28:52 +00:00
|
|
|
|
mocker.patch('app.celery.tasks.send_email.apply_async')
|
|
|
|
|
|
mocker.patch('app.encryption.encrypt', return_value="something_encrypted")
|
|
|
|
|
|
mocker.patch('app.celery.tasks.create_uuid', return_value="uuid")
|
|
|
|
|
|
|
|
|
|
|
|
process_job(job.id)
|
|
|
|
|
|
|
|
|
|
|
|
job = jobs_dao.dao_get_job_by_id(job.id)
|
2016-10-05 14:56:32 +01:00
|
|
|
|
assert job.job_status == 'sending limits exceeded'
|
2016-10-07 12:48:58 +01:00
|
|
|
|
assert s3.get_job_from_s3.called is False
|
|
|
|
|
|
assert tasks.send_email.apply_async.called is False
|
2016-03-09 11:28:52 +00:00
|
|
|
|
|
|
|
|
|
|
|
2016-03-09 11:35:12 +00:00
|
|
|
|
@freeze_time("2016-01-01 11:09:00.061258")
|
2016-04-25 16:37:55 +01:00
|
|
|
|
def test_should_process_email_job_if_exactly_on_send_limits(notify_db,
|
|
|
|
|
|
notify_db_session,
|
2016-09-07 15:35:12 +01:00
|
|
|
|
mocker):
|
2016-03-09 11:35:12 +00:00
|
|
|
|
service = sample_service(notify_db, notify_db_session, limit=10)
|
|
|
|
|
|
template = sample_email_template(notify_db, notify_db_session, service=service)
|
2016-03-09 14:49:14 +00:00
|
|
|
|
job = sample_job(notify_db, notify_db_session, service=service, template=template, notification_count=10)
|
2016-03-09 11:35:12 +00:00
|
|
|
|
|
|
|
|
|
|
mocker.patch('app.celery.tasks.s3.get_job_from_s3', return_value=load_example_csv('multiple_email'))
|
|
|
|
|
|
mocker.patch('app.celery.tasks.send_email.apply_async')
|
|
|
|
|
|
mocker.patch('app.encryption.encrypt', return_value="something_encrypted")
|
|
|
|
|
|
mocker.patch('app.celery.tasks.create_uuid', return_value="uuid")
|
|
|
|
|
|
|
|
|
|
|
|
process_job(job.id)
|
|
|
|
|
|
|
2016-04-07 13:44:04 +01:00
|
|
|
|
s3.get_job_from_s3.assert_called_once_with(
|
|
|
|
|
|
str(job.service.id),
|
|
|
|
|
|
str(job.id)
|
|
|
|
|
|
)
|
2016-03-09 11:35:12 +00:00
|
|
|
|
job = jobs_dao.dao_get_job_by_id(job.id)
|
2016-10-05 14:56:32 +01:00
|
|
|
|
assert job.job_status == 'finished'
|
2016-03-09 11:35:12 +00:00
|
|
|
|
tasks.send_email.apply_async.assert_called_with(
|
2016-04-25 16:37:55 +01:00
|
|
|
|
(
|
|
|
|
|
|
str(job.service_id),
|
|
|
|
|
|
"uuid",
|
|
|
|
|
|
"something_encrypted",
|
|
|
|
|
|
"2016-01-01T11:09:00.061258"
|
|
|
|
|
|
),
|
2016-08-30 17:27:01 +01:00
|
|
|
|
queue="db-email"
|
2016-03-09 11:35:12 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-09-07 15:35:12 +01:00
|
|
|
|
def test_should_not_create_send_task_for_empty_file(sample_job, mocker):
|
2016-02-25 09:59:50 +00:00
|
|
|
|
mocker.patch('app.celery.tasks.s3.get_job_from_s3', return_value=load_example_csv('empty'))
|
|
|
|
|
|
mocker.patch('app.celery.tasks.send_sms.apply_async')
|
|
|
|
|
|
|
|
|
|
|
|
process_job(sample_job.id)
|
|
|
|
|
|
|
2016-04-07 13:44:04 +01:00
|
|
|
|
s3.get_job_from_s3.assert_called_once_with(
|
|
|
|
|
|
str(sample_job.service.id),
|
|
|
|
|
|
str(sample_job.id)
|
|
|
|
|
|
)
|
2016-02-25 09:59:50 +00:00
|
|
|
|
job = jobs_dao.dao_get_job_by_id(sample_job.id)
|
2016-10-05 14:56:32 +01:00
|
|
|
|
assert job.job_status == 'finished'
|
2016-02-25 09:59:50 +00:00
|
|
|
|
|
|
|
|
|
|
|
2016-02-25 11:23:04 +00:00
|
|
|
|
@freeze_time("2016-01-01 11:09:00.061258")
|
2016-09-07 15:35:12 +01:00
|
|
|
|
def test_should_process_email_job(sample_email_job, mocker):
|
2016-02-25 09:59:50 +00:00
|
|
|
|
mocker.patch('app.celery.tasks.s3.get_job_from_s3', return_value=load_example_csv('email'))
|
|
|
|
|
|
mocker.patch('app.celery.tasks.send_email.apply_async')
|
|
|
|
|
|
mocker.patch('app.encryption.encrypt', return_value="something_encrypted")
|
|
|
|
|
|
mocker.patch('app.celery.tasks.create_uuid', return_value="uuid")
|
|
|
|
|
|
|
|
|
|
|
|
process_job(sample_email_job.id)
|
|
|
|
|
|
|
2016-04-07 13:44:04 +01:00
|
|
|
|
s3.get_job_from_s3.assert_called_once_with(
|
|
|
|
|
|
str(sample_email_job.service.id),
|
|
|
|
|
|
str(sample_email_job.id)
|
|
|
|
|
|
)
|
2016-03-09 07:27:26 +00:00
|
|
|
|
assert encryption.encrypt.call_args[0][0]['to'] == 'test@test.com'
|
2016-05-13 16:25:05 +01:00
|
|
|
|
assert encryption.encrypt.call_args[0][0]['template'] == str(sample_email_job.template.id)
|
|
|
|
|
|
assert encryption.encrypt.call_args[0][0]['template_version'] == sample_email_job.template.version
|
2016-03-09 07:27:26 +00:00
|
|
|
|
assert encryption.encrypt.call_args[0][0]['personalisation'] == {}
|
2016-02-25 09:59:50 +00:00
|
|
|
|
tasks.send_email.apply_async.assert_called_once_with(
|
2016-04-25 16:37:55 +01:00
|
|
|
|
(
|
|
|
|
|
|
str(sample_email_job.service_id),
|
|
|
|
|
|
"uuid",
|
|
|
|
|
|
"something_encrypted",
|
|
|
|
|
|
"2016-01-01T11:09:00.061258"
|
|
|
|
|
|
),
|
2016-08-30 17:27:01 +01:00
|
|
|
|
queue="db-email"
|
2016-02-25 09:59:50 +00:00
|
|
|
|
)
|
|
|
|
|
|
job = jobs_dao.dao_get_job_by_id(sample_email_job.id)
|
2016-10-05 14:56:32 +01:00
|
|
|
|
assert job.job_status == 'finished'
|
2016-02-25 09:59:50 +00:00
|
|
|
|
|
|
|
|
|
|
|
2016-04-05 14:28:19 +01:00
|
|
|
|
def test_should_process_all_sms_job(sample_job,
|
|
|
|
|
|
sample_job_with_placeholdered_template,
|
2016-09-07 15:35:12 +01:00
|
|
|
|
mocker):
|
2016-02-24 17:12:30 +00:00
|
|
|
|
mocker.patch('app.celery.tasks.s3.get_job_from_s3', return_value=load_example_csv('multiple_sms'))
|
|
|
|
|
|
mocker.patch('app.celery.tasks.send_sms.apply_async')
|
|
|
|
|
|
mocker.patch('app.encryption.encrypt', return_value="something_encrypted")
|
|
|
|
|
|
mocker.patch('app.celery.tasks.create_uuid', return_value="uuid")
|
|
|
|
|
|
|
2016-03-09 07:27:26 +00:00
|
|
|
|
process_job(sample_job_with_placeholdered_template.id)
|
2016-02-24 17:12:30 +00:00
|
|
|
|
|
2016-03-09 07:27:26 +00:00
|
|
|
|
s3.get_job_from_s3.assert_called_once_with(
|
2016-04-07 13:44:04 +01:00
|
|
|
|
str(sample_job_with_placeholdered_template.service.id),
|
|
|
|
|
|
str(sample_job_with_placeholdered_template.id)
|
2016-03-09 07:27:26 +00:00
|
|
|
|
)
|
|
|
|
|
|
assert encryption.encrypt.call_args[0][0]['to'] == '+441234123120'
|
2016-05-13 16:25:05 +01:00
|
|
|
|
assert encryption.encrypt.call_args[0][0]['template'] == str(sample_job_with_placeholdered_template.template.id)
|
2016-06-13 11:38:25 +01:00
|
|
|
|
assert encryption.encrypt.call_args[0][0][
|
|
|
|
|
|
'template_version'] == sample_job_with_placeholdered_template.template.version # noqa
|
2016-03-09 07:27:26 +00:00
|
|
|
|
assert encryption.encrypt.call_args[0][0]['personalisation'] == {'name': 'chris'}
|
2016-02-24 17:12:30 +00:00
|
|
|
|
tasks.send_sms.apply_async.call_count == 10
|
2016-03-09 07:27:26 +00:00
|
|
|
|
job = jobs_dao.dao_get_job_by_id(sample_job_with_placeholdered_template.id)
|
2016-10-05 14:56:32 +01:00
|
|
|
|
assert job.job_status == 'finished'
|
2016-02-16 17:17:02 +00:00
|
|
|
|
|
|
|
|
|
|
|
2016-06-13 11:38:25 +01:00
|
|
|
|
def test_should_send_template_to_correct_sms_task_and_persist(sample_template_with_placeholders, mocker):
|
2016-05-13 16:25:05 +01:00
|
|
|
|
notification = _notification_json(sample_template_with_placeholders,
|
|
|
|
|
|
to="+447234123123", personalisation={"name": "Jo"})
|
2016-06-22 13:32:27 +01:00
|
|
|
|
|
2016-09-28 15:05:50 +01:00
|
|
|
|
mocker.patch('app.celery.provider_tasks.deliver_sms.apply_async')
|
2016-02-16 17:17:02 +00:00
|
|
|
|
|
|
|
|
|
|
notification_id = uuid.uuid4()
|
2016-05-13 17:15:39 +01:00
|
|
|
|
|
2016-02-16 17:17:02 +00:00
|
|
|
|
send_sms(
|
2016-02-29 14:43:44 +00:00
|
|
|
|
sample_template_with_placeholders.service_id,
|
2016-02-16 17:17:02 +00:00
|
|
|
|
notification_id,
|
2016-06-22 13:32:27 +01:00
|
|
|
|
encryption.encrypt(notification),
|
|
|
|
|
|
datetime.utcnow().strftime(DATETIME_FORMAT)
|
2016-02-25 09:59:50 +00:00
|
|
|
|
)
|
2016-05-13 17:15:39 +01:00
|
|
|
|
|
2016-09-28 15:05:50 +01:00
|
|
|
|
provider_tasks.deliver_sms.apply_async.assert_called_once_with(
|
2016-09-30 13:34:44 +01:00
|
|
|
|
[notification_id],
|
2016-08-30 10:42:24 +01:00
|
|
|
|
queue="send-sms"
|
2016-03-10 13:22:45 +00:00
|
|
|
|
)
|
2016-06-07 12:53:31 +01:00
|
|
|
|
|
2016-06-21 14:38:17 +01:00
|
|
|
|
persisted_notification = Notification.query.filter_by(id=notification_id).one()
|
2016-02-16 17:17:02 +00:00
|
|
|
|
assert persisted_notification.id == notification_id
|
2016-03-16 13:33:12 +00:00
|
|
|
|
assert persisted_notification.to == '+447234123123'
|
2016-02-29 14:43:44 +00:00
|
|
|
|
assert persisted_notification.template_id == sample_template_with_placeholders.id
|
2016-05-13 16:25:05 +01:00
|
|
|
|
assert persisted_notification.template_version == sample_template_with_placeholders.version
|
2016-06-21 14:38:17 +01:00
|
|
|
|
assert persisted_notification.status == 'created'
|
2016-06-22 13:32:27 +01:00
|
|
|
|
assert persisted_notification.created_at <= datetime.utcnow()
|
2016-06-07 12:53:31 +01:00
|
|
|
|
assert not persisted_notification.sent_at
|
|
|
|
|
|
assert not persisted_notification.sent_by
|
2016-02-23 17:39:08 +00:00
|
|
|
|
assert not persisted_notification.job_id
|
2016-06-22 13:32:27 +01:00
|
|
|
|
assert persisted_notification.personalisation == {'name': 'Jo'}
|
|
|
|
|
|
assert persisted_notification._personalisation == encryption.encrypt({"name": "Jo"})
|
2016-07-06 14:31:52 +01:00
|
|
|
|
assert persisted_notification.notification_type == 'sms'
|
2016-02-23 17:39:08 +00:00
|
|
|
|
|
|
|
|
|
|
|
2016-09-28 15:29:10 +01:00
|
|
|
|
def test_should_put_send_sms_task_in_research_mode_queue_if_research_mode_service(notify_db, notify_db_session, mocker):
|
|
|
|
|
|
service = sample_service(notify_db, notify_db_session)
|
|
|
|
|
|
service.research_mode = True
|
|
|
|
|
|
services_dao.dao_update_service(service)
|
|
|
|
|
|
|
|
|
|
|
|
template = sample_template(notify_db, notify_db_session, service=service)
|
|
|
|
|
|
|
|
|
|
|
|
notification = _notification_json(template, to="+447234123123")
|
|
|
|
|
|
|
|
|
|
|
|
mocker.patch('app.celery.provider_tasks.deliver_sms.apply_async')
|
|
|
|
|
|
|
|
|
|
|
|
notification_id = uuid.uuid4()
|
|
|
|
|
|
|
|
|
|
|
|
send_sms(
|
|
|
|
|
|
template.service_id,
|
|
|
|
|
|
notification_id,
|
|
|
|
|
|
encryption.encrypt(notification),
|
|
|
|
|
|
datetime.utcnow().strftime(DATETIME_FORMAT)
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
provider_tasks.deliver_sms.apply_async.assert_called_once_with(
|
2016-09-30 13:34:44 +01:00
|
|
|
|
[notification_id],
|
2016-09-28 15:29:10 +01:00
|
|
|
|
queue="research-mode"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-03-03 12:05:18 +00:00
|
|
|
|
def test_should_send_sms_if_restricted_service_and_valid_number(notify_db, notify_db_session, mocker):
|
2016-03-11 13:11:10 +00:00
|
|
|
|
user = sample_user(notify_db, notify_db_session, mobile_numnber="07700 900890")
|
2016-03-03 12:05:18 +00:00
|
|
|
|
service = sample_service(notify_db, notify_db_session, user=user, restricted=True)
|
|
|
|
|
|
template = sample_template(notify_db, notify_db_session, service=service)
|
2016-05-13 16:25:05 +01:00
|
|
|
|
notification = _notification_json(template, "+447700900890") # The user’s own number, but in a different format
|
|
|
|
|
|
|
2016-09-28 15:05:50 +01:00
|
|
|
|
mocker.patch('app.celery.provider_tasks.deliver_sms.apply_async')
|
2016-03-03 12:05:18 +00:00
|
|
|
|
|
|
|
|
|
|
notification_id = uuid.uuid4()
|
2016-06-22 13:32:27 +01:00
|
|
|
|
encrypt_notification = encryption.encrypt(notification)
|
2016-03-03 12:05:18 +00:00
|
|
|
|
send_sms(
|
|
|
|
|
|
service.id,
|
|
|
|
|
|
notification_id,
|
2016-06-22 13:32:27 +01:00
|
|
|
|
encrypt_notification,
|
|
|
|
|
|
datetime.utcnow().strftime(DATETIME_FORMAT)
|
2016-03-03 12:05:18 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
2016-09-28 15:05:50 +01:00
|
|
|
|
provider_tasks.deliver_sms.apply_async.assert_called_once_with(
|
2016-09-30 13:34:44 +01:00
|
|
|
|
[notification_id],
|
2016-08-30 10:42:24 +01:00
|
|
|
|
queue="send-sms"
|
2016-03-10 13:22:45 +00:00
|
|
|
|
)
|
2016-03-03 12:05:18 +00:00
|
|
|
|
|
2016-06-21 14:38:17 +01:00
|
|
|
|
persisted_notification = Notification.query.filter_by(id=notification_id).one()
|
|
|
|
|
|
assert persisted_notification.id == notification_id
|
|
|
|
|
|
assert persisted_notification.to == '+447700900890'
|
|
|
|
|
|
assert persisted_notification.template_id == template.id
|
|
|
|
|
|
assert persisted_notification.template_version == template.version
|
|
|
|
|
|
assert persisted_notification.status == 'created'
|
2016-06-22 13:32:27 +01:00
|
|
|
|
assert persisted_notification.created_at <= datetime.utcnow()
|
2016-06-21 14:38:17 +01:00
|
|
|
|
assert not persisted_notification.sent_at
|
|
|
|
|
|
assert not persisted_notification.sent_by
|
|
|
|
|
|
assert not persisted_notification.job_id
|
2016-06-22 13:32:27 +01:00
|
|
|
|
assert not persisted_notification.personalisation
|
2016-07-06 14:31:52 +01:00
|
|
|
|
assert persisted_notification.notification_type == 'sms'
|
2016-06-21 14:38:17 +01:00
|
|
|
|
|
2016-03-03 12:05:18 +00:00
|
|
|
|
|
2016-09-07 09:57:20 +01:00
|
|
|
|
def test_should_not_send_sms_if_restricted_service_and_invalid_number_with_test_key(notify_db,
|
|
|
|
|
|
notify_db_session,
|
|
|
|
|
|
mocker):
|
|
|
|
|
|
user = sample_user(notify_db, notify_db_session, mobile_numnber="07700 900205")
|
|
|
|
|
|
service = sample_service(notify_db, notify_db_session, user=user, restricted=True)
|
|
|
|
|
|
template = sample_template(notify_db, notify_db_session, service=service)
|
|
|
|
|
|
|
|
|
|
|
|
notification = _notification_json(template, "07700 900849")
|
2016-09-28 15:05:50 +01:00
|
|
|
|
mocker.patch('app.celery.provider_tasks.deliver_sms.apply_async')
|
2016-09-07 09:57:20 +01:00
|
|
|
|
|
|
|
|
|
|
notification_id = uuid.uuid4()
|
|
|
|
|
|
send_sms(
|
|
|
|
|
|
service.id,
|
|
|
|
|
|
notification_id,
|
|
|
|
|
|
encryption.encrypt(notification),
|
|
|
|
|
|
datetime.utcnow().strftime(DATETIME_FORMAT),
|
|
|
|
|
|
key_type=KEY_TYPE_TEST
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2016-09-28 15:05:50 +01:00
|
|
|
|
provider_tasks.deliver_sms.apply_async.assert_called_once_with(
|
2016-09-30 13:34:44 +01:00
|
|
|
|
[notification_id],
|
2016-09-07 09:57:20 +01:00
|
|
|
|
queue="send-sms"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
persisted_notification = Notification.query.filter_by(id=notification_id).one()
|
|
|
|
|
|
assert persisted_notification.id == notification_id
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_should_not_send_email_if_restricted_service_and_invalid_email_address_with_test_key(notify_db,
|
|
|
|
|
|
notify_db_session,
|
|
|
|
|
|
mocker):
|
|
|
|
|
|
user = sample_user(notify_db, notify_db_session)
|
|
|
|
|
|
service = sample_service(notify_db, notify_db_session, user=user, restricted=True)
|
|
|
|
|
|
template = sample_template(
|
|
|
|
|
|
notify_db, notify_db_session, service=service, template_type='email', subject_line='Hello'
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
notification = _notification_json(template, to="test@example.com")
|
2016-09-28 15:05:50 +01:00
|
|
|
|
mocker.patch('app.celery.provider_tasks.deliver_email.apply_async')
|
2016-09-07 09:57:20 +01:00
|
|
|
|
|
|
|
|
|
|
notification_id = uuid.uuid4()
|
|
|
|
|
|
send_email(
|
|
|
|
|
|
service.id,
|
|
|
|
|
|
notification_id,
|
|
|
|
|
|
encryption.encrypt(notification),
|
|
|
|
|
|
datetime.utcnow().strftime(DATETIME_FORMAT),
|
|
|
|
|
|
key_type=KEY_TYPE_TEST
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2016-09-28 15:05:50 +01:00
|
|
|
|
provider_tasks.deliver_email.apply_async.assert_called_once_with(
|
2016-09-30 13:34:44 +01:00
|
|
|
|
[notification_id],
|
2016-09-07 09:57:20 +01:00
|
|
|
|
queue="send-email"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
persisted_notification = Notification.query.filter_by(id=notification_id).one()
|
|
|
|
|
|
assert persisted_notification.id == notification_id
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-03-03 12:05:18 +00:00
|
|
|
|
def test_should_not_send_sms_if_restricted_service_and_invalid_number(notify_db, notify_db_session, mocker):
|
2016-03-11 13:11:10 +00:00
|
|
|
|
user = sample_user(notify_db, notify_db_session, mobile_numnber="07700 900205")
|
2016-03-03 12:05:18 +00:00
|
|
|
|
service = sample_service(notify_db, notify_db_session, user=user, restricted=True)
|
|
|
|
|
|
template = sample_template(notify_db, notify_db_session, service=service)
|
|
|
|
|
|
|
2016-05-13 16:25:05 +01:00
|
|
|
|
notification = _notification_json(template, "07700 900849")
|
2016-09-28 15:05:50 +01:00
|
|
|
|
mocker.patch('app.celery.provider_tasks.deliver_sms.apply_async')
|
2016-03-03 12:05:18 +00:00
|
|
|
|
|
|
|
|
|
|
notification_id = uuid.uuid4()
|
|
|
|
|
|
send_sms(
|
|
|
|
|
|
service.id,
|
|
|
|
|
|
notification_id,
|
2016-06-22 13:32:27 +01:00
|
|
|
|
encryption.encrypt(notification),
|
|
|
|
|
|
datetime.utcnow().strftime(DATETIME_FORMAT)
|
2016-03-03 12:05:18 +00:00
|
|
|
|
)
|
2016-10-07 12:48:58 +01:00
|
|
|
|
assert provider_tasks.deliver_sms.apply_async.called is False
|
2016-05-31 14:55:06 +01:00
|
|
|
|
with pytest.raises(NoResultFound):
|
2016-06-21 14:38:17 +01:00
|
|
|
|
Notification.query.filter_by(id=notification_id).one()
|
2016-03-03 12:05:18 +00:00
|
|
|
|
|
|
|
|
|
|
|
2016-04-05 15:27:16 +01:00
|
|
|
|
def test_should_not_send_email_if_restricted_service_and_invalid_email_address(notify_db, notify_db_session, mocker):
|
|
|
|
|
|
user = sample_user(notify_db, notify_db_session)
|
|
|
|
|
|
service = sample_service(notify_db, notify_db_session, user=user, restricted=True)
|
|
|
|
|
|
template = sample_template(
|
|
|
|
|
|
notify_db, notify_db_session, service=service, template_type='email', subject_line='Hello'
|
|
|
|
|
|
)
|
2016-05-13 16:25:05 +01:00
|
|
|
|
notification = _notification_json(template, to="test@example.com")
|
2016-04-05 15:27:16 +01:00
|
|
|
|
|
|
|
|
|
|
notification_id = uuid.uuid4()
|
2016-04-06 15:56:34 +01:00
|
|
|
|
send_email(
|
2016-04-05 15:27:16 +01:00
|
|
|
|
service.id,
|
|
|
|
|
|
notification_id,
|
2016-06-22 13:32:27 +01:00
|
|
|
|
encryption.encrypt(notification),
|
|
|
|
|
|
datetime.utcnow().strftime(DATETIME_FORMAT)
|
2016-04-05 15:27:16 +01:00
|
|
|
|
)
|
|
|
|
|
|
|
2016-05-31 14:55:06 +01:00
|
|
|
|
with pytest.raises(NoResultFound):
|
2016-06-21 14:38:17 +01:00
|
|
|
|
Notification.query.filter_by(id=notification_id).one()
|
2016-04-05 15:27:16 +01:00
|
|
|
|
|
|
|
|
|
|
|
2016-09-28 15:48:12 +01:00
|
|
|
|
def test_should_put_send_email_task_in_research_mode_queue_if_research_mode_service(
|
|
|
|
|
|
notify_db, notify_db_session, mocker
|
|
|
|
|
|
):
|
2016-09-28 15:29:10 +01:00
|
|
|
|
service = sample_service(notify_db, notify_db_session)
|
|
|
|
|
|
service.research_mode = True
|
|
|
|
|
|
services_dao.dao_update_service(service)
|
|
|
|
|
|
|
|
|
|
|
|
template = sample_email_template(notify_db, notify_db_session, service=service)
|
|
|
|
|
|
|
|
|
|
|
|
notification = _notification_json(template, to="test@test.com")
|
|
|
|
|
|
|
|
|
|
|
|
mocker.patch('app.celery.provider_tasks.deliver_email.apply_async')
|
|
|
|
|
|
|
|
|
|
|
|
notification_id = uuid.uuid4()
|
|
|
|
|
|
|
|
|
|
|
|
send_email(
|
|
|
|
|
|
template.service_id,
|
|
|
|
|
|
notification_id,
|
|
|
|
|
|
encryption.encrypt(notification),
|
|
|
|
|
|
datetime.utcnow().strftime(DATETIME_FORMAT)
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
provider_tasks.deliver_email.apply_async.assert_called_once_with(
|
2016-09-30 13:34:44 +01:00
|
|
|
|
[notification_id],
|
2016-09-28 15:29:10 +01:00
|
|
|
|
queue="research-mode"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-06-30 17:32:49 +01:00
|
|
|
|
def test_should_send_sms_template_to_and_persist_with_job_id(sample_job, sample_api_key, mocker):
|
2016-05-19 10:46:03 +01:00
|
|
|
|
notification = _notification_json(
|
|
|
|
|
|
sample_job.template,
|
|
|
|
|
|
to="+447234123123",
|
|
|
|
|
|
job_id=sample_job.id,
|
|
|
|
|
|
row_number=2)
|
2016-09-28 15:05:50 +01:00
|
|
|
|
mocker.patch('app.celery.provider_tasks.deliver_sms.apply_async')
|
2016-02-23 17:39:08 +00:00
|
|
|
|
|
|
|
|
|
|
notification_id = uuid.uuid4()
|
|
|
|
|
|
send_sms(
|
|
|
|
|
|
sample_job.service.id,
|
|
|
|
|
|
notification_id,
|
2016-06-22 13:32:27 +01:00
|
|
|
|
encryption.encrypt(notification),
|
2016-06-30 17:32:49 +01:00
|
|
|
|
datetime.utcnow().strftime(DATETIME_FORMAT),
|
|
|
|
|
|
api_key_id=str(sample_api_key.id),
|
2016-09-28 17:02:57 +01:00
|
|
|
|
key_type=KEY_TYPE_NORMAL
|
2016-03-08 17:45:37 +00:00
|
|
|
|
)
|
2016-09-28 15:05:50 +01:00
|
|
|
|
provider_tasks.deliver_sms.apply_async.assert_called_once_with(
|
2016-09-30 13:34:44 +01:00
|
|
|
|
[notification_id],
|
2016-08-30 10:42:24 +01:00
|
|
|
|
queue="send-sms"
|
2016-03-10 13:22:45 +00:00
|
|
|
|
)
|
2016-06-21 14:38:17 +01:00
|
|
|
|
persisted_notification = Notification.query.filter_by(id=notification_id).one()
|
2016-02-23 17:39:08 +00:00
|
|
|
|
assert persisted_notification.id == notification_id
|
2016-03-16 13:33:12 +00:00
|
|
|
|
assert persisted_notification.to == '+447234123123'
|
2016-02-23 17:39:08 +00:00
|
|
|
|
assert persisted_notification.job_id == sample_job.id
|
|
|
|
|
|
assert persisted_notification.template_id == sample_job.template.id
|
2016-06-21 14:38:17 +01:00
|
|
|
|
assert persisted_notification.status == 'created'
|
2016-06-07 12:53:31 +01:00
|
|
|
|
assert not persisted_notification.sent_at
|
2016-06-22 13:32:27 +01:00
|
|
|
|
assert persisted_notification.created_at <= datetime.utcnow()
|
2016-06-07 12:53:31 +01:00
|
|
|
|
assert not persisted_notification.sent_by
|
2016-05-19 10:46:03 +01:00
|
|
|
|
assert persisted_notification.job_row_number == 2
|
2016-06-30 17:32:49 +01:00
|
|
|
|
assert persisted_notification.api_key_id == sample_api_key.id
|
2016-09-28 17:02:57 +01:00
|
|
|
|
assert persisted_notification.key_type == KEY_TYPE_NORMAL
|
2016-07-06 14:31:52 +01:00
|
|
|
|
assert persisted_notification.notification_type == 'sms'
|
2016-02-16 17:17:02 +00:00
|
|
|
|
|
|
|
|
|
|
|
2016-09-28 17:02:57 +01:00
|
|
|
|
def test_should_not_send_email_if_team_key_and_recipient_not_in_team(sample_email_template_with_placeholders,
|
|
|
|
|
|
sample_team_api_key,
|
|
|
|
|
|
mocker):
|
2016-05-19 10:46:03 +01:00
|
|
|
|
notification = _notification_json(
|
|
|
|
|
|
sample_email_template_with_placeholders,
|
|
|
|
|
|
"my_email@my_email.com",
|
|
|
|
|
|
{"name": "Jo"},
|
|
|
|
|
|
row_number=1)
|
2016-09-30 11:07:32 +01:00
|
|
|
|
apply_async = mocker.patch('app.celery.provider_tasks.deliver_email.apply_async')
|
2016-09-28 17:02:57 +01:00
|
|
|
|
notification_id = uuid.uuid4()
|
|
|
|
|
|
|
|
|
|
|
|
team_members = [user.email_address for user in sample_email_template_with_placeholders.service.users]
|
|
|
|
|
|
assert "my_email@my_email.com" not in team_members
|
|
|
|
|
|
|
|
|
|
|
|
with freeze_time("2016-01-01 11:09:00.00000"):
|
|
|
|
|
|
now = datetime.utcnow()
|
|
|
|
|
|
|
|
|
|
|
|
send_email(
|
|
|
|
|
|
sample_email_template_with_placeholders.service_id,
|
|
|
|
|
|
notification_id,
|
|
|
|
|
|
encryption.encrypt(notification),
|
|
|
|
|
|
now.strftime(DATETIME_FORMAT),
|
|
|
|
|
|
api_key_id=str(sample_team_api_key.id),
|
|
|
|
|
|
key_type=KEY_TYPE_TEAM
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
with pytest.raises(NoResultFound):
|
|
|
|
|
|
persisted_notification = Notification.query.filter_by(id=notification_id).one()
|
|
|
|
|
|
print(persisted_notification)
|
|
|
|
|
|
|
|
|
|
|
|
apply_async.not_called()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_should_not_send_sms_if_team_key_and_recipient_not_in_team(notify_db, notify_db_session, mocker):
|
|
|
|
|
|
user = sample_user(notify_db, notify_db_session, mobile_numnber="07700 900205")
|
|
|
|
|
|
service = sample_service(notify_db, notify_db_session, user=user, restricted=True)
|
|
|
|
|
|
template = sample_template(notify_db, notify_db_session, service=service)
|
|
|
|
|
|
|
|
|
|
|
|
team_members = [user.mobile_number for user in service.users]
|
|
|
|
|
|
assert "07890 300000" not in team_members
|
|
|
|
|
|
|
|
|
|
|
|
notification = _notification_json(template, "07700 900849")
|
|
|
|
|
|
mocker.patch('app.celery.provider_tasks.send_sms_to_provider.apply_async')
|
|
|
|
|
|
|
|
|
|
|
|
notification_id = uuid.uuid4()
|
|
|
|
|
|
send_sms(
|
|
|
|
|
|
service.id,
|
|
|
|
|
|
notification_id,
|
|
|
|
|
|
encryption.encrypt(notification),
|
|
|
|
|
|
datetime.utcnow().strftime(DATETIME_FORMAT)
|
|
|
|
|
|
)
|
2016-10-07 12:48:58 +01:00
|
|
|
|
assert provider_tasks.send_sms_to_provider.apply_async.called is False
|
2016-09-28 17:02:57 +01:00
|
|
|
|
with pytest.raises(NoResultFound):
|
|
|
|
|
|
Notification.query.filter_by(id=notification_id).one()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_should_use_email_template_and_persist(sample_email_template_with_placeholders, sample_api_key, mocker):
|
|
|
|
|
|
notification = _notification_json(
|
|
|
|
|
|
sample_email_template_with_placeholders,
|
|
|
|
|
|
'my_email@my_email.com',
|
|
|
|
|
|
{"name": "Jo"},
|
|
|
|
|
|
row_number=1)
|
2016-09-28 15:05:50 +01:00
|
|
|
|
mocker.patch('app.celery.provider_tasks.deliver_email.apply_async')
|
2016-02-22 17:17:29 +00:00
|
|
|
|
|
|
|
|
|
|
notification_id = uuid.uuid4()
|
2016-05-13 17:15:39 +01:00
|
|
|
|
|
2016-06-30 17:32:49 +01:00
|
|
|
|
with freeze_time("2016-01-01 11:09:00.00000"):
|
|
|
|
|
|
now = datetime.utcnow()
|
2016-05-13 17:15:39 +01:00
|
|
|
|
|
2016-06-30 17:32:49 +01:00
|
|
|
|
with freeze_time("2016-01-01 11:10:00.00000"):
|
|
|
|
|
|
send_email(
|
|
|
|
|
|
sample_email_template_with_placeholders.service_id,
|
|
|
|
|
|
notification_id,
|
|
|
|
|
|
encryption.encrypt(notification),
|
|
|
|
|
|
now.strftime(DATETIME_FORMAT),
|
|
|
|
|
|
api_key_id=str(sample_api_key.id),
|
2016-09-28 17:02:57 +01:00
|
|
|
|
key_type=sample_api_key.key_type
|
2016-06-30 17:32:49 +01:00
|
|
|
|
)
|
2016-05-13 17:15:39 +01:00
|
|
|
|
|
2016-06-21 14:38:17 +01:00
|
|
|
|
persisted_notification = Notification.query.filter_by(id=notification_id).one()
|
2016-09-28 15:05:50 +01:00
|
|
|
|
provider_tasks.deliver_email.apply_async.assert_called_once_with(
|
2016-09-30 13:34:44 +01:00
|
|
|
|
[notification_id], queue='send-email')
|
2016-05-13 17:15:39 +01:00
|
|
|
|
|
2016-04-13 15:31:08 +01:00
|
|
|
|
assert persisted_notification.id == notification_id
|
|
|
|
|
|
assert persisted_notification.to == 'my_email@my_email.com'
|
|
|
|
|
|
assert persisted_notification.template_id == sample_email_template_with_placeholders.id
|
2016-05-13 16:25:05 +01:00
|
|
|
|
assert persisted_notification.template_version == sample_email_template_with_placeholders.version
|
|
|
|
|
|
assert persisted_notification.created_at == now
|
2016-07-01 14:14:28 +01:00
|
|
|
|
assert not persisted_notification.sent_at
|
|
|
|
|
|
assert persisted_notification.status == 'created'
|
|
|
|
|
|
assert not persisted_notification.sent_by
|
2016-05-19 10:46:03 +01:00
|
|
|
|
assert persisted_notification.job_row_number == 1
|
2016-06-22 13:32:27 +01:00
|
|
|
|
assert persisted_notification.personalisation == {'name': 'Jo'}
|
|
|
|
|
|
assert persisted_notification._personalisation == encryption.encrypt({"name": "Jo"})
|
2016-06-30 17:32:49 +01:00
|
|
|
|
assert persisted_notification.api_key_id == sample_api_key.id
|
2016-09-28 17:02:57 +01:00
|
|
|
|
assert persisted_notification.key_type == KEY_TYPE_NORMAL
|
2016-07-06 14:31:52 +01:00
|
|
|
|
assert persisted_notification.notification_type == 'email'
|
2016-05-13 16:25:05 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_send_email_should_use_template_version_from_job_not_latest(sample_email_template, mocker):
|
|
|
|
|
|
notification = _notification_json(sample_email_template, 'my_email@my_email.com')
|
|
|
|
|
|
version_on_notification = sample_email_template.version
|
|
|
|
|
|
# Change the template
|
|
|
|
|
|
from app.dao.templates_dao import dao_update_template, dao_get_template_by_id
|
|
|
|
|
|
sample_email_template.content = sample_email_template.content + " another version of the template"
|
2016-09-28 15:05:50 +01:00
|
|
|
|
mocker.patch('app.celery.provider_tasks.deliver_email.apply_async')
|
2016-05-13 16:25:05 +01:00
|
|
|
|
dao_update_template(sample_email_template)
|
|
|
|
|
|
t = dao_get_template_by_id(sample_email_template.id)
|
|
|
|
|
|
assert t.version > version_on_notification
|
|
|
|
|
|
notification_id = uuid.uuid4()
|
|
|
|
|
|
now = datetime.utcnow()
|
|
|
|
|
|
send_email(
|
|
|
|
|
|
sample_email_template.service_id,
|
|
|
|
|
|
notification_id,
|
2016-07-01 14:14:28 +01:00
|
|
|
|
encryption.encrypt(notification),
|
2016-05-13 16:25:05 +01:00
|
|
|
|
now.strftime(DATETIME_FORMAT)
|
|
|
|
|
|
)
|
2016-07-01 14:14:28 +01:00
|
|
|
|
|
2016-09-30 13:34:44 +01:00
|
|
|
|
provider_tasks.deliver_email.apply_async.assert_called_once_with([notification_id], queue='send-email')
|
2016-05-13 16:25:05 +01:00
|
|
|
|
|
2016-06-21 14:38:17 +01:00
|
|
|
|
persisted_notification = Notification.query.filter_by(id=notification_id).one()
|
2016-05-13 16:25:05 +01:00
|
|
|
|
assert persisted_notification.id == notification_id
|
|
|
|
|
|
assert persisted_notification.to == 'my_email@my_email.com'
|
|
|
|
|
|
assert persisted_notification.template_id == sample_email_template.id
|
|
|
|
|
|
assert persisted_notification.template_version == version_on_notification
|
2016-04-13 15:31:08 +01:00
|
|
|
|
assert persisted_notification.created_at == now
|
2016-07-01 14:14:28 +01:00
|
|
|
|
assert not persisted_notification.sent_at
|
|
|
|
|
|
assert persisted_notification.status == 'created'
|
|
|
|
|
|
assert not persisted_notification.sent_by
|
2016-07-06 14:31:52 +01:00
|
|
|
|
assert persisted_notification.notification_type == 'email'
|
2016-04-13 15:31:08 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_should_use_email_template_subject_placeholders(sample_email_template_with_placeholders, mocker):
|
2016-05-13 16:25:05 +01:00
|
|
|
|
notification = _notification_json(sample_email_template_with_placeholders,
|
|
|
|
|
|
"my_email@my_email.com", {"name": "Jo"})
|
2016-09-28 15:05:50 +01:00
|
|
|
|
mocker.patch('app.celery.provider_tasks.deliver_email.apply_async')
|
2016-04-13 15:31:08 +01:00
|
|
|
|
|
|
|
|
|
|
notification_id = uuid.uuid4()
|
|
|
|
|
|
now = datetime.utcnow()
|
|
|
|
|
|
send_email(
|
|
|
|
|
|
sample_email_template_with_placeholders.service_id,
|
|
|
|
|
|
notification_id,
|
2016-06-22 13:32:27 +01:00
|
|
|
|
encryption.encrypt(notification),
|
2016-04-13 15:31:08 +01:00
|
|
|
|
now.strftime(DATETIME_FORMAT)
|
|
|
|
|
|
)
|
2016-09-28 15:05:50 +01:00
|
|
|
|
provider_tasks.deliver_email.apply_async.assert_called_once_with(
|
2016-09-30 13:34:44 +01:00
|
|
|
|
[notification_id], queue='send-email'
|
2016-02-22 17:17:29 +00:00
|
|
|
|
)
|
2016-06-21 14:38:17 +01:00
|
|
|
|
persisted_notification = Notification.query.filter_by(id=notification_id).one()
|
2016-02-22 17:17:29 +00:00
|
|
|
|
assert persisted_notification.id == notification_id
|
|
|
|
|
|
assert persisted_notification.to == 'my_email@my_email.com'
|
2016-02-29 14:43:44 +00:00
|
|
|
|
assert persisted_notification.template_id == sample_email_template_with_placeholders.id
|
2016-07-01 14:14:28 +01:00
|
|
|
|
assert persisted_notification.status == 'created'
|
|
|
|
|
|
assert not persisted_notification.sent_by
|
2016-06-22 13:32:27 +01:00
|
|
|
|
assert persisted_notification.personalisation == {"name": "Jo"}
|
2016-07-01 14:14:28 +01:00
|
|
|
|
assert not persisted_notification.reference
|
2016-07-06 14:31:52 +01:00
|
|
|
|
assert persisted_notification.notification_type == 'email'
|
2016-03-11 09:40:35 +00:00
|
|
|
|
|
|
|
|
|
|
|
2016-05-13 16:25:05 +01:00
|
|
|
|
def test_should_use_email_template_and_persist_without_personalisation(sample_email_template, mocker):
|
2016-06-22 13:32:27 +01:00
|
|
|
|
notification = _notification_json(sample_email_template, "my_email@my_email.com")
|
2016-09-28 15:05:50 +01:00
|
|
|
|
mocker.patch('app.celery.provider_tasks.deliver_email.apply_async')
|
2016-03-02 12:27:07 +00:00
|
|
|
|
|
|
|
|
|
|
notification_id = uuid.uuid4()
|
2016-06-30 17:32:49 +01:00
|
|
|
|
|
2016-03-02 12:27:07 +00:00
|
|
|
|
now = datetime.utcnow()
|
|
|
|
|
|
send_email(
|
|
|
|
|
|
sample_email_template.service_id,
|
|
|
|
|
|
notification_id,
|
2016-06-22 13:32:27 +01:00
|
|
|
|
encryption.encrypt(notification),
|
2016-03-08 17:45:37 +00:00
|
|
|
|
now.strftime(DATETIME_FORMAT)
|
2016-03-02 12:27:07 +00:00
|
|
|
|
)
|
2016-09-30 13:34:44 +01:00
|
|
|
|
provider_tasks.deliver_email.apply_async.assert_called_once_with([notification_id], queue='send-email')
|
2016-07-01 17:12:03 +01:00
|
|
|
|
|
2016-06-22 13:32:27 +01:00
|
|
|
|
persisted_notification = Notification.query.filter_by(id=notification_id).one()
|
|
|
|
|
|
assert persisted_notification.id == notification_id
|
|
|
|
|
|
assert persisted_notification.to == 'my_email@my_email.com'
|
|
|
|
|
|
assert persisted_notification.template_id == sample_email_template.id
|
|
|
|
|
|
assert persisted_notification.created_at == now
|
2016-07-01 14:14:28 +01:00
|
|
|
|
assert not persisted_notification.sent_at
|
|
|
|
|
|
assert persisted_notification.status == 'created'
|
|
|
|
|
|
assert not persisted_notification.sent_by
|
2016-06-22 13:32:27 +01:00
|
|
|
|
assert not persisted_notification.personalisation
|
2016-07-01 14:14:28 +01:00
|
|
|
|
assert not persisted_notification.reference
|
|
|
|
|
|
assert persisted_notification.notification_type == 'email'
|
2016-03-02 12:27:07 +00:00
|
|
|
|
|
|
|
|
|
|
|
2016-07-01 14:14:28 +01:00
|
|
|
|
def test_send_sms_should_go_to_retry_queue_if_database_errors(sample_template, mocker):
|
2016-05-13 16:25:05 +01:00
|
|
|
|
notification = _notification_json(sample_template, "+447234123123")
|
2016-06-07 12:53:31 +01:00
|
|
|
|
|
|
|
|
|
|
expected_exception = SQLAlchemyError()
|
|
|
|
|
|
|
2016-09-28 15:05:50 +01:00
|
|
|
|
mocker.patch('app.celery.provider_tasks.deliver_sms.apply_async')
|
2016-06-07 12:53:31 +01:00
|
|
|
|
mocker.patch('app.celery.tasks.send_sms.retry', side_effect=Exception())
|
|
|
|
|
|
mocker.patch('app.celery.tasks.dao_create_notification', side_effect=expected_exception)
|
2016-02-25 09:59:50 +00:00
|
|
|
|
now = datetime.utcnow()
|
2016-02-16 17:17:02 +00:00
|
|
|
|
|
|
|
|
|
|
notification_id = uuid.uuid4()
|
|
|
|
|
|
|
2016-06-07 12:53:31 +01:00
|
|
|
|
with pytest.raises(Exception):
|
|
|
|
|
|
send_sms(
|
|
|
|
|
|
sample_template.service_id,
|
|
|
|
|
|
notification_id,
|
2016-06-22 13:32:27 +01:00
|
|
|
|
encryption.encrypt(notification),
|
2016-06-07 12:53:31 +01:00
|
|
|
|
now.strftime(DATETIME_FORMAT)
|
|
|
|
|
|
)
|
2016-10-07 12:48:58 +01:00
|
|
|
|
assert provider_tasks.deliver_sms.apply_async.called is False
|
2016-06-07 12:53:31 +01:00
|
|
|
|
tasks.send_sms.retry.assert_called_with(exc=expected_exception, queue='retry')
|
2016-02-16 17:17:02 +00:00
|
|
|
|
|
2016-06-07 12:53:31 +01:00
|
|
|
|
with pytest.raises(NoResultFound) as e:
|
2016-06-21 14:38:17 +01:00
|
|
|
|
Notification.query.filter_by(id=notification_id).one()
|
2016-06-07 12:53:31 +01:00
|
|
|
|
assert 'No row was found for one' in str(e.value)
|
2016-02-16 17:17:02 +00:00
|
|
|
|
|
2016-06-13 11:38:25 +01:00
|
|
|
|
|
2016-07-01 14:14:28 +01:00
|
|
|
|
def test_send_email_should_go_to_retry_queue_if_database_errors(sample_email_template, mocker):
|
|
|
|
|
|
notification = _notification_json(sample_email_template, "test@example.gov.uk")
|
2016-02-22 17:17:29 +00:00
|
|
|
|
|
2016-07-01 14:14:28 +01:00
|
|
|
|
expected_exception = SQLAlchemyError()
|
2016-02-22 17:17:29 +00:00
|
|
|
|
|
2016-09-28 15:05:50 +01:00
|
|
|
|
mocker.patch('app.celery.provider_tasks.deliver_email.apply_async')
|
2016-07-01 14:14:28 +01:00
|
|
|
|
mocker.patch('app.celery.tasks.send_email.retry', side_effect=Exception())
|
|
|
|
|
|
mocker.patch('app.celery.tasks.dao_create_notification', side_effect=expected_exception)
|
2016-02-25 09:59:50 +00:00
|
|
|
|
now = datetime.utcnow()
|
2016-02-22 17:17:29 +00:00
|
|
|
|
|
|
|
|
|
|
notification_id = uuid.uuid4()
|
|
|
|
|
|
|
2016-07-01 14:14:28 +01:00
|
|
|
|
with pytest.raises(Exception):
|
|
|
|
|
|
send_email(
|
|
|
|
|
|
sample_email_template.service_id,
|
|
|
|
|
|
notification_id,
|
|
|
|
|
|
encryption.encrypt(notification),
|
|
|
|
|
|
now.strftime(DATETIME_FORMAT)
|
|
|
|
|
|
)
|
2016-10-07 12:48:58 +01:00
|
|
|
|
assert provider_tasks.deliver_email.apply_async.called is False
|
2016-07-01 14:14:28 +01:00
|
|
|
|
tasks.send_email.retry.assert_called_with(exc=expected_exception, queue='retry')
|
|
|
|
|
|
|
|
|
|
|
|
with pytest.raises(NoResultFound) as e:
|
|
|
|
|
|
Notification.query.filter_by(id=notification_id).one()
|
|
|
|
|
|
assert 'No row was found for one' in str(e.value)
|