From 9015ffef4855a6c54543c78117e73c357ae55172 Mon Sep 17 00:00:00 2001 From: Pea Tyczynska Date: Tue, 30 Oct 2018 16:31:57 +0000 Subject: [PATCH] Fetch notification statistics for last 7 days frpm FactNotificationStatus --- app/dao/fact_notification_status_dao.py | 20 ++++++- .../dao/test_fact_notification_status_dao.py | 52 +++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/app/dao/fact_notification_status_dao.py b/app/dao/fact_notification_status_dao.py index 7f2d7a272..a676e2b56 100644 --- a/app/dao/fact_notification_status_dao.py +++ b/app/dao/fact_notification_status_dao.py @@ -8,7 +8,7 @@ from sqlalchemy.types import DateTime from app import db from app.models import Notification, NotificationHistory, FactNotificationStatus, KEY_TYPE_TEST -from app.utils import convert_bst_to_utc, get_london_midnight_in_utc +from app.utils import convert_bst_to_utc, get_london_midnight_in_utc, midnight_n_days_ago def fetch_notification_status_for_day(process_day, service_id=None): @@ -95,6 +95,24 @@ def fetch_notification_status_for_service_by_month(start_date, end_date, service ).all() +def fetch_notification_status_for_service_for_7_days(service_id): + start_date = midnight_n_days_ago(7) + return db.session.query( + FactNotificationStatus.bst_date, + FactNotificationStatus.notification_type, + FactNotificationStatus.notification_status, + func.sum(FactNotificationStatus.notification_count).label('count') + ).filter( + FactNotificationStatus.service_id == service_id, + FactNotificationStatus.bst_date >= start_date, + FactNotificationStatus.key_type != KEY_TYPE_TEST + ).group_by( + FactNotificationStatus.bst_date, + FactNotificationStatus.notification_type, + FactNotificationStatus.notification_status, + ).all() + + def fetch_notification_status_for_service_for_day(bst_day, service_id): return db.session.query( # return current month as a datetime so the data has the same shape as the ft_notification_status query diff --git a/tests/app/dao/test_fact_notification_status_dao.py b/tests/app/dao/test_fact_notification_status_dao.py index e2eea0513..9bf4101eb 100644 --- a/tests/app/dao/test_fact_notification_status_dao.py +++ b/tests/app/dao/test_fact_notification_status_dao.py @@ -5,9 +5,11 @@ from app.dao.fact_notification_status_dao import ( update_fact_notification_status, fetch_notification_status_for_day, fetch_notification_status_for_service_by_month, + fetch_notification_status_for_service_for_7_days, fetch_notification_status_for_service_for_day, ) from app.models import FactNotificationStatus, KEY_TYPE_TEST, KEY_TYPE_TEAM +from freezegun import freeze_time from tests.app.db import create_notification, create_service, create_template, create_ft_notification_status @@ -135,6 +137,56 @@ def test_fetch_notification_status_for_service_by_month(notify_db_session): assert results[3].count == 1 +@freeze_time('2018-10-30T10:00:00') +def test_fetch_notification_status_for_service_for_7_days(notify_db_session): + service_1 = create_service(service_name='service_1') + service_2 = create_service(service_name='service_2') + + create_ft_notification_status(date(2018, 10, 29), 'sms', service_1, count=10) + create_ft_notification_status(date(2018, 10, 23), 'sms', service_1, count=8) + create_ft_notification_status(date(2018, 10, 29), 'sms', service_1, notification_status='created') + create_ft_notification_status(date(2018, 10, 29), 'email', service_1, count=3) + create_ft_notification_status(date(2018, 10, 26), 'letter', service_1, count=5) + + # not included - too early + create_ft_notification_status(date(2018, 10, 22), 'sms', service_1) + # not included - wrong service + create_ft_notification_status(date(2018, 10, 29), 'sms', service_2) + # not included - test keys + create_ft_notification_status(date(2018, 10, 29), 'sms', service_1, key_type=KEY_TYPE_TEST) + results = sorted( + fetch_notification_status_for_service_for_7_days(service_1.id), + key=lambda x: (x.bst_date, x.notification_type, x.notification_status) + ) + + assert len(results) == 5 + + assert results[2].bst_date == date(2018, 10, 29) + assert results[2].notification_type == 'email' + assert results[2].notification_status == 'delivered' + assert results[2].count == 3 + + assert results[1].bst_date == date(2018, 10, 26) + assert results[1].notification_type == 'letter' + assert results[1].notification_status == 'delivered' + assert results[1].count == 5 + + assert results[3].bst_date == date(2018, 10, 29) + assert results[3].notification_type == 'sms' + assert results[3].notification_status == 'created' + assert results[3].count == 1 + + assert results[0].bst_date == date(2018, 10, 23) + assert results[0].notification_type == 'sms' + assert results[0].notification_status == 'delivered' + assert results[0].count == 8 + + assert results[4].bst_date == date(2018, 10, 29) + assert results[4].notification_type == 'sms' + assert results[4].notification_status == 'delivered' + assert results[4].count == 10 + + def test_fetch_notification_status_for_service_for_day(notify_db_session): service_1 = create_service(service_name='service_1') service_2 = create_service(service_name='service_2')