Refactor the sms sender code to remove any unused methods.

Refactor tests/db/create_service() to behave more like the real world.
Created new create_service_with_inbound_number and create_service_with_defined_sms_sender() test/db methods.
This commit is contained in:
Rebecca Law
2017-11-07 14:26:18 +00:00
parent 430342b567
commit 0054361044
15 changed files with 224 additions and 379 deletions
+2 -3
View File
@@ -159,8 +159,6 @@ def dao_create_service(service, user, service_id=None, service_permissions=None)
# the default property does not appear to work when there is a difference between the sqlalchemy schema and the
# db schema (ie: during a migration), so we have to set sms_sender manually here. After the GOVUK sms_sender
# migration is completed, this code should be able to be removed.
if not service.sms_sender:
service.sms_sender = current_app.config['FROM_NUMBER']
if service_permissions is None:
service_permissions = DEFAULT_SERVICE_PERMISSIONS
@@ -179,7 +177,8 @@ def dao_create_service(service, user, service_id=None, service_permissions=None)
service_permission = ServicePermission(service_id=service.id, permission=permission)
service.permissions.append(service_permission)
insert_service_sms_sender(service, service.sms_sender)
# do we just add the default - or will we get a value from FE?
insert_service_sms_sender(service, current_app.config['FROM_NUMBER'])
dao_insert_annual_billing(service)
db.session.add(service)
+3 -40
View File
@@ -4,12 +4,9 @@ from app.dao.inbound_numbers_dao import (
dao_get_inbound_numbers,
dao_get_inbound_number_for_service,
dao_get_available_inbound_numbers,
dao_set_inbound_number_to_service,
dao_set_inbound_number_active_flag,
dao_allocate_number_for_service)
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
from app.errors import InvalidRequest, register_errors
dao_set_inbound_number_active_flag
)
from app.errors import register_errors
inbound_number_blueprint = Blueprint('inbound_number', __name__, url_prefix='/inbound-number')
register_errors(inbound_number_blueprint)
@@ -29,46 +26,12 @@ def get_inbound_number_for_service(service_id):
return jsonify(data=inbound_number.serialize() if inbound_number else {})
@inbound_number_blueprint.route('/service/<uuid:service_id>', methods=['POST'])
def post_allocate_inbound_number(service_id):
inbound_number = dao_get_inbound_number_for_service(service_id)
if inbound_number:
if not inbound_number.active:
dao_set_inbound_number_active_flag(service_id, active=True)
service = dao_fetch_service_by_id(service_id)
insert_or_update_service_sms_sender(service, inbound_number.number, inbound_number.id)
return jsonify(), 204
else:
return jsonify(), 200
available_numbers = dao_get_available_inbound_numbers()
if len(available_numbers) > 0:
dao_set_inbound_number_to_service(service_id, available_numbers[0])
service = dao_fetch_service_by_id(service_id)
insert_or_update_service_sms_sender(service, available_numbers[0].number, available_numbers[0].id)
return jsonify(), 204
else:
raise InvalidRequest('No available inbound numbers', status_code=400)
@inbound_number_blueprint.route('/service/<uuid:service_id>/off', methods=['POST'])
def post_set_inbound_number_off(service_id):
dao_set_inbound_number_active_flag(service_id, active=False)
return jsonify(), 204
@inbound_number_blueprint.route('<uuid:inbound_number_id>/service/<uuid:service_id>', methods=['POST'])
def allocate_inbound_number_to_service(inbound_number_id, service_id):
service = dao_fetch_service_by_id(service_id=service_id, only_active=True)
updated_inbound_number = dao_allocate_number_for_service(service_id=service_id, inbound_number_id=inbound_number_id)
insert_or_update_service_sms_sender(service=service,
sms_sender=updated_inbound_number.number,
inbound_number_id=inbound_number_id)
return jsonify(), 204
@inbound_number_blueprint.route('/available', methods=['GET'])
def get_available_inbound_numbers():
inbound_numbers = [i.serialize() for i in dao_get_available_inbound_numbers()]
+1 -1
View File
@@ -223,7 +223,7 @@ class Service(db.Model, Versioned):
created_by_id = db.Column(UUID(as_uuid=True), db.ForeignKey('users.id'), index=True, nullable=False)
_reply_to_email_address = db.Column("reply_to_email_address", db.Text, index=False, unique=False, nullable=True)
_letter_contact_block = db.Column('letter_contact_block', db.Text, index=False, unique=False, nullable=True)
sms_sender = db.Column(db.String(11), nullable=False, default=lambda: current_app.config['FROM_NUMBER'])
sms_sender = db.Column(db.String(11), nullable=True)
prefix_sms = db.Column(db.Boolean, nullable=True)
organisation_id = db.Column(UUID(as_uuid=True), db.ForeignKey('organisation.id'), index=True, nullable=True)
free_sms_fragment_limit = db.Column(db.BigInteger, index=False, unique=False, nullable=True)
+8 -7
View File
@@ -24,12 +24,12 @@ from app.dao.service_inbound_api_dao import (
get_service_inbound_api
)
from app.dao.service_sms_sender_dao import (
insert_or_update_service_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)
update_existing_sms_sender_with_inbound_number
)
from app.dao.services_dao import (
dao_fetch_service_by_id,
dao_fetch_all_services,
@@ -74,7 +74,10 @@ from app.errors import (
register_errors
)
from app.models import Service, ServiceInboundApi, AnnualBilling
from app.models import (
Service,
ServiceInboundApi
)
from app.schema_validation import validate
from app.service import statistics
from app.service.service_inbound_api_schema import (
@@ -84,7 +87,8 @@ from app.service.service_inbound_api_schema import (
from app.service.service_senders_schema import (
add_service_email_reply_to_request,
add_service_letter_contact_block_request,
add_service_sms_sender_request)
add_service_sms_sender_request
)
from app.service.utils import get_whitelist_objects
from app.service.sender import send_notification_to_service_users
from app.service.send_notification import send_one_off_notification
@@ -196,9 +200,6 @@ def update_service(service_id):
if 'reply_to_email_address' in req_json:
create_or_update_email_reply_to(fetched_service.id, req_json['reply_to_email_address'])
if 'sms_sender' in req_json:
insert_or_update_service_sms_sender(fetched_service, req_json['sms_sender'])
if 'letter_contact_block' in req_json:
create_or_update_letter_contact(fetched_service.id, req_json['letter_contact_block'])
@@ -0,0 +1,51 @@
"""
Revision ID: 2054e740350f
Revises: 0132_add_sms_prefix_setting
Create Date: 2017-11-06 15:44:59.471977
"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
revision = '0133_sms_sender_nullable'
down_revision = '0132_add_sms_prefix_setting'
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_table('notification_statistics')
op.alter_column('services', 'sms_sender',
existing_type=sa.VARCHAR(length=11),
nullable=True)
op.alter_column('services_history', 'sms_sender',
existing_type=sa.VARCHAR(length=11),
nullable=True)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.alter_column('services_history', 'sms_sender',
existing_type=sa.VARCHAR(length=11),
nullable=False)
op.alter_column('services', 'sms_sender',
existing_type=sa.VARCHAR(length=11),
nullable=False)
op.create_table('notification_statistics',
sa.Column('id', postgresql.UUID(), autoincrement=False, nullable=False),
sa.Column('service_id', postgresql.UUID(), autoincrement=False, nullable=False),
sa.Column('emails_requested', sa.BIGINT(), autoincrement=False, nullable=False),
sa.Column('emails_delivered', sa.BIGINT(), autoincrement=False, nullable=False),
sa.Column('emails_failed', sa.BIGINT(), autoincrement=False, nullable=False),
sa.Column('sms_requested', sa.BIGINT(), autoincrement=False, nullable=False),
sa.Column('sms_delivered', sa.BIGINT(), autoincrement=False, nullable=False),
sa.Column('sms_failed', sa.BIGINT(), autoincrement=False, nullable=False),
sa.Column('day', sa.DATE(), autoincrement=False, nullable=False),
sa.ForeignKeyConstraint(['service_id'], ['services.id'],
name='notification_statistics_service_id_fkey'),
sa.PrimaryKeyConstraint('id', name='notification_statistics_pkey'),
sa.UniqueConstraint('service_id', 'day', name='uix_service_to_day')
)
# ### end Alembic commands ###
+13 -40
View File
@@ -4,7 +4,6 @@ import pytest
from sqlalchemy.exc import SQLAlchemyError
from app.dao.service_sms_sender_dao import (
insert_or_update_service_sms_sender,
dao_add_sms_sender_for_service,
dao_update_service_sms_sender,
dao_get_service_sms_senders_by_id,
@@ -14,34 +13,8 @@ from app.models import ServiceSmsSender
from tests.app.db import create_service, create_inbound_number
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
def test_dao_get_service_sms_senders_id(notify_db_session):
service = create_service(sms_sender='first_sms')
service = create_service()
second_sender = dao_add_sms_sender_for_service(service_id=service.id,
sms_sender='second',
is_default=False,
@@ -60,7 +33,7 @@ def test_dao_get_service_sms_senders_id_raise_exception_when_not_found(notify_db
def test_dao_get_sms_senders_by_service_id(notify_db_session):
service = create_service(sms_sender='first_sms')
service = create_service()
second_sender = dao_add_sms_sender_for_service(service_id=service.id,
sms_sender='second',
is_default=False,
@@ -69,13 +42,13 @@ def test_dao_get_sms_senders_by_service_id(notify_db_session):
assert len(results) == 2
for x in results:
if x.is_default:
assert x.sms_sender == 'first_sms'
assert x.sms_sender == 'testing'
else:
assert x == second_sender
def test_dao_add_sms_sender_for_service(notify_db_session):
service = create_service(sms_sender="first_sms")
service = create_service()
new_sms_sender = dao_add_sms_sender_for_service(service_id=service.id,
sms_sender='new_sms',
is_default=False,
@@ -83,13 +56,13 @@ def test_dao_add_sms_sender_for_service(notify_db_session):
service_sms_senders = ServiceSmsSender.query.order_by(ServiceSmsSender.created_at).all()
assert len(service_sms_senders) == 2
assert service_sms_senders[0].sms_sender == 'first_sms'
assert service_sms_senders[0].sms_sender == 'testing'
assert service_sms_senders[0].is_default
assert service_sms_senders[1] == new_sms_sender
def test_dao_add_sms_sender_for_service_switches_default(notify_db_session):
service = create_service(sms_sender="first_sms")
service = create_service()
new_sms_sender = dao_add_sms_sender_for_service(service_id=service.id,
sms_sender='new_sms',
is_default=True,
@@ -97,13 +70,13 @@ def test_dao_add_sms_sender_for_service_switches_default(notify_db_session):
service_sms_senders = ServiceSmsSender.query.order_by(ServiceSmsSender.created_at).all()
assert len(service_sms_senders) == 2
assert service_sms_senders[0].sms_sender == 'first_sms'
assert service_sms_senders[0].sms_sender == 'testing'
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):
service = create_service(sms_sender='first_sms')
service = create_service()
service_sms_senders = ServiceSmsSender.query.filter_by(service_id=service.id).all()
assert len(service_sms_senders) == 1
sms_sender_to_update = service_sms_senders[0]
@@ -120,7 +93,7 @@ def test_dao_update_service_sms_sender(notify_db_session):
def test_dao_update_service_sms_sender_switches_default(notify_db_session):
service = create_service(sms_sender='first_sms')
service = create_service()
sms_sender = dao_add_sms_sender_for_service(service_id=service.id,
sms_sender='new_sms',
is_default=False,
@@ -131,14 +104,14 @@ def test_dao_update_service_sms_sender_switches_default(notify_db_session):
sms_sender="updated")
sms_senders = ServiceSmsSender.query.filter_by(service_id=service.id).order_by(ServiceSmsSender.created_at).all()
assert len(sms_senders) == 2
assert sms_senders[0].sms_sender == 'first_sms'
assert sms_senders[0].sms_sender == 'testing'
assert not sms_senders[0].is_default
assert sms_senders[1].sms_sender == 'updated'
assert sms_senders[1].is_default
def test_dao_update_service_sms_sender_raises_exception_when_no_default_after_update(notify_db_session):
service = create_service(sms_sender='first_sms')
service = create_service()
sms_sender = dao_add_sms_sender_for_service(service_id=service.id,
sms_sender='new_sms',
is_default=True,
@@ -151,7 +124,7 @@ def test_dao_update_service_sms_sender_raises_exception_when_no_default_after_up
def test_update_existing_sms_sender_with_inbound_number(notify_db_session):
service = create_service(sms_sender='testing')
service = create_service()
inbound_number = create_inbound_number(number='12345', service_id=service.id)
existing_sms_sender = ServiceSmsSender.query.filter_by(service_id=service.id).one()
@@ -166,7 +139,7 @@ def test_update_existing_sms_sender_with_inbound_number(notify_db_session):
def test_update_existing_sms_sender_with_inbound_number_raises_exception_if_inbound_number_does_not_exist(
notify_db_session
):
service = create_service(sms_sender='testing')
service = create_service()
existing_sms_sender = ServiceSmsSender.query.filter_by(service_id=service.id).one()
with pytest.raises(expected_exception=SQLAlchemyError):
update_existing_sms_sender_with_inbound_number(service_sms_sender=existing_sms_sender,
+14 -13
View File
@@ -9,7 +9,8 @@ from freezegun import freeze_time
from app import db
from app.dao.inbound_numbers_dao import (
dao_set_inbound_number_to_service,
dao_get_available_inbound_numbers
dao_get_available_inbound_numbers,
dao_set_inbound_number_active_flag
)
from app.dao.services_dao import (
dao_create_service,
@@ -61,7 +62,10 @@ from app.models import (
SERVICE_PERMISSION_TYPES
)
from tests.app.db import create_inbound_number, create_user, create_service
from tests.app.db import (
create_inbound_number, create_user, create_service, create_service_with_inbound_number,
create_service_with_defined_sms_sender
)
from tests.app.conftest import (
sample_notification as create_notification,
sample_notification_history as create_notification_history,
@@ -941,10 +945,9 @@ def test_dao_fetch_active_users_for_service_returns_active_only(notify_db, notif
def test_dao_fetch_service_by_inbound_number_with_inbound_number(notify_db_session):
foo1 = create_service(service_name='a', sms_sender='1')
foo2 = create_service(service_name='b', sms_sender='2')
bar = create_service(service_name='c', sms_sender='3')
create_inbound_number('1', service_id=foo1.id)
foo1 = create_service_with_inbound_number(service_name='a', inbound_number='1')
create_service_with_defined_sms_sender(service_name='b', sms_sender_value='2')
create_service_with_defined_sms_sender(service_name='c', sms_sender_value='3')
create_inbound_number('2')
create_inbound_number('3')
@@ -962,9 +965,8 @@ def test_dao_fetch_service_by_inbound_number_with_inbound_number_not_set(notify_
def test_dao_fetch_service_by_inbound_number_when_inbound_number_set(notify_db_session):
service_1 = create_service(service_name='a', sms_sender=None)
service_2 = create_service(service_name='b')
inbound_number = create_inbound_number('1', service_id=service_1.id)
service_1 = create_service_with_inbound_number(inbound_number='1', service_name='a')
create_service(service_name='b')
service = dao_fetch_service_by_inbound_number('1')
@@ -972,8 +974,7 @@ def test_dao_fetch_service_by_inbound_number_when_inbound_number_set(notify_db_s
def test_dao_fetch_service_by_inbound_number_with_unknown_number(notify_db_session):
service = create_service(service_name='a', sms_sender=None)
inbound_number = create_inbound_number('1', service_id=service.id)
create_service_with_inbound_number(inbound_number='1', service_name='a')
service = dao_fetch_service_by_inbound_number('9')
@@ -981,8 +982,8 @@ def test_dao_fetch_service_by_inbound_number_with_unknown_number(notify_db_sessi
def test_dao_fetch_service_by_inbound_number_with_inactive_number_returns_empty(notify_db_session):
service = create_service(service_name='a', sms_sender=None)
inbound_number = create_inbound_number('1', service_id=service.id, active=False)
service = create_service_with_inbound_number(inbound_number='1', service_name='a')
dao_set_inbound_number_active_flag(service_id=service.id, active=False)
service = dao_fetch_service_by_inbound_number('1')
+71 -6
View File
@@ -4,6 +4,7 @@ import uuid
from app import db
from app.dao.jobs_dao import dao_create_job
from app.dao.service_inbound_api_dao import save_service_inbound_api
from app.dao.service_sms_sender_dao import update_existing_sms_sender_with_inbound_number, dao_update_service_sms_sender
from app.models import (
ApiKey,
InboundSms,
@@ -64,10 +65,8 @@ def create_service(
service_id=None,
restricted=False,
service_permissions=[EMAIL_TYPE, SMS_TYPE],
sms_sender='testing',
research_mode=False,
active=True,
do_create_inbound_number=True,
email_from=None,
prefix_sms=None,
):
@@ -77,18 +76,84 @@ def create_service(
restricted=restricted,
email_from=email_from if email_from else service_name.lower().replace(' ', '.'),
created_by=user or create_user(email='{}@digital.cabinet-office.gov.uk'.format(uuid.uuid4())),
sms_sender=sms_sender,
prefix_sms=prefix_sms,
)
dao_create_service(service, service.created_by, service_id, service_permissions=service_permissions)
if do_create_inbound_number and INBOUND_SMS_TYPE in service_permissions:
create_inbound_number(number=sms_sender, service_id=service.id)
service.active = active
service.research_mode = research_mode
return service
def create_service_with_inbound_number(
inbound_number='1234567',
user=None,
service_name="Sample service",
service_id=None,
restricted=False,
service_permissions=[EMAIL_TYPE, SMS_TYPE],
research_mode=False,
active=True,
email_from=None,
prefix_sms=None
):
service = Service(
name=service_name,
message_limit=1000,
restricted=restricted,
email_from=email_from if email_from else service_name.lower().replace(' ', '.'),
created_by=user or create_user(email='{}@digital.cabinet-office.gov.uk'.format(uuid.uuid4())),
prefix_sms=prefix_sms,
)
dao_create_service(service, service.created_by, service_id, service_permissions=service_permissions)
service.active = active
service.research_mode = research_mode
sms_sender = ServiceSmsSender.query.filter_by(service_id=service.id).first()
inbound = create_inbound_number(number=inbound_number, service_id=service.id)
update_existing_sms_sender_with_inbound_number(service_sms_sender=sms_sender,
sms_sender=inbound_number,
inbound_number_id=inbound.id)
return service
def create_service_with_defined_sms_sender(
sms_sender_value='1234567',
user=None,
service_name="Sample service",
service_id=None,
restricted=False,
service_permissions=[EMAIL_TYPE, SMS_TYPE],
research_mode=False,
active=True,
email_from=None,
prefix_sms=None
):
service = Service(
name=service_name,
message_limit=1000,
restricted=restricted,
email_from=email_from if email_from else service_name.lower().replace(' ', '.'),
created_by=user or create_user(email='{}@digital.cabinet-office.gov.uk'.format(uuid.uuid4())),
prefix_sms=prefix_sms,
)
dao_create_service(service, service.created_by, service_id, service_permissions=service_permissions)
service.active = active
service.research_mode = research_mode
sms_sender = ServiceSmsSender.query.filter_by(service_id=service.id).first()
dao_update_service_sms_sender(service_id=service_id,
service_sms_sender_id=sms_sender.id,
is_default=True,
sms_sender=sms_sender_value)
return service
@@ -248,7 +313,7 @@ def create_inbound_sms(
inbound = InboundSms(
service=service,
created_at=created_at or datetime.utcnow(),
notify_number=notify_number or service.sms_sender,
notify_number=notify_number or service.get_default_sms_sender(),
user_number=user_number,
provider_date=provider_date or datetime.utcnow(),
provider_reference=provider_reference or 'foo',
+11 -42
View File
@@ -33,7 +33,10 @@ from tests.app.db import (
create_inbound_number,
create_reply_to_email,
create_reply_to_email_for_notification,
create_service_sms_sender)
create_service_sms_sender,
create_service_with_inbound_number,
create_service_with_defined_sms_sender
)
def test_should_return_highest_priority_active_provider(restore_provider_details):
@@ -293,30 +296,6 @@ def test_should_not_send_to_provider_when_status_is_not_created(
stats_mock.assert_not_called()
def test_should_send_sms_sender_from_service_if_present(
notify_db_session,
mocker):
service = create_service(sms_sender='elevenchars')
template = create_template(service=service)
db_notification = create_notification(template=template,
to_field="+447234123123",
status='created')
mocker.patch('app.mmg_client.send_sms')
mocker.patch('app.delivery.send_to_providers.create_initial_notification_statistic_tasks')
send_to_providers.send_sms_to_provider(
db_notification
)
mmg_client.send_sms.assert_called_once_with(
to=validate_and_format_phone_number("+447234123123"),
content="Dear Sir/Madam, Hello. Yours Truly, The Government.",
reference=str(db_notification.id),
sender=service.sms_sender
)
def test_should_send_sms_with_downgraded_content(notify_db_session, mocker):
# é, o, and u are in GSM.
# á, ï, grapes, tabs, zero width space and ellipsis are not
@@ -708,7 +687,7 @@ def test_should_handle_sms_sender_and_prefix_message(
):
mocker.patch('app.mmg_client.send_sms')
mocker.patch('app.delivery.send_to_providers.create_initial_notification_statistic_tasks')
service = create_service(sms_sender=sms_sender)
service = create_service_with_defined_sms_sender(sms_sender_value=sms_sender)
template = create_template(service, content='bar')
notification = create_notification(template)
@@ -739,9 +718,8 @@ def test_should_handle_sms_prefix_setting(
):
mocker.patch('app.mmg_client.send_sms')
mocker.patch('app.delivery.send_to_providers.create_initial_notification_statistic_tasks')
service = create_service(
sms_sender=sms_sender,
prefix_sms=prefix_setting,
service = create_service_with_defined_sms_sender(
sms_sender_value=sms_sender, prefix_sms=prefix_setting
)
template = create_template(service, content='bar')
notification = create_notification(template)
@@ -759,12 +737,8 @@ def test_should_use_inbound_number_as_sender_if_default_sms_sender(
notify_db_session,
mocker
):
service = create_service(sms_sender='test sender')
inbound_number = create_inbound_number('1')
dao_add_sms_sender_for_service(service_id=service.id,
sms_sender=inbound_number.number,
is_default=True,
inbound_number_id=inbound_number.id)
service = create_service_with_inbound_number(inbound_number='inbound')
create_service_sms_sender(service=service, sms_sender="sms_sender", is_default=False)
template = create_template(service, content='bar')
notification = create_notification(template)
@@ -777,7 +751,7 @@ def test_should_use_inbound_number_as_sender_if_default_sms_sender(
to=ANY,
content=ANY,
reference=str(notification.id),
sender=inbound_number.number
sender='inbound'
)
@@ -785,12 +759,7 @@ def test_should_use_default_sms_sender(
notify_db_session,
mocker
):
service = create_service(sms_sender='test sender')
inbound_number = create_inbound_number('1')
dao_add_sms_sender_for_service(service_id=service.id,
sms_sender=inbound_number.number,
is_default=False,
inbound_number_id=inbound_number.id)
service = create_service_with_defined_sms_sender(sms_sender_value="test sender")
template = create_template(service, content='bar')
notification = create_notification(template)
-124
View File
@@ -1,7 +1,4 @@
import uuid
from app.dao.inbound_numbers_dao import dao_get_inbound_number_for_service
from app.models import ServiceSmsSender
from tests.app.db import create_service, create_inbound_number
@@ -38,66 +35,6 @@ def test_rest_get_inbound_number_when_service_is_not_assigned_returns_empty_dict
assert result['data'] == {}
def test_rest_allocate_inbound_number_to_service(
admin_request, notify_db_session, sample_service):
service = create_service(service_name='test service 1')
inbound_number = create_inbound_number(number='1', provider='mmg', active=True)
result = admin_request.post(
'inbound_number.post_allocate_inbound_number',
_expected_status=204,
service_id=service.id
)
inbound_number_from_db = dao_get_inbound_number_for_service(service.id)
assert inbound_number_from_db.active
assert inbound_number_from_db.id == inbound_number.id
assert inbound_number_from_db.number == inbound_number.number
def test_rest_allocate_inbound_number_to_service_raises_400_when_no_available_numbers(
admin_request, notify_db_session, sample_service):
service = create_service(service_name='test service 1')
create_inbound_number(number='1', provider='mmg', active=False)
result = admin_request.post(
'inbound_number.post_allocate_inbound_number',
_expected_status=400,
service_id=service.id
)
assert result['message'] == 'No available inbound numbers'
def test_rest_allocate_inbound_number_to_service_sets_active_flag_true_when_flag_is_false(
admin_request, notify_db_session, sample_service):
service = create_service(service_name='test service 1')
create_inbound_number(number='1', provider='mmg', active=False, service_id=service.id)
result = admin_request.post(
'inbound_number.post_allocate_inbound_number',
_expected_status=204,
service_id=service.id
)
inbound_number = dao_get_inbound_number_for_service(service.id)
assert inbound_number.active
def test_rest_allocate_inbound_number_to_service_sets_active_flag_true_when_flag_is_true(
admin_request, notify_db_session, sample_service):
service = create_service(service_name='test service 1')
create_inbound_number(number='1', provider='mmg', active=True, service_id=service.id)
result = admin_request.post(
'inbound_number.post_allocate_inbound_number',
_expected_status=200,
service_id=service.id
)
def test_rest_set_inbound_number_active_flag_off(
admin_request, notify_db_session):
service = create_service(service_name='test service 1')
@@ -114,67 +51,6 @@ def test_rest_set_inbound_number_active_flag_off(
assert not inbound_number_from_db.active
def test_allocate_inbound_number_insert_update_service_sms_sender(
admin_request, notify_db_session
):
service = create_service()
inbound_number = create_inbound_number(number='123')
admin_request.post(
'inbound_number.post_allocate_inbound_number',
_expected_status=204,
service_id=service.id
)
service_sms_senders = ServiceSmsSender.query.all()
assert len(service_sms_senders) == 1
assert service_sms_senders[0].sms_sender == inbound_number.number
assert service_sms_senders[0].inbound_number_id == inbound_number.id
assert service_sms_senders[0].is_default
def test_allocate_inbound_number_to_service(admin_request, notify_db_session):
service = create_service()
inbound_number = create_inbound_number(number='1235468')
admin_request.post(
'inbound_number.allocate_inbound_number_to_service',
_expected_status=204,
service_id=service.id,
inbound_number_id=inbound_number.id
)
sms_sender = ServiceSmsSender.query.filter_by(service_id=service.id).first()
assert sms_sender.sms_sender == inbound_number.number
assert sms_sender.inbound_number_id == inbound_number.id
def test_allocate_inbound_number_to_service_returns_404_if_service_does_not_exist(
admin_request, notify_db_session
):
inbound_number = create_inbound_number(number='1235468')
admin_request.post(
'inbound_number.allocate_inbound_number_to_service',
_expected_status=404,
service_id=uuid.uuid4(),
inbound_number_id=inbound_number.id
)
def test_allocate_inbound_number_to_service_returns_500_if_inbound_number_is_assigned(
admin_request, notify_db_session
):
service = create_service()
inbound_number = create_inbound_number(number='1235468', service_id=service.id)
admin_request.post(
'inbound_number.allocate_inbound_number_to_service',
_expected_status=404,
service_id=uuid.uuid4(),
inbound_number_id=inbound_number.id
)
def test_get_available_inbound_numbers_returns_empty_list(admin_request):
result = admin_request.get('inbound_number.get_available_inbound_numbers')
+6 -5
View File
@@ -5,7 +5,7 @@ from flask import json
from freezegun import freeze_time
from tests import create_authorization_header
from tests.app.db import create_inbound_sms, create_service
from tests.app.db import create_inbound_sms, create_service, create_service_with_inbound_number
def test_get_inbound_sms_with_no_params(client, sample_service):
@@ -273,17 +273,18 @@ def test_get_inbound_sms_summary_with_no_inbound(admin_request, sample_service):
}
def test_get_inbound_sms_by_id_returns_200(admin_request, sample_service):
inbound = create_inbound_sms(sample_service, user_number='447700900001')
def test_get_inbound_sms_by_id_returns_200(admin_request, notify_db_session):
service = create_service_with_inbound_number(inbound_number='12345')
inbound = create_inbound_sms(service=service, user_number='447700900001')
response = admin_request.get(
'inbound_sms.get_inbound_by_id',
service_id=sample_service.id,
service_id=service.id,
inbound_sms_id=inbound.id,
)
assert response['user_number'] == '447700900001'
assert response['service_id'] == str(sample_service.id)
assert response['service_id'] == str(service.id)
def test_get_inbound_sms_by_id_invalid_id_returns_404(admin_request, sample_service):
@@ -15,7 +15,7 @@ from app.notifications.receive_notifications import (
)
from app.models import InboundSms, EMAIL_TYPE, SMS_TYPE, INBOUND_SMS_TYPE
from tests.app.db import create_inbound_number, create_service
from tests.app.db import create_inbound_number, create_service, create_service_with_inbound_number
from tests.app.conftest import sample_service
@@ -70,7 +70,7 @@ def test_receive_notification_from_mmg_without_permissions_does_not_persist(
permissions
):
mocked = mocker.patch("app.notifications.receive_notifications.tasks.send_inbound_sms_to_service.apply_async")
service = create_service(sms_sender='07111111111', service_permissions=permissions)
service = create_service_with_inbound_number(inbound_number='07111111111', service_permissions=permissions)
data = {
"ID": "1234",
"MSISDN": "07111111111",
@@ -98,7 +98,7 @@ def test_receive_notification_from_firetext_without_permissions_does_not_persist
notify_db_session,
permissions
):
service = create_service(sms_sender='07111111111', service_permissions=permissions)
service = create_service_with_inbound_number(inbound_number='07111111111', service_permissions=permissions)
mocker.patch("app.notifications.receive_notifications.dao_fetch_service_by_inbound_number",
return_value=service)
mocked_send_inbound_sms = mocker.patch(
@@ -223,17 +223,15 @@ def test_create_inbound_mmg_sms_object_uses_inbound_number_if_set(sample_service
@pytest.mark.parametrize('notify_number', ['foo', 'baz'], ids=['two_matching_services', 'no_matching_services'])
def test_receive_notification_error_if_not_single_matching_service(client, notify_db_session, notify_number):
create_service(
create_service_with_inbound_number(
inbound_number='dog',
service_name='a',
sms_sender='foo',
service_permissions=[EMAIL_TYPE, SMS_TYPE, INBOUND_SMS_TYPE],
do_create_inbound_number=False
service_permissions=[EMAIL_TYPE, SMS_TYPE, INBOUND_SMS_TYPE]
)
create_service(
create_service_with_inbound_number(
inbound_number='bar',
service_name='b',
sms_sender='foo',
service_permissions=[EMAIL_TYPE, SMS_TYPE, INBOUND_SMS_TYPE],
do_create_inbound_number=False
service_permissions=[EMAIL_TYPE, SMS_TYPE, INBOUND_SMS_TYPE]
)
data = {
@@ -255,8 +253,8 @@ def test_receive_notification_returns_received_to_firetext(notify_db_session, cl
mocked = mocker.patch("app.notifications.receive_notifications.tasks.send_inbound_sms_to_service.apply_async")
mock = mocker.patch('app.notifications.receive_notifications.statsd_client.incr')
service = create_service(
service_name='b', sms_sender='07111111111', service_permissions=[EMAIL_TYPE, SMS_TYPE, INBOUND_SMS_TYPE])
service = create_service_with_inbound_number(
service_name='b', inbound_number='07111111111', service_permissions=[EMAIL_TYPE, SMS_TYPE, INBOUND_SMS_TYPE])
data = "source=07999999999&destination=07111111111&message=this is a message&time=2017-01-01 12:00:00"
@@ -276,8 +274,10 @@ def test_receive_notification_from_firetext_persists_message(notify_db_session,
mocked = mocker.patch("app.notifications.receive_notifications.tasks.send_inbound_sms_to_service.apply_async")
mocker.patch('app.notifications.receive_notifications.statsd_client.incr')
service = create_service(
service_name='b', sms_sender='07111111111', service_permissions=[EMAIL_TYPE, SMS_TYPE, INBOUND_SMS_TYPE])
service = create_service_with_inbound_number(
inbound_number='07111111111',
service_name='b',
service_permissions=[EMAIL_TYPE, SMS_TYPE, INBOUND_SMS_TYPE])
data = "source=07999999999&destination=07111111111&message=this is a message&time=2017-01-01 12:00:00"
@@ -287,7 +287,6 @@ def test_receive_notification_from_firetext_persists_message(notify_db_session,
result = json.loads(response.get_data(as_text=True))
persisted = InboundSms.query.first()
assert result['status'] == 'ok'
assert persisted.notify_number == '07111111111'
assert persisted.user_number == '447999999999'
@@ -302,8 +301,8 @@ def test_receive_notification_from_firetext_persists_message_with_normalized_pho
mocker.patch("app.notifications.receive_notifications.tasks.send_inbound_sms_to_service.apply_async")
mock = mocker.patch('app.notifications.receive_notifications.statsd_client.incr')
create_service(
service_name='b', sms_sender='07111111111', service_permissions=[EMAIL_TYPE, SMS_TYPE, INBOUND_SMS_TYPE])
create_service_with_inbound_number(
inbound_number='07111111111', service_name='b', service_permissions=[EMAIL_TYPE, SMS_TYPE, INBOUND_SMS_TYPE])
data = "source=(+44)7999999999&destination=07111111111&message=this is a message&time=2017-01-01 12:00:00"
@@ -322,8 +321,8 @@ def test_returns_ok_to_firetext_if_mismatched_sms_sender(notify_db_session, clie
mocked = mocker.patch("app.notifications.receive_notifications.tasks.send_inbound_sms_to_service.apply_async")
mock = mocker.patch('app.notifications.receive_notifications.statsd_client.incr')
create_service(
service_name='b', sms_sender='07111111199', service_permissions=[EMAIL_TYPE, SMS_TYPE, INBOUND_SMS_TYPE])
create_service_with_inbound_number(
inbound_number='07111111199', service_name='b', service_permissions=[EMAIL_TYPE, SMS_TYPE, INBOUND_SMS_TYPE])
data = "source=(+44)7999999999&destination=07111111111&message=this is a message&time=2017-01-01 12:00:00"
+14 -70
View File
@@ -8,6 +8,7 @@ import pytest
from flask import url_for, current_app
from freezegun import freeze_time
from app.dao.service_sms_sender_dao import dao_add_sms_sender_for_service
from app.dao.services_dao import dao_remove_user_from_service
from app.dao.templates_dao import dao_redact_template
from app.dao.users_dao import save_model_user
@@ -307,7 +308,6 @@ def test_create_service(client, sample_user):
service_db = Service.query.get(json_resp['data']['id'])
assert service_db.name == 'created service'
assert service_db.sms_sender == current_app.config['FROM_NUMBER']
auth_header_fetch = create_authorization_header()
@@ -322,7 +322,7 @@ def test_create_service(client, sample_user):
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
assert service_sms_senders[0].sms_sender == service_db.get_default_sms_sender()
def test_should_not_create_service_with_missing_user_id_field(notify_api, fake_uuid):
@@ -1505,63 +1505,6 @@ def test_get_only_api_created_notifications_for_service(
assert resp['notifications'][0]['id'] == str(without_job.id)
def test_set_sms_sender_for_service(client, sample_service):
data = {
'sms_sender': 'elevenchars',
}
auth_header = create_authorization_header()
resp = client.post(
'/service/{}'.format(sample_service.id),
data=json.dumps(data),
headers=[('Content-Type', 'application/json'), auth_header]
)
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):
data = {
'sms_sender': 'invalid####',
}
auth_header = create_authorization_header()
resp = client.post(
'/service/{}'.format(sample_service.id),
data=json.dumps(data),
headers=[('Content-Type', 'application/json'), auth_header]
)
result = json.loads(resp.get_data(as_text=True))
assert resp.status_code == 400
assert result['result'] == 'error'
assert result['message'] == {'sms_sender': ['Only alphanumeric characters allowed']}
def test_set_sms_sender_for_service_rejects_null(client, sample_service):
data = {
'sms_sender': None,
}
auth_header = create_authorization_header()
resp = client.post(
'/service/{}'.format(sample_service.id),
data=json.dumps(data),
headers=[('Content-Type', 'application/json'), auth_header]
)
result = json.loads(resp.get_data(as_text=True))
assert resp.status_code == 400
assert result['result'] == 'error'
assert result['message'] == {'sms_sender': ['Field may not be null.']}
@pytest.mark.parametrize('default_sms_sender, should_prefix', [
(None, True), # None means use default
('Foo', False),
@@ -1572,9 +1515,10 @@ def test_prefixing_messages_based_on_sms_sender(
default_sms_sender,
should_prefix,
):
service = create_service(
sms_sender=default_sms_sender or current_app.config['FROM_NUMBER']
)
service = create_service()
if default_sms_sender:
# add another sms sender that is the default.
dao_add_sms_sender_for_service(service_id=service.id, sms_sender=default_sms_sender, is_default=True)
create_service_sms_sender(
service=service,
sms_sender='ignored',
@@ -2688,7 +2632,7 @@ def test_add_service_sms_sender_can_add_multiple_senders(client, notify_db_sessi
def test_add_service_sms_sender_when_it_is_an_inbound_number_updates_the_only_existing_sms_sender(
client, notify_db_session):
service = create_service(sms_sender='GOVUK')
service = create_service()
inbound_number = create_inbound_number(number='12345')
data = {
"sms_sender": str(inbound_number.id),
@@ -2713,7 +2657,7 @@ def test_add_service_sms_sender_when_it_is_an_inbound_number_updates_the_only_ex
def test_add_service_sms_sender_when_it_is_an_inbound_number_inserts_new_sms_sender_when_more_than_one(
client, notify_db_session):
service = create_service(sms_sender='GOVUK')
service = create_service()
create_service_sms_sender(service=service, sms_sender="second", is_default=False)
inbound_number = create_inbound_number(number='12345')
data = {
@@ -2738,7 +2682,7 @@ def test_add_service_sms_sender_when_it_is_an_inbound_number_inserts_new_sms_sen
def test_add_service_sms_sender_switches_default(client, notify_db_session):
service = create_service(sms_sender='first')
service = create_service()
data = {
"sms_sender": 'second',
"is_default": True,
@@ -2752,7 +2696,7 @@ def test_add_service_sms_sender_switches_default(client, notify_db_session):
assert resp_json['sms_sender'] == 'second'
assert not resp_json['inbound_number_id']
assert resp_json['is_default']
sms_senders = ServiceSmsSender.query.filter_by(sms_sender='first').first()
sms_senders = ServiceSmsSender.query.filter_by(sms_sender='testing').first()
assert not sms_senders.is_default
@@ -2790,7 +2734,7 @@ def test_update_service_sms_sender(client, notify_db_session):
def test_update_service_sms_sender_switches_default(client, notify_db_session):
service = create_service(sms_sender='first')
service = create_service()
service_sms_sender = create_service_sms_sender(service=service, sms_sender='1235', is_default=False)
data = {
"sms_sender": 'second',
@@ -2805,7 +2749,7 @@ def test_update_service_sms_sender_switches_default(client, notify_db_session):
assert resp_json['sms_sender'] == 'second'
assert not resp_json['inbound_number_id']
assert resp_json['is_default']
sms_senders = ServiceSmsSender.query.filter_by(sms_sender='first').first()
sms_senders = ServiceSmsSender.query.filter_by(sms_sender='testing').first()
assert not sms_senders.is_default
@@ -2875,7 +2819,7 @@ def test_get_service_sms_sender_by_id_returns_404_when_sms_sender_does_not_exist
def test_get_service_sms_senders_for_service(client, notify_db_session):
service_sms_sender = create_service_sms_sender(service=create_service(sms_sender='first'),
service_sms_sender = create_service_sms_sender(service=create_service(),
sms_sender='second',
is_default=False)
response = client.get('/service/{}/sms-sender'.format(service_sms_sender.service_id),
@@ -2885,7 +2829,7 @@ def test_get_service_sms_senders_for_service(client, notify_db_session):
json_resp = json.loads(response.get_data(as_text=True))
assert len(json_resp) == 2
assert json_resp[0]['is_default']
assert json_resp[0]['sms_sender'] == 'first'
assert json_resp[0]['sms_sender'] == current_app.config['FROM_NUMBER']
assert not json_resp[1]['is_default']
assert json_resp[1]['sms_sender'] == 'second'
+3 -5
View File
@@ -30,7 +30,6 @@ from tests.app.db import (
create_reply_to_email,
create_letter_contact
)
from tests.conftest import set_config
@pytest.mark.parametrize('mobile_number', [
@@ -256,8 +255,7 @@ def test_inbound_number_returns_inbound_number(client, notify_db_session):
def test_inbound_number_returns_none_when_no_inbound_number(client, notify_db_session):
with set_config(client.application, 'FROM_NUMBER', 'test'):
service = create_service(sms_sender=None)
service = create_service()
assert not service.get_inbound_number()
@@ -275,5 +273,5 @@ def test_service_get_default_contact_letter(sample_service):
def test_service_get_default_sms_sender(notify_db_session):
service = create_service(sms_sender='new_value')
assert service.get_default_sms_sender() == 'new_value'
service = create_service()
assert service.get_default_sms_sender() == 'testing'
@@ -3,13 +3,15 @@ import uuid
import pytest
from freezegun import freeze_time
from app.dao.service_sms_sender_dao import update_existing_sms_sender_with_inbound_number
from app.models import (
NotificationEmailReplyTo,
ScheduledNotification,
SCHEDULE_NOTIFICATIONS,
EMAIL_TYPE,
SMS_TYPE,
NotificationSmsSender)
NotificationSmsSender, ServiceSmsSender
)
from flask import json, current_app
from app.models import Notification
@@ -29,7 +31,9 @@ from tests.app.db import (
create_service,
create_template,
create_reply_to_email,
create_service_sms_sender, create_notification)
create_service_sms_sender, create_notification, create_inbound_number,
create_service_with_inbound_number
)
@pytest.mark.parametrize("reference", [None, "reference_from_client"])
@@ -69,7 +73,8 @@ def test_post_sms_notification_returns_201(client, sample_template_with_placehol
def test_post_sms_notification_uses_inbound_number_as_sender(client, notify_db_session, mocker):
service = create_service(sms_sender='1', do_create_inbound_number=True)
service = create_service_with_inbound_number(inbound_number='1')
template = create_template(service=service, content="Hello (( Name))\nYour thing is due soon")
mocked = mocker.patch('app.celery.provider_tasks.deliver_sms.apply_async')
data = {