From 556b69a487536c123abbaa26dc15218d1b2129ed Mon Sep 17 00:00:00 2001 From: Leo Hemsted Date: Tue, 23 Aug 2016 17:08:53 +0100 Subject: [PATCH] still return service if they have never sent any notifications --- app/service/rest.py | 5 ++ app/service/statistics.py | 6 +-- tests/app/service/test_rest.py | 74 ++++++++++++++-------------- tests/app/service/test_statistics.py | 4 +- 4 files changed, 47 insertions(+), 42 deletions(-) diff --git a/app/service/rest.py b/app/service/rest.py index 1ba277957..5a80cdc76 100644 --- a/app/service/rest.py +++ b/app/service/rest.py @@ -259,4 +259,9 @@ def get_detailed_services(): for service_id, rows in itertools.groupby(stats, lambda x: x.service_id): services[service_id].statistics = statistics.format_statistics(rows) + # if service has not sent anything, query will not have set statistics correctly + for service in services.values(): + if not hasattr(service, 'statistics'): + service.statistics = statistics.create_zeroed_stats_dicts() + return detailed_service_schema.dump(services.values(), many=True).data diff --git a/app/service/statistics.py b/app/service/statistics.py index abcb25740..3f06fcacb 100644 --- a/app/service/statistics.py +++ b/app/service/statistics.py @@ -8,7 +8,7 @@ def format_statistics(statistics): # statistics come in a named tuple with uniqueness from 'notification_type', 'status' - however missing # statuses/notification types won't be represented and the status types need to be simplified/summed up # so we can return emails/sms * created, sent, and failed - counts = _create_zeroed_stats_dicts() + counts = create_zeroed_stats_dicts() for row in statistics: _update_statuses_from_row(counts[row.notification_type], row) @@ -20,7 +20,7 @@ def format_weekly_notification_stats(statistics, service_created_at): # turn a datetime into midnight that day http://stackoverflow.com/a/1937636 preceeding_monday_midnight = datetime.combine(preceeding_monday.date(), datetime.min.time()) week_dict = { - week: _create_zeroed_stats_dicts() + week: create_zeroed_stats_dicts() for week in _weeks_for_range(preceeding_monday_midnight, datetime.utcnow()) } for row in statistics: @@ -29,7 +29,7 @@ def format_weekly_notification_stats(statistics, service_created_at): return week_dict -def _create_zeroed_stats_dicts(): +def create_zeroed_stats_dicts(): return { template_type: { status: 0 for status in ('requested', 'delivered', 'failed') diff --git a/tests/app/service/test_rest.py b/tests/app/service/test_rest.py index 4a64e86ac..ba6587a61 100644 --- a/tests/app/service/test_rest.py +++ b/tests/app/service/test_rest.py @@ -16,7 +16,6 @@ from tests.app.conftest import ( sample_user as create_sample_user, sample_notification as create_sample_notification ) -from app.service.rest import get_detailed_services def test_get_service_list(notify_api, service_factory): @@ -1096,18 +1095,17 @@ def test_set_sms_sender_for_service_rejects_invalid_characters(notify_api, sampl @pytest.mark.parametrize('today_only,stats', [ - ('False', { - 'requested': 2, - 'delivered': 1, - 'failed': 0 - }), - ('True', { - 'requested': 1, - 'delivered': 0, - 'failed': 0 - }) - ], ids=['seven_days', 'today'] -) + ('False', { + 'requested': 2, + 'delivered': 1, + 'failed': 0 + }), + ('True', { + 'requested': 1, + 'delivered': 0, + 'failed': 0 + }) +], ids=['seven_days', 'today']) def test_get_detailed_service(notify_db, notify_db_session, notify_api, sample_service, today_only, stats): with notify_api.test_request_context(), notify_api.test_client() as client: with freeze_time('2000-01-01T12:00:00'): @@ -1177,31 +1175,8 @@ def test_get_services_with_detailed_flag(notify_api, notify_db, notify_db_sessio def test_get_detailed_services_groups_by_service(notify_db, notify_db_session): - service_1 = create_sample_service(notify_db, notify_db_session, service_name="1", email_from='1') - service_2 = create_sample_service(notify_db, notify_db_session, service_name="2", email_from='2') + from app.service.rest import get_detailed_services - create_sample_notification(notify_db, notify_db_session, service=service_1, status='created') - create_sample_notification(notify_db, notify_db_session, service=service_2, status='created') - create_sample_notification(notify_db, notify_db_session, service=service_1, status='delivered') - create_sample_notification(notify_db, notify_db_session, service=service_1, status='created') - - data = get_detailed_services() - data = sorted(data, key=lambda x: x['id']) - - assert len(data) == 2 - assert data[0]['id'] == str(service_1.id) - assert data[0]['statistics'] == { - 'email': {'delivered': 0, 'failed': 0, 'requested': 0}, - 'sms': {'delivered': 0, 'failed': 0, 'requested': 1} - } - assert data[1]['id'] == str(service_2.id) - assert data[1]['statistics'] == { - 'email': {'delivered': 0, 'failed': 0, 'requested': 0}, - 'sms': {'delivered': 1, 'failed': 0, 'requested': 2} - } - - -def test_get_detailed_services_groups_by_service(notify_db, notify_db_session): service_1 = create_sample_service(notify_db, notify_db_session, service_name="1", email_from='1') service_2 = create_sample_service(notify_db, notify_db_session, service_name="2", email_from='2') @@ -1226,8 +1201,33 @@ def test_get_detailed_services_groups_by_service(notify_db, notify_db_session): } +def test_get_detailed_services_includes_services_with_no_notifications(notify_db, notify_db_session): + from app.service.rest import get_detailed_services + + service_1 = create_sample_service(notify_db, notify_db_session, service_name="1", email_from='1') + service_2 = create_sample_service(notify_db, notify_db_session, service_name="2", email_from='2') + + create_sample_notification(notify_db, notify_db_session, service=service_1) + + data = get_detailed_services() + data = sorted(data, key=lambda x: x['name']) + + assert len(data) == 2 + assert data[0]['id'] == str(service_1.id) + assert data[0]['statistics'] == { + 'email': {'delivered': 0, 'failed': 0, 'requested': 0}, + 'sms': {'delivered': 0, 'failed': 0, 'requested': 1} + } + assert data[1]['id'] == str(service_2.id) + assert data[1]['statistics'] == { + 'email': {'delivered': 0, 'failed': 0, 'requested': 0}, + 'sms': {'delivered': 0, 'failed': 0, 'requested': 0} + } + def test_get_detailed_services_only_includes_todays_notifications(notify_db, notify_db_session): + from app.service.rest import get_detailed_services + create_sample_notification(notify_db, notify_db_session, created_at=datetime(2015, 10, 9, 23, 59)) create_sample_notification(notify_db, notify_db_session, created_at=datetime(2015, 10, 10, 0, 0)) create_sample_notification(notify_db, notify_db_session, created_at=datetime(2015, 10, 10, 12, 0)) diff --git a/tests/app/service/test_statistics.py b/tests/app/service/test_statistics.py index a4d8648e0..fcf854da8 100644 --- a/tests/app/service/test_statistics.py +++ b/tests/app/service/test_statistics.py @@ -7,7 +7,7 @@ from freezegun import freeze_time from app.service.statistics import ( format_statistics, _weeks_for_range, - _create_zeroed_stats_dicts, + create_zeroed_stats_dicts, format_weekly_notification_stats ) @@ -63,7 +63,7 @@ def test_weeks_for_range(start, end, dates): def test_create_zeroed_stats_dicts(): - assert _create_zeroed_stats_dicts() == { + assert create_zeroed_stats_dicts() == { 'sms': {'requested': 0, 'delivered': 0, 'failed': 0}, 'email': {'requested': 0, 'delivered': 0, 'failed': 0}, }