diff --git a/app/dao/service_sms_sender_dao.py b/app/dao/service_sms_sender_dao.py index 0cddd606d..30f9afa93 100644 --- a/app/dao/service_sms_sender_dao.py +++ b/app/dao/service_sms_sender_dao.py @@ -2,6 +2,7 @@ from sqlalchemy import desc from app import db from app.dao.dao_utils import transactional +from app.exceptions import ArchiveValidationError from app.models import ServiceSmsSender @@ -75,6 +76,24 @@ def update_existing_sms_sender_with_inbound_number(service_sms_sender, sms_sende return service_sms_sender +@transactional +def archive_sms_sender(service_id, sms_sender_id): + sms_sender_to_archive = ServiceSmsSender.query.filter_by( + id=sms_sender_id, + service_id=service_id + ).one() + + if sms_sender_to_archive.inbound_number_id: + raise ArchiveValidationError("You cannot delete an inbound number") + if sms_sender_to_archive.is_default: + raise ArchiveValidationError("You cannot delete a default sms sender") + + sms_sender_to_archive.archived = True + + db.session.add(sms_sender_to_archive) + return sms_sender_to_archive + + def _get_existing_default(service_id): sms_senders = dao_get_sms_senders_by_service_id(service_id=service_id) if sms_senders: diff --git a/app/service/rest.py b/app/service/rest.py index 756d81915..9414ce61c 100644 --- a/app/service/rest.py +++ b/app/service/rest.py @@ -20,6 +20,7 @@ from app.dao.api_key_dao import ( from app.dao.inbound_numbers_dao import dao_allocate_number_for_service from app.dao.organisation_dao import dao_get_organisation_by_service_id from app.dao.service_sms_sender_dao import ( + archive_sms_sender, dao_add_sms_sender_for_service, dao_update_service_sms_sender, dao_get_service_sms_senders_by_id, @@ -685,6 +686,13 @@ def update_service_sms_sender(service_id, sms_sender_id): return jsonify(new_sms_sender.serialize()), 200 +@service_blueprint.route('//sms-sender//archive', methods=['POST']) +def delete_service_sms_sender(service_id, sms_sender_id): + sms_sender = archive_sms_sender(service_id, sms_sender_id) + + return jsonify(data=sms_sender.serialize()), 200 + + @service_blueprint.route('//sms-sender/', methods=['GET']) def get_service_sms_sender_by_id(service_id, sms_sender_id): sms_sender = dao_get_service_sms_senders_by_id(service_id=service_id, diff --git a/tests/app/dao/test_service_sms_sender_dao.py b/tests/app/dao/test_service_sms_sender_dao.py index 414c7899a..302263acc 100644 --- a/tests/app/dao/test_service_sms_sender_dao.py +++ b/tests/app/dao/test_service_sms_sender_dao.py @@ -4,13 +4,19 @@ import pytest from sqlalchemy.exc import SQLAlchemyError from app.dao.service_sms_sender_dao import ( + archive_sms_sender, dao_add_sms_sender_for_service, dao_update_service_sms_sender, dao_get_service_sms_senders_by_id, dao_get_sms_senders_by_service_id, update_existing_sms_sender_with_inbound_number) +from app.exceptions import ArchiveValidationError from app.models import ServiceSmsSender -from tests.app.db import create_service, create_inbound_number, create_service_sms_sender +from tests.app.db import ( + create_inbound_number, + create_service, + create_service_sms_sender, + create_service_with_inbound_number) def test_dao_get_service_sms_senders_id(notify_db_session): @@ -172,3 +178,57 @@ def test_update_existing_sms_sender_with_inbound_number_raises_exception_if_inbo update_existing_sms_sender_with_inbound_number(service_sms_sender=existing_sms_sender, sms_sender='blah', inbound_number_id=uuid.uuid4()) + + +def test_archive_sms_sender(notify_db_session): + service = create_service() + second_sms_sender = dao_add_sms_sender_for_service(service_id=service.id, + sms_sender='second', + is_default=False) + + archive_sms_sender(service_id=service.id, sms_sender_id=second_sms_sender.id) + + assert second_sms_sender.archived is True + assert second_sms_sender.updated_at is not None + + +def test_archive_sms_sender_does_not_archive_a_sender_for_a_different_service(sample_service): + service = create_service(service_name="First service") + sms_sender = dao_add_sms_sender_for_service(service_id=sample_service.id, + sms_sender='second', + is_default=False) + + with pytest.raises(SQLAlchemyError): + archive_sms_sender(service.id, sms_sender.id) + + assert not sms_sender.archived + + +def test_archive_sms_sender_raises_an_error_if_attempting_to_archive_a_default(notify_db_session): + service = create_service() + sms_sender = service.service_sms_senders[0] + + with pytest.raises(ArchiveValidationError) as e: + archive_sms_sender(service_id=service.id, sms_sender_id=sms_sender.id) + + assert 'You cannot delete a default sms sender' in str(e.value) + + +@pytest.mark.parametrize('is_default', [True, False]) +def test_archive_sms_sender_raises_an_error_if_attempting_to_archive_an_inbound_number(notify_db_session, is_default): + service = create_service_with_inbound_number(inbound_number='7654321') + dao_add_sms_sender_for_service(service.id, 'second', is_default=True) + + inbound_number = next(x for x in service.service_sms_senders if x.inbound_number_id) + + # regardless of whether inbound number is default or not, can't delete it + dao_update_service_sms_sender(service.id, inbound_number.id, is_default=is_default) + + with pytest.raises(ArchiveValidationError) as e: + archive_sms_sender( + service_id=service.id, + sms_sender_id=inbound_number.id + ) + + assert 'You cannot delete an inbound number' in str(e.value) + assert not inbound_number.archived diff --git a/tests/app/service/test_rest.py b/tests/app/service/test_rest.py index ff0571466..157ed077b 100644 --- a/tests/app/service/test_rest.py +++ b/tests/app/service/test_rest.py @@ -38,6 +38,7 @@ from tests.app.conftest import ( ) from tests.app.db import ( create_service, + create_service_with_inbound_number, create_template, create_notification, create_reply_to_email, @@ -2908,6 +2909,35 @@ def test_update_service_sms_sender_return_404_when_service_does_not_exist(client assert result['message'] == 'No result found' +def test_delete_service_sms_sender_can_archive_sms_sender(admin_request, notify_db_session): + service = create_service() + service_sms_sender = create_service_sms_sender(service=service, + sms_sender='5678', + is_default=False) + + admin_request.post( + 'service.delete_service_sms_sender', + service_id=service.id, + sms_sender_id=service_sms_sender.id, + ) + + assert service_sms_sender.archived is True + + +def test_delete_service_sms_sender_returns_400_if_archiving_inbound_number(admin_request, notify_db_session): + service = create_service_with_inbound_number(inbound_number='7654321') + inbound_number = service.service_sms_senders[0] + + response = admin_request.post( + 'service.delete_service_sms_sender', + service_id=service.id, + sms_sender_id=service.service_sms_senders[0].id, + _expected_status=400 + ) + assert response == {'message': 'You cannot delete an inbound number', 'result': 'error'} + assert inbound_number.archived is False + + def test_get_service_sms_sender_by_id(client, notify_db_session): service_sms_sender = create_service_sms_sender(service=create_service(), sms_sender='1235',