From f624f4f0339eb369892870a5368c3ac2ad8f8312 Mon Sep 17 00:00:00 2001 From: Rebecca Law Date: Mon, 11 Sep 2017 17:40:37 +0100 Subject: [PATCH] Insert and update methods for service_sms_sender --- app/dao/service_sms_sender_dao.py | 28 +++++++++++++++++++ app/dao/services_dao.py | 7 +++-- app/schemas.py | 4 ++- app/service/rest.py | 3 ++ tests/app/dao/test_service_sms_sender_dao.py | 29 ++++++++++++++++++++ tests/app/service/test_rest.py | 10 ++++++- 6 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 app/dao/service_sms_sender_dao.py create mode 100644 tests/app/dao/test_service_sms_sender_dao.py diff --git a/app/dao/service_sms_sender_dao.py b/app/dao/service_sms_sender_dao.py new file mode 100644 index 000000000..70e1325cb --- /dev/null +++ b/app/dao/service_sms_sender_dao.py @@ -0,0 +1,28 @@ +from app import db +from app.dao.dao_utils import transactional +from app.models import ServiceSmsSender + + +@transactional +def insert_or_update_service_sms_sender(service, sms_sender): + result = db.session.query( + ServiceSmsSender + ).filter( + ServiceSmsSender.service_id == service.id + ).update( + {'sms_sender': sms_sender} + ) + if result == 0: + new_sms_sender = ServiceSmsSender(sms_sender=sms_sender, + service=service, + is_default=True + ) + db.session.add(new_sms_sender) + + +def insert_service_sms_sender(service, sms_sender): + new_sms_sender = ServiceSmsSender(sms_sender=sms_sender, + service=service, + is_default=True + ) + db.session.add(new_sms_sender) diff --git a/app/dao/services_dao.py b/app/dao/services_dao.py index ad5ebf80a..b6cca8027 100644 --- a/app/dao/services_dao.py +++ b/app/dao/services_dao.py @@ -11,6 +11,7 @@ from app.dao.dao_utils import ( version_class ) from app.dao.notifications_dao import get_financial_year +from app.dao.service_sms_sender_dao import insert_service_sms_sender from app.models import ( NotificationStatistics, ProviderStatistics, @@ -33,8 +34,8 @@ from app.models import ( TEMPLATE_TYPES, JobStatistics, SMS_TYPE, - EMAIL_TYPE -) + EMAIL_TYPE, + ServiceSmsSender) from app.service.statistics import format_monthly_template_notification_stats from app.statsd_decorators import statsd from app.utils import get_london_month_from_utc_column, get_london_midnight_in_utc @@ -163,6 +164,7 @@ def dao_create_service(service, user, service_id=None, service_permissions=[SMS_ service_permission = ServicePermission(service_id=service.id, permission=permission) service.permissions.append(service_permission) + insert_service_sms_sender(service, service.sms_sender) db.session.add(service) @@ -212,6 +214,7 @@ def delete_service_and_all_associated_db_objects(service): subq = db.session.query(Template.id).filter_by(service=service).subquery() _delete_commit(TemplateRedacted.query.filter(TemplateRedacted.template_id.in_(subq))) + _delete_commit(ServiceSmsSender.query.filter_by(service=service)) _delete_commit(NotificationStatistics.query.filter_by(service=service)) _delete_commit(ProviderStatistics.query.filter_by(service=service)) _delete_commit(InvitedUser.query.filter_by(service=service)) diff --git a/app/schemas.py b/app/schemas.py index 5f81821d4..6a32e22ac 100644 --- a/app/schemas.py +++ b/app/schemas.py @@ -202,6 +202,7 @@ class ServiceSchema(BaseSchema): 'template_statistics', 'service_provider_stats', 'service_notification_stats', + 'service_sms_senders' ) strict = True @@ -252,7 +253,8 @@ class DetailedServiceSchema(BaseSchema): 'template_statistics', 'service_provider_stats', 'service_notification_stats', - 'organisation' + 'organisation', + 'service_sms_senders' ) diff --git a/app/service/rest.py b/app/service/rest.py index 98058774f..37a475841 100644 --- a/app/service/rest.py +++ b/app/service/rest.py @@ -22,6 +22,7 @@ from app.dao.service_inbound_api_dao import ( reset_service_inbound_api, get_service_inbound_api ) +from app.dao.service_sms_sender_dao import insert_or_update_service_sms_sender from app.dao.services_dao import ( dao_fetch_service_by_id, dao_fetch_all_services, @@ -143,6 +144,8 @@ def update_service(service_id): current_data = dict(service_schema.dump(fetched_service).data.items()) current_data.update(request.get_json()) update_dict = service_schema.load(current_data).data + if 'sms_sender' in req_json: + insert_or_update_service_sms_sender(fetched_service, req_json['sms_sender']) dao_update_service(update_dict) if service_going_live: diff --git a/tests/app/dao/test_service_sms_sender_dao.py b/tests/app/dao/test_service_sms_sender_dao.py new file mode 100644 index 000000000..5c04629c6 --- /dev/null +++ b/tests/app/dao/test_service_sms_sender_dao.py @@ -0,0 +1,29 @@ +from app.dao.service_sms_sender_dao import insert_or_update_service_sms_sender +from app.models import ServiceSmsSender +from tests.app.db import create_service + + +def test_update_service_sms_sender_updates_existing_row(notify_db_session): + service = create_service() + insert_or_update_service_sms_sender(service, 'testing') + service_sms_senders = ServiceSmsSender.query.filter_by(service_id=service.id).all() + assert len(service_sms_senders) == 1 + assert service_sms_senders[0].sms_sender == service.sms_sender + + insert_or_update_service_sms_sender(service, 'NEW_SMS') + + updated_sms_senders = ServiceSmsSender.query.filter_by(service_id=service.id).all() + assert len(updated_sms_senders) == 1 + assert updated_sms_senders[0].sms_sender == 'NEW_SMS' + assert updated_sms_senders[0].is_default + + +def test_create_service_inserts_new_service_sms_sender(notify_db_session): + assert ServiceSmsSender.query.count() == 0 + + service = create_service(sms_sender='new_sms') + insert_or_update_service_sms_sender(service, 'new_sms') + service_sms_senders = ServiceSmsSender.query.all() + assert len(service_sms_senders) == 1 + assert service_sms_senders[0].sms_sender == 'new_sms' + assert service_sms_senders[0].is_default diff --git a/tests/app/service/test_rest.py b/tests/app/service/test_rest.py index 0d8e3fea2..e0cea9e5a 100644 --- a/tests/app/service/test_rest.py +++ b/tests/app/service/test_rest.py @@ -16,7 +16,7 @@ from app.models import ( DVLA_ORG_LAND_REGISTRY, KEY_TYPE_NORMAL, KEY_TYPE_TEAM, KEY_TYPE_TEST, EMAIL_TYPE, SMS_TYPE, LETTER_TYPE, INTERNATIONAL_SMS_TYPE, INBOUND_SMS_TYPE, -) + ServiceSmsSender) from tests import create_authorization_header from tests.app.conftest import ( sample_service as create_service, @@ -282,6 +282,10 @@ def test_create_service(client, sample_user): assert json_resp['data']['name'] == 'created service' assert not json_resp['data']['research_mode'] + service_sms_senders = ServiceSmsSender.query.filter_by(service_id=service_db.id).all() + assert len(service_sms_senders) == 1 + assert service_sms_senders[0].sms_sender == service_db.sms_sender + def test_should_not_create_service_with_missing_user_id_field(notify_api, fake_uuid): with notify_api.test_request_context(): @@ -1390,6 +1394,10 @@ def test_set_sms_sender_for_service(client, sample_service): result = json.loads(resp.get_data(as_text=True)) assert resp.status_code == 200 assert result['data']['sms_sender'] == 'elevenchars' + service_sms_senders = ServiceSmsSender.query.filter_by(service_id=sample_service.id).all() + assert len(service_sms_senders) == 1 + assert service_sms_senders[0].sms_sender == 'elevenchars' + assert service_sms_senders[0].is_default def test_set_sms_sender_for_service_rejects_invalid_characters(client, sample_service):