diff --git a/app/notifications/rest.py b/app/notifications/rest.py index 934f6e093..fc82668bc 100644 --- a/app/notifications/rest.py +++ b/app/notifications/rest.py @@ -365,7 +365,7 @@ def get_notification_return_data(notification_id, notification, template): } if template.template_type == 'email': - output.update({'subject': template.subject}) + output.update({'subject': template.replaced_subject}) return output diff --git a/app/schemas.py b/app/schemas.py index 9ee71cf49..0a7eab8d1 100644 --- a/app/schemas.py +++ b/app/schemas.py @@ -248,7 +248,7 @@ class SmsAdminNotificationSchema(SmsNotificationSchema): class NotificationStatusSchema(BaseSchema): - template = fields.Nested(TemplateSchema, only=["id", "name", "template_type", "content"], dump_only=True) + template = fields.Nested(TemplateSchema, only=["id", "name", "template_type", "content", "subject"], dump_only=True) job = fields.Nested(JobSchema, only=["id", "original_file_name"], dump_only=True) personalisation = fields.Dict(required=False) @@ -259,18 +259,19 @@ class NotificationStatusSchema(BaseSchema): @pre_dump def handle_personalisation_property(self, in_data): - if in_data.personalisation: - self.personalisation = in_data.personalisation + self.personalisation = in_data.personalisation return in_data @post_dump def handle_template_merge(self, in_data): - if in_data.get('personalisation'): - from notifications_utils.template import Template - merged = Template(in_data['template'], in_data['personalisation']).replaced - in_data['body'] = merged - in_data.pop('personalisation', None) + from notifications_utils.template import Template + template = Template(in_data['template'], in_data['personalisation']) + in_data['body'] = template.replaced + if in_data['template']['template_type'] == 'email': + in_data['subject'] = template.replaced_subject + in_data.pop('personalisation', None) in_data['template'].pop('content', None) + in_data['template'].pop('subject', None) return in_data diff --git a/tests/app/notifications/rest/test_send_notification.py b/tests/app/notifications/rest/test_send_notification.py index 3413820e8..92078ded4 100644 --- a/tests/app/notifications/rest/test_send_notification.py +++ b/tests/app/notifications/rest/test_send_notification.py @@ -90,39 +90,40 @@ def test_send_notification_invalid_template_id(notify_api, sample_template, mock @freeze_time("2016-01-01 11:09:00.061258") -def test_send_notification_with_placeholders_replaced(notify_api, sample_template_with_placeholders, mocker): +def test_send_notification_with_placeholders_replaced(notify_api, sample_email_template_with_placeholders, mocker): with notify_api.test_request_context(): with notify_api.test_client() as client: - mocker.patch('app.celery.tasks.send_sms.apply_async') + mocker.patch('app.celery.tasks.send_email.apply_async') data = { - 'to': '+447700900855', - 'template': str(sample_template_with_placeholders.id), + 'to': 'ok@ok.com', + 'template': str(sample_email_template_with_placeholders.id), 'personalisation': { 'name': 'Jo' } } - auth_header = create_authorization_header(service_id=sample_template_with_placeholders.service.id) + auth_header = create_authorization_header(service_id=sample_email_template_with_placeholders.service.id) response = client.post( - path='/notifications/sms', + path='/notifications/email', data=json.dumps(data), headers=[('Content-Type', 'application/json'), auth_header]) response_data = json.loads(response.data)['data'] notification_id = response_data['notification']['id'] - data.update({"template_version": sample_template_with_placeholders.version}) + data.update({"template_version": sample_email_template_with_placeholders.version}) - app.celery.tasks.send_sms.apply_async.assert_called_once_with( - (str(sample_template_with_placeholders.service.id), + app.celery.tasks.send_email.apply_async.assert_called_once_with( + (str(sample_email_template_with_placeholders.service.id), notification_id, ANY, "2016-01-01T11:09:00.061258"), - queue="sms" + queue="email" ) assert response.status_code == 201 - assert encryption.decrypt(app.celery.tasks.send_sms.apply_async.call_args[0][0][2]) == data + assert encryption.decrypt(app.celery.tasks.send_email.apply_async.call_args[0][0][2]) == data assert response_data['body'] == 'Hello Jo' + assert response_data['subject'] == 'Jo' def test_should_not_send_notification_for_archived_template(notify_api, sample_template): diff --git a/tests/app/notifications/test_rest.py b/tests/app/notifications/test_rest.py index b681f43a4..6c23908bd 100644 --- a/tests/app/notifications/test_rest.py +++ b/tests/app/notifications/test_rest.py @@ -13,7 +13,7 @@ from tests.app.conftest import sample_job as create_sample_job from tests.app.conftest import sample_service as create_sample_service -def test_get_notification_by_id(notify_api, sample_notification): +def test_get_sms_notification_by_id(notify_api, sample_notification): with notify_api.test_request_context(): with notify_api.test_client() as client: auth_header = create_authorization_header(service_id=sample_notification.service_id) @@ -35,6 +35,42 @@ def test_get_notification_by_id(notify_api, sample_notification): assert notification['to'] == '+447700900855' assert notification['service'] == str(sample_notification.service_id) assert response.status_code == 200 + assert notification['body'] == "This is a template" # sample_template.content + assert not notification.get('subject') + + +def test_get_email_notification_by_id(notify_api, notify_db, notify_db_session, sample_email_template): + + email_notification = create_sample_notification(notify_db, + notify_db_session, + service=sample_email_template.service, + template=sample_email_template) + + with notify_api.test_request_context(): + with notify_api.test_client() as client: + auth_header = create_authorization_header(service_id=email_notification.service_id) + + response = client.get( + '/notifications/{}'.format(email_notification.id), + headers=[auth_header]) + + notification = json.loads(response.get_data(as_text=True))['data']['notification'] + + assert notification['status'] == 'sending' + assert notification['template'] == { + 'id': str(email_notification.template.id), + 'name': email_notification.template.name, + 'template_type': email_notification.template.template_type} + assert notification['job'] == { + 'id': str(email_notification.job.id), + 'original_file_name': email_notification.job.original_file_name + } + + assert notification['to'] == '+447700900855' + assert notification['service'] == str(email_notification.service_id) + assert response.status_code == 200 + assert notification['body'] == sample_email_template.content + assert notification['subject'] == sample_email_template.subject def test_get_notifications_empty_result(notify_api, sample_api_key): @@ -75,6 +111,7 @@ def test_get_all_notifications(notify_api, sample_notification): assert notifications['notifications'][0]['to'] == '+447700900855' assert notifications['notifications'][0]['service'] == str(sample_notification.service_id) + assert notifications['notifications'][0]['body'] == "This is a template" # sample_template.content assert response.status_code == 200 @@ -1253,6 +1290,30 @@ def test_get_notification_by_id_returns_merged_template_content(notify_db, notification = json.loads(response.get_data(as_text=True))['data']['notification'] assert response.status_code == 200 assert notification['body'] == 'Hello world' + assert 'subject' not in notification + + +def test_get_notification_by_id_returns_merged_template_content_for_email( + notify_db, + notify_db_session, + notify_api, + sample_email_template_with_placeholders +): + sample_notification = create_sample_notification(notify_db, + notify_db_session, + template=sample_email_template_with_placeholders, + personalisation={"name": "world"}) + with notify_api.test_request_context(), notify_api.test_client() as client: + auth_header = create_authorization_header(service_id=sample_notification.service_id) + + response = client.get( + '/notifications/{}'.format(sample_notification.id), + headers=[auth_header]) + + notification = json.loads(response.get_data(as_text=True))['data']['notification'] + assert response.status_code == 200 + assert notification['body'] == 'Hello world' + assert notification['subject'] == 'world' def test_get_notifications_for_service_returns_merged_template_content(notify_api,