2017-10-18 13:13:23 +01:00
|
|
|
import uuid
|
|
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
|
from sqlalchemy.exc import SQLAlchemyError
|
|
|
|
|
|
|
|
|
|
from app.dao.service_sms_sender_dao import (
|
2018-04-26 09:05:17 +01:00
|
|
|
archive_sms_sender,
|
2017-10-18 13:13:23 +01:00
|
|
|
dao_add_sms_sender_for_service,
|
2017-10-25 11:58:54 +01:00
|
|
|
dao_get_service_sms_senders_by_id,
|
|
|
|
|
dao_get_sms_senders_by_service_id,
|
2021-03-10 13:55:06 +00:00
|
|
|
dao_update_service_sms_sender,
|
|
|
|
|
update_existing_sms_sender_with_inbound_number,
|
|
|
|
|
)
|
2018-04-26 09:05:17 +01:00
|
|
|
from app.exceptions import ArchiveValidationError
|
2017-09-11 17:40:37 +01:00
|
|
|
from app.models import ServiceSmsSender
|
2018-04-26 09:05:17 +01:00
|
|
|
from tests.app.db import (
|
|
|
|
|
create_inbound_number,
|
|
|
|
|
create_service,
|
|
|
|
|
create_service_sms_sender,
|
2021-03-10 13:55:06 +00:00
|
|
|
create_service_with_inbound_number,
|
|
|
|
|
)
|
2017-09-11 17:40:37 +01:00
|
|
|
|
|
|
|
|
|
2017-10-18 13:13:23 +01:00
|
|
|
def test_dao_get_service_sms_senders_id(notify_db_session):
|
2017-11-07 14:26:18 +00:00
|
|
|
service = create_service()
|
2023-08-29 14:54:30 -07:00
|
|
|
second_sender = dao_add_sms_sender_for_service(
|
|
|
|
|
service_id=service.id,
|
|
|
|
|
sms_sender="second",
|
|
|
|
|
is_default=False,
|
|
|
|
|
inbound_number_id=None,
|
|
|
|
|
)
|
|
|
|
|
result = dao_get_service_sms_senders_by_id(
|
|
|
|
|
service_id=service.id, service_sms_sender_id=second_sender.id
|
|
|
|
|
)
|
2017-10-18 13:13:23 +01:00
|
|
|
assert result.sms_sender == "second"
|
|
|
|
|
assert not result.is_default
|
|
|
|
|
|
|
|
|
|
|
2023-08-29 14:54:30 -07:00
|
|
|
def test_dao_get_service_sms_senders_id_raise_exception_when_not_found(
|
|
|
|
|
notify_db_session,
|
|
|
|
|
):
|
2017-10-18 13:13:23 +01:00
|
|
|
service = create_service()
|
|
|
|
|
with pytest.raises(expected_exception=SQLAlchemyError):
|
2023-08-29 14:54:30 -07:00
|
|
|
dao_get_service_sms_senders_by_id(
|
|
|
|
|
service_id=service.id, service_sms_sender_id=uuid.uuid4()
|
|
|
|
|
)
|
2017-10-18 13:13:23 +01:00
|
|
|
|
|
|
|
|
|
2023-08-29 14:54:30 -07:00
|
|
|
def test_dao_get_service_sms_senders_id_raises_exception_with_archived_sms_sender(
|
|
|
|
|
notify_db_session,
|
|
|
|
|
):
|
2018-04-25 14:23:00 +01:00
|
|
|
service = create_service()
|
|
|
|
|
archived_sms_sender = create_service_sms_sender(
|
2023-08-29 14:54:30 -07:00
|
|
|
service=service, sms_sender="second", is_default=False, archived=True
|
|
|
|
|
)
|
2018-04-25 14:23:00 +01:00
|
|
|
with pytest.raises(expected_exception=SQLAlchemyError):
|
2023-08-29 14:54:30 -07:00
|
|
|
dao_get_service_sms_senders_by_id(
|
|
|
|
|
service_id=service.id, service_sms_sender_id=archived_sms_sender.id
|
|
|
|
|
)
|
2018-04-25 14:23:00 +01:00
|
|
|
|
|
|
|
|
|
2017-10-18 13:13:23 +01:00
|
|
|
def test_dao_get_sms_senders_by_service_id(notify_db_session):
|
2017-11-07 14:26:18 +00:00
|
|
|
service = create_service()
|
2023-08-29 14:54:30 -07:00
|
|
|
second_sender = dao_add_sms_sender_for_service(
|
|
|
|
|
service_id=service.id,
|
|
|
|
|
sms_sender="second",
|
|
|
|
|
is_default=False,
|
|
|
|
|
inbound_number_id=None,
|
|
|
|
|
)
|
2017-10-18 13:13:23 +01:00
|
|
|
results = dao_get_sms_senders_by_service_id(service_id=service.id)
|
|
|
|
|
assert len(results) == 2
|
|
|
|
|
for x in results:
|
|
|
|
|
if x.is_default:
|
2023-08-29 14:54:30 -07:00
|
|
|
assert x.sms_sender == "testing"
|
2017-10-18 13:13:23 +01:00
|
|
|
else:
|
2017-10-19 13:51:33 +01:00
|
|
|
assert x == second_sender
|
2017-10-18 13:13:23 +01:00
|
|
|
|
|
|
|
|
|
2023-08-29 14:54:30 -07:00
|
|
|
def test_dao_get_sms_senders_by_service_id_does_not_return_archived_senders(
|
|
|
|
|
notify_db_session,
|
|
|
|
|
):
|
2018-04-25 14:23:00 +01:00
|
|
|
service = create_service()
|
|
|
|
|
archived_sms_sender = create_service_sms_sender(
|
2023-08-29 14:54:30 -07:00
|
|
|
service=service, sms_sender="second", is_default=False, archived=True
|
|
|
|
|
)
|
2018-04-25 14:23:00 +01:00
|
|
|
results = dao_get_sms_senders_by_service_id(service_id=service.id)
|
|
|
|
|
|
|
|
|
|
assert len(results) == 1
|
|
|
|
|
assert archived_sms_sender not in results
|
|
|
|
|
|
|
|
|
|
|
2017-10-18 13:13:23 +01:00
|
|
|
def test_dao_add_sms_sender_for_service(notify_db_session):
|
2017-11-07 14:26:18 +00:00
|
|
|
service = create_service()
|
2023-08-29 14:54:30 -07:00
|
|
|
new_sms_sender = dao_add_sms_sender_for_service(
|
|
|
|
|
service_id=service.id,
|
|
|
|
|
sms_sender="new_sms",
|
|
|
|
|
is_default=False,
|
|
|
|
|
inbound_number_id=None,
|
|
|
|
|
)
|
2017-10-18 13:13:23 +01:00
|
|
|
|
2023-08-29 14:54:30 -07:00
|
|
|
service_sms_senders = ServiceSmsSender.query.order_by(
|
|
|
|
|
ServiceSmsSender.created_at
|
|
|
|
|
).all()
|
2017-10-18 13:13:23 +01:00
|
|
|
assert len(service_sms_senders) == 2
|
2023-08-29 14:54:30 -07:00
|
|
|
assert service_sms_senders[0].sms_sender == "testing"
|
2017-10-18 13:13:23 +01:00
|
|
|
assert service_sms_senders[0].is_default
|
2018-04-25 10:42:00 +01:00
|
|
|
assert not service_sms_senders[0].archived
|
2017-10-18 13:13:23 +01:00
|
|
|
assert service_sms_senders[1] == new_sms_sender
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_dao_add_sms_sender_for_service_switches_default(notify_db_session):
|
2017-11-07 14:26:18 +00:00
|
|
|
service = create_service()
|
2023-08-29 14:54:30 -07:00
|
|
|
new_sms_sender = dao_add_sms_sender_for_service(
|
|
|
|
|
service_id=service.id,
|
|
|
|
|
sms_sender="new_sms",
|
|
|
|
|
is_default=True,
|
|
|
|
|
inbound_number_id=None,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
service_sms_senders = ServiceSmsSender.query.order_by(
|
|
|
|
|
ServiceSmsSender.created_at
|
|
|
|
|
).all()
|
2017-10-18 13:13:23 +01:00
|
|
|
assert len(service_sms_senders) == 2
|
2023-08-29 14:54:30 -07:00
|
|
|
assert service_sms_senders[0].sms_sender == "testing"
|
2017-10-18 13:13:23 +01:00
|
|
|
assert not service_sms_senders[0].is_default
|
|
|
|
|
assert service_sms_senders[1] == new_sms_sender
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_dao_update_service_sms_sender(notify_db_session):
|
2017-11-07 14:26:18 +00:00
|
|
|
service = create_service()
|
2017-10-18 13:17:52 +01:00
|
|
|
service_sms_senders = ServiceSmsSender.query.filter_by(service_id=service.id).all()
|
2017-10-18 13:13:23 +01:00
|
|
|
assert len(service_sms_senders) == 1
|
|
|
|
|
sms_sender_to_update = service_sms_senders[0]
|
|
|
|
|
|
2023-08-29 14:54:30 -07:00
|
|
|
dao_update_service_sms_sender(
|
|
|
|
|
service_id=service.id,
|
|
|
|
|
service_sms_sender_id=sms_sender_to_update.id,
|
|
|
|
|
is_default=True,
|
|
|
|
|
sms_sender="updated",
|
|
|
|
|
)
|
2017-10-18 13:13:23 +01:00
|
|
|
sms_senders = ServiceSmsSender.query.filter_by(service_id=service.id).all()
|
|
|
|
|
assert len(sms_senders) == 1
|
|
|
|
|
assert sms_senders[0].is_default
|
2023-08-29 14:54:30 -07:00
|
|
|
assert sms_senders[0].sms_sender == "updated"
|
2017-10-18 13:13:23 +01:00
|
|
|
assert not sms_senders[0].inbound_number_id
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_dao_update_service_sms_sender_switches_default(notify_db_session):
|
2017-11-07 14:26:18 +00:00
|
|
|
service = create_service()
|
2023-08-29 14:54:30 -07:00
|
|
|
sms_sender = dao_add_sms_sender_for_service(
|
|
|
|
|
service_id=service.id,
|
|
|
|
|
sms_sender="new_sms",
|
|
|
|
|
is_default=False,
|
|
|
|
|
inbound_number_id=None,
|
|
|
|
|
)
|
|
|
|
|
dao_update_service_sms_sender(
|
|
|
|
|
service_id=service.id,
|
|
|
|
|
service_sms_sender_id=sms_sender.id,
|
|
|
|
|
is_default=True,
|
|
|
|
|
sms_sender="updated",
|
|
|
|
|
)
|
2024-06-04 16:08:40 -04:00
|
|
|
sms_senders = ServiceSmsSender.query.filter_by(service_id=service.id).all()
|
|
|
|
|
|
2024-06-04 09:48:52 -04:00
|
|
|
expected = {("testing", False), ("updated", True)}
|
|
|
|
|
results = {(sender.sms_sender, sender.is_default) for sender in sms_senders}
|
2024-06-04 16:08:40 -04:00
|
|
|
assert expected == results
|
2017-10-18 13:13:23 +01:00
|
|
|
|
|
|
|
|
|
2023-08-29 14:54:30 -07:00
|
|
|
def test_dao_update_service_sms_sender_raises_exception_when_no_default_after_update(
|
|
|
|
|
notify_db_session,
|
|
|
|
|
):
|
2017-11-07 14:26:18 +00:00
|
|
|
service = create_service()
|
2023-08-29 14:54:30 -07:00
|
|
|
sms_sender = dao_add_sms_sender_for_service(
|
|
|
|
|
service_id=service.id,
|
|
|
|
|
sms_sender="new_sms",
|
|
|
|
|
is_default=True,
|
|
|
|
|
inbound_number_id=None,
|
|
|
|
|
)
|
2017-10-18 13:13:23 +01:00
|
|
|
with pytest.raises(expected_exception=Exception) as e:
|
2023-08-29 14:54:30 -07:00
|
|
|
dao_update_service_sms_sender(
|
|
|
|
|
service_id=service.id,
|
|
|
|
|
service_sms_sender_id=sms_sender.id,
|
|
|
|
|
is_default=False,
|
|
|
|
|
sms_sender="updated",
|
|
|
|
|
)
|
|
|
|
|
assert "You must have at least one SMS sender as the default" in str(e.value)
|
2017-10-25 11:58:54 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_update_existing_sms_sender_with_inbound_number(notify_db_session):
|
2017-11-07 14:26:18 +00:00
|
|
|
service = create_service()
|
2023-08-29 14:54:30 -07:00
|
|
|
inbound_number = create_inbound_number(number="12345", service_id=service.id)
|
2017-10-25 11:58:54 +01:00
|
|
|
|
|
|
|
|
existing_sms_sender = ServiceSmsSender.query.filter_by(service_id=service.id).one()
|
|
|
|
|
sms_sender = update_existing_sms_sender_with_inbound_number(
|
2023-08-29 14:54:30 -07:00
|
|
|
service_sms_sender=existing_sms_sender,
|
|
|
|
|
sms_sender=inbound_number.number,
|
|
|
|
|
inbound_number_id=inbound_number.id,
|
|
|
|
|
)
|
2017-10-25 11:58:54 +01:00
|
|
|
|
|
|
|
|
assert sms_sender.inbound_number_id == inbound_number.id
|
|
|
|
|
assert sms_sender.sms_sender == inbound_number.number
|
|
|
|
|
assert sms_sender.is_default
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_update_existing_sms_sender_with_inbound_number_raises_exception_if_inbound_number_does_not_exist(
|
2023-08-29 14:54:30 -07:00
|
|
|
notify_db_session,
|
2017-10-25 11:58:54 +01:00
|
|
|
):
|
2017-11-07 14:26:18 +00:00
|
|
|
service = create_service()
|
2017-10-25 11:58:54 +01:00
|
|
|
existing_sms_sender = ServiceSmsSender.query.filter_by(service_id=service.id).one()
|
|
|
|
|
with pytest.raises(expected_exception=SQLAlchemyError):
|
2023-08-29 14:54:30 -07:00
|
|
|
update_existing_sms_sender_with_inbound_number(
|
|
|
|
|
service_sms_sender=existing_sms_sender,
|
|
|
|
|
sms_sender="blah",
|
|
|
|
|
inbound_number_id=uuid.uuid4(),
|
|
|
|
|
)
|
2018-04-26 09:05:17 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_archive_sms_sender(notify_db_session):
|
|
|
|
|
service = create_service()
|
2023-08-29 14:54:30 -07:00
|
|
|
second_sms_sender = dao_add_sms_sender_for_service(
|
|
|
|
|
service_id=service.id, sms_sender="second", is_default=False
|
|
|
|
|
)
|
2018-04-26 09:05:17 +01:00
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
2023-08-29 14:54:30 -07:00
|
|
|
def test_archive_sms_sender_does_not_archive_a_sender_for_a_different_service(
|
|
|
|
|
sample_service,
|
|
|
|
|
):
|
2018-04-26 09:05:17 +01:00
|
|
|
service = create_service(service_name="First service")
|
2023-08-29 14:54:30 -07:00
|
|
|
sms_sender = dao_add_sms_sender_for_service(
|
|
|
|
|
service_id=sample_service.id, sms_sender="second", is_default=False
|
|
|
|
|
)
|
2018-04-26 09:05:17 +01:00
|
|
|
|
|
|
|
|
with pytest.raises(SQLAlchemyError):
|
|
|
|
|
archive_sms_sender(service.id, sms_sender.id)
|
|
|
|
|
|
|
|
|
|
assert not sms_sender.archived
|
|
|
|
|
|
|
|
|
|
|
2023-08-29 14:54:30 -07:00
|
|
|
def test_archive_sms_sender_raises_an_error_if_attempting_to_archive_a_default(
|
|
|
|
|
notify_db_session,
|
|
|
|
|
):
|
2018-04-26 09:05:17 +01:00
|
|
|
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)
|
|
|
|
|
|
2023-08-29 14:54:30 -07:00
|
|
|
assert "You cannot delete a default sms sender" in str(e.value)
|
2018-04-26 09:05:17 +01:00
|
|
|
|
|
|
|
|
|
2023-08-29 14:54:30 -07:00
|
|
|
@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)
|
2018-04-26 09:05:17 +01:00
|
|
|
|
|
|
|
|
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:
|
2023-08-29 14:54:30 -07:00
|
|
|
archive_sms_sender(service_id=service.id, sms_sender_id=inbound_number.id)
|
2018-04-26 09:05:17 +01:00
|
|
|
|
2023-08-29 14:54:30 -07:00
|
|
|
assert "You cannot delete an inbound number" in str(e.value)
|
2018-04-26 09:05:17 +01:00
|
|
|
assert not inbound_number.archived
|