mirror of
https://github.com/GSA/notifications-api.git
synced 2026-02-04 10:21:14 -05:00
Add DAO function and endpoint for archiving SMS senders
Added a new DAO function which archives SMS senders by setting archived to True. This raises an ArchiveValidationError, if trying to archive a default SMS sender or an inbound number. Added a new endpoint for archiving SMS senders.
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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('/<uuid:service_id>/sms-sender/<uuid:sms_sender_id>/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('/<uuid:service_id>/sms-sender/<uuid:sms_sender_id>', 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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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',
|
||||
|
||||
Reference in New Issue
Block a user