mirror of
https://github.com/GSA/notifications-api.git
synced 2026-02-02 09:26:08 -05:00
[WIP] updating notification to start in the created status
This commit is contained in:
@@ -48,28 +48,29 @@ def retry_iteration_to_delay(retry=0):
|
|||||||
|
|
||||||
|
|
||||||
@notify_celery.task(bind=True, name="send-sms-to-provider", max_retries=5, default_retry_delay=5)
|
@notify_celery.task(bind=True, name="send-sms-to-provider", max_retries=5, default_retry_delay=5)
|
||||||
def send_sms_to_provider(self, service_id, notification_id, encrypted_notification):
|
def send_sms_to_provider(self, service_id, notification_id, encrypted_notification=None):
|
||||||
task_start = monotonic()
|
task_start = monotonic()
|
||||||
|
|
||||||
service = dao_fetch_service_by_id(service_id)
|
service = dao_fetch_service_by_id(service_id)
|
||||||
provider = provider_to_use('sms', notification_id)
|
provider = provider_to_use('sms', notification_id)
|
||||||
notification = get_notification_by_id(notification_id)
|
notification = get_notification_by_id(notification_id)
|
||||||
|
|
||||||
notification_json = encryption.decrypt(encrypted_notification)
|
# notification_json = encryption.decrypt(encrypted_notification)
|
||||||
|
|
||||||
template = Template(
|
template = Template(
|
||||||
dao_get_template_by_id(notification.template_id, notification.template_version).__dict__,
|
dao_get_template_by_id(notification.template_id, notification.template_version).__dict__,
|
||||||
values=notification_json.get('personalisation', {}),
|
values=notification.personalisation['personalisation'] if notification.personalisation[
|
||||||
|
'personalisation'] else {},
|
||||||
prefix=service.name
|
prefix=service.name
|
||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
if service.research_mode:
|
if service.research_mode:
|
||||||
send_sms_response.apply_async(
|
send_sms_response.apply_async(
|
||||||
(provider.get_name(), str(notification_id), notification_json['to']), queue='research-mode'
|
(provider.get_name(), str(notification_id), notification.to), queue='research-mode'
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
provider.send_sms(
|
provider.send_sms(
|
||||||
to=validate_and_format_phone_number(notification_json['to']),
|
to=validate_and_format_phone_number(notification.to),
|
||||||
content=template.replaced,
|
content=template.replaced,
|
||||||
reference=str(notification_id)
|
reference=str(notification_id)
|
||||||
)
|
)
|
||||||
@@ -84,6 +85,7 @@ def send_sms_to_provider(self, service_id, notification_id, encrypted_notificati
|
|||||||
notification.sent_at = datetime.utcnow()
|
notification.sent_at = datetime.utcnow()
|
||||||
notification.sent_by = provider.get_name(),
|
notification.sent_by = provider.get_name(),
|
||||||
notification.content_char_count = template.replaced_content_count
|
notification.content_char_count = template.replaced_content_count
|
||||||
|
notification.status = 'sending'
|
||||||
dao_update_notification(notification)
|
dao_update_notification(notification)
|
||||||
except SmsClientException as e:
|
except SmsClientException as e:
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -348,7 +348,7 @@ class Notification(db.Model):
|
|||||||
nullable=True,
|
nullable=True,
|
||||||
onupdate=datetime.datetime.utcnow)
|
onupdate=datetime.datetime.utcnow)
|
||||||
status = db.Column(
|
status = db.Column(
|
||||||
db.Enum(*NOTIFICATION_STATUS_TYPES, name='notify_status_type'), nullable=False, default='sending')
|
db.Enum(*NOTIFICATION_STATUS_TYPES, name='notify_status_type'), nullable=False, default='created')
|
||||||
reference = db.Column(db.String, nullable=True, index=True)
|
reference = db.Column(db.String, nullable=True, index=True)
|
||||||
_personalisation = db.Column(db.String, nullable=True)
|
_personalisation = db.Column(db.String, nullable=True)
|
||||||
|
|
||||||
|
|||||||
@@ -83,7 +83,8 @@ def test_should_send_personalised_template_to_correct_sms_provider_and_persist(
|
|||||||
notify_db_session,
|
notify_db_session,
|
||||||
sample_template_with_placeholders,
|
sample_template_with_placeholders,
|
||||||
mocker):
|
mocker):
|
||||||
db_notification = sample_notification(notify_db, notify_db_session, template=sample_template_with_placeholders)
|
db_notification = sample_notification(notify_db, notify_db_session, template=sample_template_with_placeholders,
|
||||||
|
to_field="+447234123123", personalisation={"name": "Jo"})
|
||||||
|
|
||||||
notification = _notification_json(
|
notification = _notification_json(
|
||||||
sample_template_with_placeholders,
|
sample_template_with_placeholders,
|
||||||
@@ -124,13 +125,12 @@ def test_should_send_personalised_template_to_correct_sms_provider_and_persist(
|
|||||||
call("notifications.sms.total-time", ANY)
|
call("notifications.sms.total-time", ANY)
|
||||||
])
|
])
|
||||||
|
|
||||||
notification = notifications_dao.get_notification(
|
notification = Notification.query.filter_by(id=db_notification.id).one()
|
||||||
db_notification.service_id, db_notification.id
|
|
||||||
)
|
|
||||||
|
|
||||||
assert notification.status == 'sending'
|
assert notification.status == 'sending'
|
||||||
assert notification.sent_at > now
|
assert notification.sent_at > now
|
||||||
assert notification.sent_by == 'mmg'
|
assert notification.sent_by == 'mmg'
|
||||||
|
assert notification.content_char_count == 24
|
||||||
|
|
||||||
|
|
||||||
def test_should_send_template_to_correct_sms_provider_and_persist(
|
def test_should_send_template_to_correct_sms_provider_and_persist(
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ from tests.app.conftest import (sample_notification)
|
|||||||
|
|
||||||
|
|
||||||
def test_should_by_able_to_update_status_by_reference(sample_email_template, ses_provider):
|
def test_should_by_able_to_update_status_by_reference(sample_email_template, ses_provider):
|
||||||
data = _notification_json(sample_email_template)
|
data = _notification_json(sample_email_template, status='sending')
|
||||||
|
|
||||||
notification = Notification(**data)
|
notification = Notification(**data)
|
||||||
dao_create_notification(
|
dao_create_notification(
|
||||||
@@ -56,7 +56,7 @@ def test_should_by_able_to_update_status_by_reference(sample_email_template, ses
|
|||||||
|
|
||||||
|
|
||||||
def test_should_by_able_to_update_status_by_id(sample_template, sample_job, mmg_provider):
|
def test_should_by_able_to_update_status_by_id(sample_template, sample_job, mmg_provider):
|
||||||
data = _notification_json(sample_template, job_id=sample_job.id)
|
data = _notification_json(sample_template, job_id=sample_job.id, status='sending')
|
||||||
notification = Notification(**data)
|
notification = Notification(**data)
|
||||||
dao_create_notification(notification, sample_template.template_type)
|
dao_create_notification(notification, sample_template.template_type)
|
||||||
assert Notification.query.get(notification.id).status == 'sending'
|
assert Notification.query.get(notification.id).status == 'sending'
|
||||||
@@ -76,7 +76,7 @@ def test_should_not_update_status_by_id_if_not_sending_and_does_not_update_job(n
|
|||||||
|
|
||||||
|
|
||||||
def test_should_by_able_to_update_status_by_id_from_pending_to_delivered(sample_template, sample_job):
|
def test_should_by_able_to_update_status_by_id_from_pending_to_delivered(sample_template, sample_job):
|
||||||
data = _notification_json(sample_template, job_id=sample_job.id)
|
data = _notification_json(sample_template, job_id=sample_job.id, status='sending')
|
||||||
notification = Notification(**data)
|
notification = Notification(**data)
|
||||||
dao_create_notification(notification, sample_template.template_type)
|
dao_create_notification(notification, sample_template.template_type)
|
||||||
assert Notification.query.get(notification.id).status == 'sending'
|
assert Notification.query.get(notification.id).status == 'sending'
|
||||||
@@ -92,7 +92,7 @@ def test_should_by_able_to_update_status_by_id_from_pending_to_delivered(sample_
|
|||||||
|
|
||||||
|
|
||||||
def test_should_by_able_to_update_status_by_id_from_pending_to_temporary_failure(sample_template, sample_job):
|
def test_should_by_able_to_update_status_by_id_from_pending_to_temporary_failure(sample_template, sample_job):
|
||||||
data = _notification_json(sample_template, job_id=sample_job.id)
|
data = _notification_json(sample_template, job_id=sample_job.id, status='sending')
|
||||||
notification = Notification(**data)
|
notification = Notification(**data)
|
||||||
dao_create_notification(notification, sample_template.template_type)
|
dao_create_notification(notification, sample_template.template_type)
|
||||||
assert Notification.query.get(notification.id).status == 'sending'
|
assert Notification.query.get(notification.id).status == 'sending'
|
||||||
@@ -111,7 +111,7 @@ def test_should_by_able_to_update_status_by_id_from_pending_to_temporary_failure
|
|||||||
|
|
||||||
|
|
||||||
def test_should_by_able_to_update_status_by_id_from_sending_to_permanent_failure(sample_template, sample_job):
|
def test_should_by_able_to_update_status_by_id_from_sending_to_permanent_failure(sample_template, sample_job):
|
||||||
data = _notification_json(sample_template, job_id=sample_job.id)
|
data = _notification_json(sample_template, job_id=sample_job.id, status='sending')
|
||||||
notification = Notification(**data)
|
notification = Notification(**data)
|
||||||
dao_create_notification(notification, sample_template.template_type)
|
dao_create_notification(notification, sample_template.template_type)
|
||||||
assert Notification.query.get(notification.id).status == 'sending'
|
assert Notification.query.get(notification.id).status == 'sending'
|
||||||
@@ -126,15 +126,14 @@ def test_should_by_able_to_update_status_by_id_from_sending_to_permanent_failure
|
|||||||
_assert_job_stats(sample_job.id, sent=1, count=1, delivered=0, failed=1)
|
_assert_job_stats(sample_job.id, sent=1, count=1, delivered=0, failed=1)
|
||||||
|
|
||||||
|
|
||||||
def test_should_not_update_status_one_notification_status_is_delivered(sample_email_template, sample_job, ses_provider):
|
def test_should_not_update_status_one_notification_status_is_delivered(notify_db, notify_db_session,
|
||||||
data = _notification_json(sample_email_template, job_id=sample_job.id)
|
sample_email_template,
|
||||||
|
ses_provider):
|
||||||
notification = Notification(**data)
|
notification = sample_notification(notify_db=notify_db, notify_db_session=notify_db_session,
|
||||||
dao_create_notification(
|
template=sample_email_template,
|
||||||
notification,
|
status='sending')
|
||||||
sample_email_template.template_type)
|
|
||||||
|
|
||||||
assert Notification.query.get(notification.id).status == "sending"
|
assert Notification.query.get(notification.id).status == "sending"
|
||||||
|
|
||||||
update_provider_stats(
|
update_provider_stats(
|
||||||
notification.id,
|
notification.id,
|
||||||
'email',
|
'email',
|
||||||
@@ -150,16 +149,18 @@ def test_should_not_update_status_one_notification_status_is_delivered(sample_em
|
|||||||
_assert_job_stats(notification.job_id, sent=1, count=1, delivered=1, failed=0)
|
_assert_job_stats(notification.job_id, sent=1, count=1, delivered=1, failed=0)
|
||||||
|
|
||||||
|
|
||||||
def test_should_be_able_to_record_statistics_failure_for_sms(sample_notification):
|
def test_should_be_able_to_record_statistics_failure_for_sms(notify_db, notify_db_session,):
|
||||||
assert Notification.query.get(sample_notification.id).status == 'sending'
|
notification = sample_notification(notify_db=notify_db, notify_db_session=notify_db_session, status='sending')
|
||||||
assert update_notification_status_by_id(sample_notification.id, 'permanent-failure', 'failure')
|
assert Notification.query.get(notification.id).status == 'sending'
|
||||||
assert Notification.query.get(sample_notification.id).status == 'permanent-failure'
|
|
||||||
_assert_notification_stats(sample_notification.service_id, sms_requested=1, sms_delivered=0, sms_failed=1)
|
assert update_notification_status_by_id(notification.id, 'permanent-failure', 'failure')
|
||||||
_assert_job_stats(sample_notification.job_id, sent=1, count=1, delivered=0, failed=1)
|
assert Notification.query.get(notification.id).status == 'permanent-failure'
|
||||||
|
_assert_notification_stats(notification.service_id, sms_requested=1, sms_delivered=0, sms_failed=1)
|
||||||
|
_assert_job_stats(notification.job_id, sent=1, count=1, delivered=0, failed=1)
|
||||||
|
|
||||||
|
|
||||||
def test_should_be_able_to_record_statistics_failure_for_email(sample_email_template, sample_job, ses_provider):
|
def test_should_be_able_to_record_statistics_failure_for_email(sample_email_template, sample_job, ses_provider):
|
||||||
data = _notification_json(sample_email_template, job_id=sample_job.id)
|
data = _notification_json(sample_email_template, job_id=sample_job.id, status='sending')
|
||||||
notification = Notification(**data)
|
notification = Notification(**data)
|
||||||
dao_create_notification(notification, sample_email_template.template_type)
|
dao_create_notification(notification, sample_email_template.template_type)
|
||||||
|
|
||||||
@@ -295,6 +296,46 @@ def test_should_be_able_to_get_all_statistics_for_a_service_for_several_days_pre
|
|||||||
assert stats[1].day == seven_days_ago.date()
|
assert stats[1].day == seven_days_ago.date()
|
||||||
|
|
||||||
|
|
||||||
|
def test_create_notification_creates_notification_with_personalisation(notify_db, notify_db_session,
|
||||||
|
sample_template_with_placeholders,
|
||||||
|
sample_job, mmg_provider):
|
||||||
|
|
||||||
|
assert Notification.query.count() == 0
|
||||||
|
assert NotificationStatistics.query.count() == 0
|
||||||
|
assert TemplateStatistics.query.count() == 0
|
||||||
|
|
||||||
|
data = sample_notification(notify_db=notify_db, notify_db_session=notify_db_session,
|
||||||
|
template=sample_template_with_placeholders,
|
||||||
|
job=sample_job,
|
||||||
|
personalisation={'name': 'Jo'},
|
||||||
|
status='created')
|
||||||
|
|
||||||
|
assert Notification.query.count() == 1
|
||||||
|
notification_from_db = Notification.query.all()[0]
|
||||||
|
assert notification_from_db.id
|
||||||
|
assert data.to == notification_from_db.to
|
||||||
|
assert data.job_id == notification_from_db.job_id
|
||||||
|
assert data.service == notification_from_db.service
|
||||||
|
assert data.template == notification_from_db.template
|
||||||
|
assert data.template_version == notification_from_db.template_version
|
||||||
|
assert data.created_at == notification_from_db.created_at
|
||||||
|
assert 'created' == notification_from_db.status
|
||||||
|
assert {'name': 'Jo'} == notification_from_db.personalisation
|
||||||
|
_assert_job_stats(sample_job.id, sent=1, count=1, delivered=0, failed=0)
|
||||||
|
|
||||||
|
stats = NotificationStatistics.query.filter(
|
||||||
|
NotificationStatistics.service_id == sample_template_with_placeholders.service.id).first()
|
||||||
|
assert stats.emails_requested == 0
|
||||||
|
assert stats.sms_requested == 1
|
||||||
|
|
||||||
|
template_stats = TemplateStatistics.query.filter(
|
||||||
|
TemplateStatistics.service_id == sample_template_with_placeholders.service.id,
|
||||||
|
TemplateStatistics.template_id == sample_template_with_placeholders.id).first()
|
||||||
|
assert template_stats.service_id == sample_template_with_placeholders.service.id
|
||||||
|
assert template_stats.template_id == sample_template_with_placeholders.id
|
||||||
|
assert template_stats.usage_count == 1
|
||||||
|
|
||||||
|
|
||||||
def test_save_notification_creates_sms_and_template_stats(sample_template, sample_job, mmg_provider):
|
def test_save_notification_creates_sms_and_template_stats(sample_template, sample_job, mmg_provider):
|
||||||
assert Notification.query.count() == 0
|
assert Notification.query.count() == 0
|
||||||
assert NotificationStatistics.query.count() == 0
|
assert NotificationStatistics.query.count() == 0
|
||||||
@@ -314,7 +355,7 @@ def test_save_notification_creates_sms_and_template_stats(sample_template, sampl
|
|||||||
assert data['template'] == notification_from_db.template
|
assert data['template'] == notification_from_db.template
|
||||||
assert data['template_version'] == notification_from_db.template_version
|
assert data['template_version'] == notification_from_db.template_version
|
||||||
assert data['created_at'] == notification_from_db.created_at
|
assert data['created_at'] == notification_from_db.created_at
|
||||||
assert 'sending' == notification_from_db.status
|
assert 'created' == notification_from_db.status
|
||||||
_assert_job_stats(sample_job.id, sent=1, count=1, delivered=0, failed=0)
|
_assert_job_stats(sample_job.id, sent=1, count=1, delivered=0, failed=0)
|
||||||
|
|
||||||
stats = NotificationStatistics.query.filter(NotificationStatistics.service_id == sample_template.service.id).first()
|
stats = NotificationStatistics.query.filter(NotificationStatistics.service_id == sample_template.service.id).first()
|
||||||
@@ -347,7 +388,7 @@ def test_save_notification_and_create_email_and_template_stats(sample_email_temp
|
|||||||
assert data['template'] == notification_from_db.template
|
assert data['template'] == notification_from_db.template
|
||||||
assert data['template_version'] == notification_from_db.template_version
|
assert data['template_version'] == notification_from_db.template_version
|
||||||
assert data['created_at'] == notification_from_db.created_at
|
assert data['created_at'] == notification_from_db.created_at
|
||||||
assert 'sending' == notification_from_db.status
|
assert 'created' == notification_from_db.status
|
||||||
_assert_job_stats(sample_job.id, sent=1, count=1, delivered=0, failed=0)
|
_assert_job_stats(sample_job.id, sent=1, count=1, delivered=0, failed=0)
|
||||||
|
|
||||||
stats = NotificationStatistics.query.filter(
|
stats = NotificationStatistics.query.filter(
|
||||||
@@ -484,7 +525,7 @@ def test_save_notification_and_increment_job(sample_template, sample_job, mmg_pr
|
|||||||
assert data['template'] == notification_from_db.template
|
assert data['template'] == notification_from_db.template
|
||||||
assert data['template_version'] == notification_from_db.template_version
|
assert data['template_version'] == notification_from_db.template_version
|
||||||
assert data['created_at'] == notification_from_db.created_at
|
assert data['created_at'] == notification_from_db.created_at
|
||||||
assert 'sending' == notification_from_db.status
|
assert 'created' == notification_from_db.status
|
||||||
assert Job.query.get(sample_job.id).notifications_sent == 1
|
assert Job.query.get(sample_job.id).notifications_sent == 1
|
||||||
|
|
||||||
notification_2 = Notification(**data)
|
notification_2 = Notification(**data)
|
||||||
@@ -535,7 +576,7 @@ def test_save_notification_and_increment_correct_job(notify_db, notify_db_sessio
|
|||||||
assert data['template'] == notification_from_db.template
|
assert data['template'] == notification_from_db.template
|
||||||
assert data['template_version'] == notification_from_db.template_version
|
assert data['template_version'] == notification_from_db.template_version
|
||||||
assert data['created_at'] == notification_from_db.created_at
|
assert data['created_at'] == notification_from_db.created_at
|
||||||
assert 'sending' == notification_from_db.status
|
assert 'created' == notification_from_db.status
|
||||||
assert job_1.id != job_2.id
|
assert job_1.id != job_2.id
|
||||||
_assert_job_stats(job_id=job_1.id, sent=1, count=1)
|
_assert_job_stats(job_id=job_1.id, sent=1, count=1)
|
||||||
_assert_job_stats(job_id=job_2.id, sent=0, count=1)
|
_assert_job_stats(job_id=job_2.id, sent=0, count=1)
|
||||||
@@ -556,7 +597,7 @@ def test_save_notification_with_no_job(sample_template, mmg_provider):
|
|||||||
assert data['template'] == notification_from_db.template
|
assert data['template'] == notification_from_db.template
|
||||||
assert data['template_version'] == notification_from_db.template_version
|
assert data['template_version'] == notification_from_db.template_version
|
||||||
assert data['created_at'] == notification_from_db.created_at
|
assert data['created_at'] == notification_from_db.created_at
|
||||||
assert 'sending' == notification_from_db.status
|
assert 'created' == notification_from_db.status
|
||||||
|
|
||||||
|
|
||||||
def test_get_notification(sample_notification):
|
def test_get_notification(sample_notification):
|
||||||
@@ -580,7 +621,8 @@ def test_save_notification_no_job_id(sample_template, mmg_provider):
|
|||||||
assert data['service'] == notification_from_db.service
|
assert data['service'] == notification_from_db.service
|
||||||
assert data['template'] == notification_from_db.template
|
assert data['template'] == notification_from_db.template
|
||||||
assert data['template_version'] == notification_from_db.template_version
|
assert data['template_version'] == notification_from_db.template_version
|
||||||
assert 'sending' == notification_from_db.status
|
assert 'created' == notification_from_db.status
|
||||||
|
assert data.get('job_id') is None
|
||||||
|
|
||||||
|
|
||||||
def test_get_notification_for_job(sample_notification):
|
def test_get_notification_for_job(sample_notification):
|
||||||
@@ -917,7 +959,7 @@ def test_sms_fragment_count(char_count, expected_sms_fragment_count):
|
|||||||
assert get_sms_fragment_count(char_count) == expected_sms_fragment_count
|
assert get_sms_fragment_count(char_count) == expected_sms_fragment_count
|
||||||
|
|
||||||
|
|
||||||
def _notification_json(sample_template, job_id=None, id=None):
|
def _notification_json(sample_template, job_id=None, id=None, status=None):
|
||||||
data = {
|
data = {
|
||||||
'to': '+44709123456',
|
'to': '+44709123456',
|
||||||
'service': sample_template.service,
|
'service': sample_template.service,
|
||||||
@@ -926,12 +968,14 @@ def _notification_json(sample_template, job_id=None, id=None):
|
|||||||
'template_id': sample_template.id,
|
'template_id': sample_template.id,
|
||||||
'template_version': sample_template.version,
|
'template_version': sample_template.version,
|
||||||
'created_at': datetime.utcnow(),
|
'created_at': datetime.utcnow(),
|
||||||
'content_char_count': 160
|
'content_char_count': 160,
|
||||||
}
|
}
|
||||||
if job_id:
|
if job_id:
|
||||||
data.update({'job_id': job_id})
|
data.update({'job_id': job_id})
|
||||||
if id:
|
if id:
|
||||||
data.update({'id': id})
|
data.update({'id': id})
|
||||||
|
if status:
|
||||||
|
data.update({'status': status})
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user