diff --git a/app/utils.py b/app/utils.py index a6d38de51..6f2c9e3ec 100644 --- a/app/utils.py +++ b/app/utils.py @@ -89,7 +89,7 @@ def get_errors_for_csv(recipients, template_type): def generate_notifications_csv(json_list): - from app import format_datetime + from app import format_datetime, format_notification_status content = StringIO() retval = None with content as csvfile: @@ -102,7 +102,7 @@ def generate_notifications_csv(json_list): x['template']['name'], x['template']['template_type'], x['job']['original_file_name'] if x['job'] else '', - x['status'], + format_notification_status(x['status'], x['template']['template_type']), format_datetime(x['created_at'])]) retval = content.getvalue() return retval diff --git a/tests/__init__.py b/tests/__init__.py index 79dfd64f1..df6d357fb 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -149,13 +149,15 @@ def job_json(service_id, original_file_name="thisisatest.csv", notification_count=1, notifications_sent=1, - status=''): + status=None): if job_id is None: job_id = str(generate_uuid()) if template_id is None: template_id = str(generate_uuid()) if created_at is None: created_at = str(datetime.utcnow().time()) + if status is None: + status = 'Delivered' data = { 'id': job_id, 'service': service_id, @@ -174,16 +176,19 @@ def job_json(service_id, return data -def notification_json(service_id, - job=None, - template=None, - to='07123456789', - status='delivered', - sent_at=None, - job_row_number=None, - created_at=None, - updated_at=None, - with_links=False): +def notification_json( + service_id, + job=None, + template=None, + to='07123456789', + status=None, + sent_at=None, + job_row_number=None, + created_at=None, + updated_at=None, + with_links=False, + rows=5 +): if template is None: template = template_json(service_id, str(generate_uuid())) if sent_at is None: @@ -192,6 +197,8 @@ def notification_json(service_id, created_at = str(datetime.utcnow().time()) if updated_at is None: updated_at = str((datetime.utcnow() + timedelta(minutes=1)).time()) + if status is None: + status = 'delivered' links = {} if with_links: links = { @@ -213,7 +220,7 @@ def notification_json(service_id, 'updated_at': updated_at, 'job_row_number': job_row_number, 'template_version': template['version'] - } for i in range(5)], + } for i in range(rows)], 'total': 5, 'page_size': 50, 'links': links diff --git a/tests/app/main/views/test_jobs.py b/tests/app/main/views/test_jobs.py index 850a6f80a..b7fcc6460 100644 --- a/tests/app/main/views/test_jobs.py +++ b/tests/app/main/views/test_jobs.py @@ -152,7 +152,7 @@ def test_should_show_updates_for_one_job_as_json( assert 'Recipient' in content['notifications'] assert '07123456789' in content['notifications'] assert 'Status' in content['notifications'] - assert job_json['status'] in content['status'] + print(content['notifications']) assert 'Delivered' in content['notifications'] assert '11:10' in content['notifications'] assert 'Uploaded by Test User on 1 January at 11:09' in content['status'] diff --git a/tests/app/test_utils.py b/tests/app/test_utils.py index edb400a33..4f64a5a09 100644 --- a/tests/app/test_utils.py +++ b/tests/app/test_utils.py @@ -1,4 +1,8 @@ -from app.utils import email_safe +import pytest +from io import StringIO +from app.utils import email_safe, generate_notifications_csv +from csv import DictReader +from freezegun import freeze_time def test_email_safe_return_dot_separated_email_domain(): @@ -6,3 +10,41 @@ def test_email_safe_return_dot_separated_email_domain(): expected = 'some.service.withstuff.b123' actual = email_safe(test_name) assert actual == expected + + +@pytest.mark.parametrize( + "status, template_type, expected_status", + [ + ('sending', None, 'Sending'), + ('delivered', None, 'Delivered'), + ('failed', None, 'Failed'), + ('technical-failure', None, 'Technical failure'), + ('temporary-failure', 'email', 'Inbox not accepting messages right now'), + ('permanent-failure', 'email', 'Email address doesn’t exist'), + ('temporary-failure', 'sms', 'Phone not accepting messages right now'), + ('permanent-failure', 'sms', 'Phone number doesn’t exist') + ] +) +@freeze_time("2016-01-01 11:09:00.061258") +def test_generate_csv_from_notifications( + app_, + service_one, + active_user_with_permissions, + mock_get_notifications, + status, + template_type, + expected_status +): + with app_.test_request_context(): + csv_content = generate_notifications_csv( + mock_get_notifications( + service_one['id'], + rows=1, + set_template_type=template_type, + set_status=status + )['notifications'] + ) + + for row in DictReader(StringIO(csv_content)): + assert row['Time'] == 'Friday 01 January 2016 at 11:09' + assert row['Status'] == expected_status diff --git a/tests/conftest.py b/tests/conftest.py index f54853382..35c881a18 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -870,17 +870,36 @@ def mock_get_jobs(mocker, api_user_active): @pytest.fixture(scope='function') def mock_get_notifications(mocker, api_user_active): - def _get_notifications(service_id, - job_id=None, - page=1, - page_size=50, - template_type=None, - status=None, - limit_days=None): + def _get_notifications( + service_id, + job_id=None, + page=1, + page_size=50, + template_type=None, + status=None, + limit_days=None, + rows=5, + set_template_type=None, + set_status=None + ): job = None if job_id is not None: job = job_json(service_id, api_user_active, job_id=job_id) - return notification_json(service_id, job=job) + if set_template_type: + return notification_json( + service_id, + template={'template_type': set_template_type, 'name': 'name', 'id': 'id', 'version': 1}, + rows=rows, + status=set_status, + job=job + ) + else: + return notification_json( + service_id, + rows=rows, + status=set_status, + job=job + ) return mocker.patch( 'app.notification_api_client.get_notifications_for_service',