Simplify dao method and update tests and fixtures

This commit is contained in:
Imdad Ahad
2017-02-24 13:39:58 +00:00
parent ec65575f50
commit eafe8269ef
4 changed files with 73 additions and 181 deletions

View File

@@ -11,13 +11,11 @@ from sqlalchemy.orm import joinedload
from app import db, create_uuid from app import db, create_uuid
from app.dao import days_ago from app.dao import days_ago
from app.dao.provider_details_dao import get_provider_details_by_identifier
from app.models import ( from app.models import (
Service, Service,
Notification, Notification,
NotificationHistory, NotificationHistory,
NotificationStatistics, NotificationStatistics,
ProviderDetails,
Template, Template,
NOTIFICATION_CREATED, NOTIFICATION_CREATED,
NOTIFICATION_DELIVERED, NOTIFICATION_DELIVERED,
@@ -426,8 +424,7 @@ def get_total_sent_notifications_in_date_range(start_date, end_date, notificatio
return result or 0 return result or 0
def get_count_of_slow_delivery_sms_notifications_for_provider( def is_delivery_slow_for_provider(
created_at,
sent_at, sent_at,
provider, provider,
threshold, threshold,
@@ -435,21 +432,12 @@ def get_count_of_slow_delivery_sms_notifications_for_provider(
service_id, service_id,
template_id template_id
): ):
count = db.session.query( count = db.session.query(Notification).filter(
func.count().label('total'),
Notification.sent_by
).filter(
Notification.service_id == service_id, Notification.service_id == service_id,
Notification.template_id == template_id, Notification.template_id == template_id,
Notification.created_at >= created_at,
Notification.sent_at >= sent_at, Notification.sent_at >= sent_at,
Notification.status == NOTIFICATION_DELIVERED, Notification.status == NOTIFICATION_DELIVERED,
Notification.sent_by == provider, Notification.sent_by == provider,
(Notification.updated_at - Notification.sent_at) >= delivery_time, (Notification.updated_at - Notification.sent_at) >= delivery_time,
).group_by( ).count()
Notification.sent_by return count >= threshold
).having(
func.count().label('total') >= threshold,
).first()
return count

View File

@@ -124,8 +124,7 @@ def sample_service(
user=None, user=None,
restricted=False, restricted=False,
limit=1000, limit=1000,
email_from=None, email_from=None
service_id=None
): ):
if user is None: if user is None:
user = create_user() user = create_user()
@@ -141,7 +140,7 @@ def sample_service(
service = Service.query.filter_by(name=service_name).first() service = Service.query.filter_by(name=service_name).first()
if not service: if not service:
service = Service(**data) service = Service(**data)
dao_create_service(service, user, service_id) dao_create_service(service, user)
else: else:
if user not in service.users: if user not in service.users:
dao_add_user_to_service(service, user) dao_add_user_to_service(service, user)
@@ -160,8 +159,7 @@ def sample_template(
user=None, user=None,
service=None, service=None,
created_by=None, created_by=None,
process_type='normal', process_type='normal'
template_id=None
): ):
if user is None: if user is None:
user = create_user() user = create_user()
@@ -169,24 +167,21 @@ def sample_template(
service = sample_service(notify_db, notify_db_session) service = sample_service(notify_db, notify_db_session)
if created_by is None: if created_by is None:
created_by = create_user() created_by = create_user()
data = {
template = Template.query.filter_by(id=template_id).first() 'name': template_name,
if not template: 'template_type': template_type,
data = { 'content': content,
'name': template_name, 'service': service,
'template_type': template_type, 'created_by': created_by,
'content': content, 'archived': archived,
'service': service, 'process_type': process_type
'created_by': created_by, }
'archived': archived, if template_type in ['email', 'letter']:
'process_type': process_type data.update({
} 'subject': subject_line
if template_type in ['email', 'letter']: })
data.update({ template = Template(**data)
'subject': subject_line dao_create_template(template)
})
template = Template(**data)
dao_create_template(template, template_id)
return template return template
@@ -447,8 +442,7 @@ def sample_notification(
api_key_id=None, api_key_id=None,
key_type=KEY_TYPE_NORMAL, key_type=KEY_TYPE_NORMAL,
sent_by=None, sent_by=None,
client_reference=None, client_reference=None
updated_at=None
): ):
if created_at is None: if created_at is None:
created_at = datetime.utcnow() created_at = datetime.utcnow()
@@ -456,8 +450,6 @@ def sample_notification(
service = sample_service(notify_db, notify_db_session) service = sample_service(notify_db, notify_db_session)
if template is None: if template is None:
template = sample_template(notify_db, notify_db_session, service=service) template = sample_template(notify_db, notify_db_session, service=service)
if not updated_at and status in NOTIFICATION_STATUS_TYPES_COMPLETED:
updated_at = created_at
notification_id = uuid.uuid4() notification_id = uuid.uuid4()
@@ -486,7 +478,7 @@ def sample_notification(
'api_key_id': api_key_id, 'api_key_id': api_key_id,
'key_type': key_type, 'key_type': key_type,
'sent_by': sent_by, 'sent_by': sent_by,
'updated_at': updated_at, 'updated_at': created_at if status in NOTIFICATION_STATUS_TYPES_COMPLETED else None,
'client_reference': client_reference 'client_reference': client_reference
} }
if job_row_number: if job_row_number:

View File

@@ -41,10 +41,11 @@ from app.dao.notifications_dao import (
dao_timeout_notifications, dao_timeout_notifications,
get_financial_year, get_financial_year,
get_april_fools, get_april_fools,
get_count_of_slow_delivery_sms_notifications_for_provider is_delivery_slow_for_provider
) )
from app.dao.services_dao import dao_update_service from app.dao.services_dao import dao_update_service
from tests.app.db import create_notification
from tests.app.conftest import ( from tests.app.conftest import (
sample_notification, sample_notification,
sample_template, sample_template,
@@ -1427,47 +1428,7 @@ def test_get_total_sent_notifications_for_email_excludes_sms_counts(
@freeze_time("2016-01-10 12:00:00.000000") @freeze_time("2016-01-10 12:00:00.000000")
def test_get_count_of_slow_delivery_sms_notifications_returns_after_created_time( def test_slow_provider_delivery_returns_for_sent_notifications(
notify_db,
notify_db_session,
sample_template
):
now = datetime.utcnow()
a_second_ago = now - timedelta(seconds=1)
five_minutes_from_now = now + timedelta(minutes=5)
notification_five_minutes_to_deliver = partial(
sample_notification,
notify_db,
notify_db_session,
template=sample_template,
status='delivered',
sent_at=now,
sent_by='mmg',
updated_at=five_minutes_from_now
)
noti1 = notification_five_minutes_to_deliver(created_at=a_second_ago)
notification_five_minutes_to_deliver(created_at=a_second_ago)
notification_five_minutes_to_deliver(created_at=now)
count = get_count_of_slow_delivery_sms_notifications_for_provider(
created_at=now,
sent_at=now,
provider='mmg',
threshold=1,
delivery_time=timedelta(minutes=5),
service_id=noti1.service_id,
template_id=noti1.template_id
)
assert count.total == 1
@freeze_time("2016-01-10 12:00:00.000000")
def test_get_count_of_slow_delivery_sms_notifications_returns_after_sent_time(
notify_db,
notify_db_session,
sample_template sample_template
): ):
now = datetime.utcnow() now = datetime.utcnow()
@@ -1475,45 +1436,38 @@ def test_get_count_of_slow_delivery_sms_notifications_returns_after_sent_time(
five_minutes_from_now = now + timedelta(minutes=5) five_minutes_from_now = now + timedelta(minutes=5)
notification_five_minutes_to_deliver = partial( notification_five_minutes_to_deliver = partial(
sample_notification, create_notification,
notify_db,
notify_db_session,
template=sample_template, template=sample_template,
status='delivered', status='delivered',
sent_by='mmg', sent_by='mmg',
updated_at=five_minutes_from_now updated_at=five_minutes_from_now
) )
noti1 = notification_five_minutes_to_deliver(created_at=now, sent_at=now) notification_five_minutes_to_deliver(sent_at=now)
notification_five_minutes_to_deliver(created_at=now, sent_at=one_minute_from_now) notification_five_minutes_to_deliver(sent_at=one_minute_from_now)
notification_five_minutes_to_deliver(created_at=now, sent_at=one_minute_from_now) notification_five_minutes_to_deliver(sent_at=one_minute_from_now)
count = get_count_of_slow_delivery_sms_notifications_for_provider( slow_delivery = is_delivery_slow_for_provider(
created_at=now,
sent_at=one_minute_from_now, sent_at=one_minute_from_now,
provider='mmg', provider='mmg',
threshold=2, threshold=2,
delivery_time=timedelta(minutes=3), delivery_time=timedelta(minutes=3),
service_id=noti1.service_id, service_id=sample_template.service.id,
template_id=noti1.template_id template_id=sample_template.id
) )
assert count.total == 2 assert slow_delivery
@freeze_time("2016-01-10 12:00:00.000000") @freeze_time("2016-01-10 12:00:00.000000")
def test_get_count_of_slow_delivery_sms_notifications_observes_threshold( def test_slow_provider_delivery_observes_threshold(
notify_db,
notify_db_session,
sample_template sample_template
): ):
now = datetime.utcnow() now = datetime.utcnow()
five_minutes_from_now = now + timedelta(minutes=5) five_minutes_from_now = now + timedelta(minutes=5)
notification_five_minutes_to_deliver = partial( notification_five_minutes_to_deliver = partial(
sample_notification, create_notification,
notify_db,
notify_db_session,
template=sample_template, template=sample_template,
status='delivered', status='delivered',
sent_at=now, sent_at=now,
@@ -1521,35 +1475,30 @@ def test_get_count_of_slow_delivery_sms_notifications_observes_threshold(
updated_at=five_minutes_from_now updated_at=five_minutes_from_now
) )
noti1 = notification_five_minutes_to_deliver(created_at=now) notification_five_minutes_to_deliver()
notification_five_minutes_to_deliver(created_at=now) notification_five_minutes_to_deliver()
count = get_count_of_slow_delivery_sms_notifications_for_provider( slow_delivery = is_delivery_slow_for_provider(
created_at=now,
sent_at=now, sent_at=now,
provider='mmg', provider='mmg',
threshold=3, threshold=3,
delivery_time=timedelta(minutes=5), delivery_time=timedelta(minutes=5),
service_id=noti1.service_id, service_id=sample_template.service.id,
template_id=noti1.template_id template_id=sample_template.id
) )
assert not count assert not slow_delivery
@freeze_time("2016-01-10 12:00:00.000000") @freeze_time("2016-01-10 12:00:00.000000")
def test_get_count_of_slow_delivery_sms_notifications_returns_status_delivered_only( def test_slow_provider_delivery_returns_for_delivered_notifications_only(
notify_db,
notify_db_session,
sample_template sample_template
): ):
now = datetime.utcnow() now = datetime.utcnow()
five_minutes_from_now = now + timedelta(minutes=5) five_minutes_from_now = now + timedelta(minutes=5)
notification_five_minutes_to_deliver = partial( notification_five_minutes_to_deliver = partial(
sample_notification, create_notification,
notify_db,
notify_db_session,
template=sample_template, template=sample_template,
sent_at=now, sent_at=now,
sent_by='firetext', sent_by='firetext',
@@ -1557,37 +1506,32 @@ def test_get_count_of_slow_delivery_sms_notifications_returns_status_delivered_o
updated_at=five_minutes_from_now updated_at=five_minutes_from_now
) )
noti1 = notification_five_minutes_to_deliver(status='created') notification_five_minutes_to_deliver(status='created')
notification_five_minutes_to_deliver(status='sending') notification_five_minutes_to_deliver(status='sending')
notification_five_minutes_to_deliver(status='delivered') notification_five_minutes_to_deliver(status='delivered')
notification_five_minutes_to_deliver(status='delivered') notification_five_minutes_to_deliver(status='delivered')
count = get_count_of_slow_delivery_sms_notifications_for_provider( slow_delivery = is_delivery_slow_for_provider(
created_at=now,
sent_at=now, sent_at=now,
provider='firetext', provider='firetext',
threshold=1, threshold=1,
delivery_time=timedelta(minutes=5), delivery_time=timedelta(minutes=5),
service_id=noti1.service_id, service_id=sample_template.service.id,
template_id=noti1.template_id template_id=sample_template.id
) )
assert count.total == 2 assert slow_delivery
@freeze_time("2016-01-10 12:00:00.000000") @freeze_time("2016-01-10 12:00:00.000000")
def test_get_count_of_slow_delivery_sms_notifications_returns_slow_delivery_time_only( def test_slow_provider_delivery_does_not_return_for_standard_delivery_time(
notify_db,
notify_db_session,
sample_template sample_template
): ):
now = datetime.utcnow() now = datetime.utcnow()
five_minutes_from_now = now + timedelta(minutes=5) five_minutes_from_now = now + timedelta(minutes=5)
notification = partial( notification = partial(
sample_notification, create_notification,
notify_db,
notify_db_session,
template=sample_template, template=sample_template,
created_at=now, created_at=now,
sent_at=now, sent_at=now,
@@ -1595,58 +1539,17 @@ def test_get_count_of_slow_delivery_sms_notifications_returns_slow_delivery_time
status='delivered' status='delivered'
) )
noti1 = notification(updated_at=five_minutes_from_now - timedelta(seconds=1)) notification(updated_at=five_minutes_from_now - timedelta(seconds=1))
noti1 = notification(updated_at=five_minutes_from_now - timedelta(seconds=1)) notification(updated_at=five_minutes_from_now - timedelta(seconds=1))
notification(updated_at=five_minutes_from_now)
notification(updated_at=five_minutes_from_now)
notification(updated_at=five_minutes_from_now) notification(updated_at=five_minutes_from_now)
count = get_count_of_slow_delivery_sms_notifications_for_provider( slow_delivery = is_delivery_slow_for_provider(
created_at=now,
sent_at=now, sent_at=now,
provider='mmg', provider='mmg',
threshold=1, threshold=2,
delivery_time=timedelta(minutes=5), delivery_time=timedelta(minutes=5),
service_id=noti1.service_id, service_id=sample_template.service.id,
template_id=noti1.template_id template_id=sample_template.id
) )
assert count.total == 3 assert not slow_delivery
@freeze_time("2016-01-10 12:00:00.000000")
def test_get_count_of_slow_delivery_sms_notifications_returns_provider_only(
notify_db,
notify_db_session,
sample_template
):
now = datetime.utcnow()
five_minutes_from_now = now + timedelta(minutes=5)
notification = partial(
sample_notification,
notify_db,
notify_db_session,
template=sample_template,
created_at=now,
sent_at=now,
updated_at=five_minutes_from_now,
status='delivered'
)
noti1 = notification(sent_by='mmg')
notification(sent_by='firetext')
notification(sent_by='loadtesting')
notification(sent_by='loadtesting')
count = get_count_of_slow_delivery_sms_notifications_for_provider(
created_at=now,
sent_at=now,
provider='mmg',
threshold=1,
delivery_time=timedelta(minutes=5),
service_id=noti1.service_id,
template_id=noti1.template_id
)
assert count.sent_by == 'mmg'

View File

@@ -23,7 +23,7 @@ def create_user(mobile_number="+447700900986", email="notify@digital.cabinet-off
return user return user
def create_service(user=None, service_name="Sample service"): def create_service(user=None, service_name="Sample service", service_id=None):
service = Service( service = Service(
name=service_name, name=service_name,
message_limit=1000, message_limit=1000,
@@ -31,14 +31,15 @@ def create_service(user=None, service_name="Sample service"):
email_from=service_name.lower().replace(' ', '.'), email_from=service_name.lower().replace(' ', '.'),
created_by=user or create_user() created_by=user or create_user()
) )
dao_create_service(service, service.created_by) dao_create_service(service, service.created_by, service_id)
return service return service
def create_template( def create_template(
service, service,
template_type=SMS_TYPE, template_type=SMS_TYPE,
content='Dear Sir/Madam, Hello. Yours Truly, The Government.' content='Dear Sir/Madam, Hello. Yours Truly, The Government.',
template_id=None
): ):
data = { data = {
'name': '{} Template Name'.format(template_type), 'name': '{} Template Name'.format(template_type),
@@ -50,7 +51,7 @@ def create_template(
if template_type != SMS_TYPE: if template_type != SMS_TYPE:
data['subject'] = 'Template subject' data['subject'] = 'Template subject'
template = Template(**data) template = Template(**data)
dao_create_template(template) dao_create_template(template, template_id)
return template return template
@@ -63,6 +64,7 @@ def create_notification(
reference=None, reference=None,
created_at=None, created_at=None,
sent_at=None, sent_at=None,
updated_at=None,
billable_units=1, billable_units=1,
personalisation=None, personalisation=None,
api_key_id=None, api_key_id=None,
@@ -72,6 +74,13 @@ def create_notification(
): ):
if created_at is None: if created_at is None:
created_at = datetime.utcnow() created_at = datetime.utcnow()
if sent_at is None:
sent_at = datetime.utcnow()
if updated_at is None:
updated_at = datetime.utcnow()
data = { data = {
'id': uuid.uuid4(), 'id': uuid.uuid4(),
'to': to_field, 'to': to_field,
@@ -91,7 +100,7 @@ def create_notification(
'api_key_id': api_key_id, 'api_key_id': api_key_id,
'key_type': key_type, 'key_type': key_type,
'sent_by': sent_by, 'sent_by': sent_by,
'updated_at': None, 'updated_at': updated_at,
'client_reference': client_reference, 'client_reference': client_reference,
'job_row_number': job_row_number 'job_row_number': job_row_number
} }