diff --git a/app/v2/notifications/get_notifications.py b/app/v2/notifications/get_notifications.py index cd721f596..14adb9028 100644 --- a/app/v2/notifications/get_notifications.py +++ b/app/v2/notifications/get_notifications.py @@ -35,6 +35,9 @@ def get_notifications(): if 'reference' in _data: _data['reference'] = _data['reference'][0] + if 'include_jobs' in _data: + _data['include_jobs'] = _data['include_jobs'][0] + data = validate(_data, get_notifications_request) paginated_notifications = notifications_dao.get_notifications_for_service( @@ -44,7 +47,8 @@ def get_notifications(): personalisation=True, older_than=data.get('older_than'), client_reference=data.get('reference'), - page_size=current_app.config.get('API_PAGE_SIZE') + page_size=current_app.config.get('API_PAGE_SIZE'), + include_jobs=data.get('include_jobs') ) def _build_links(notifications): diff --git a/app/v2/notifications/notification_schemas.py b/app/v2/notifications/notification_schemas.py index 258b5df0d..1a7959589 100644 --- a/app/v2/notifications/notification_schemas.py +++ b/app/v2/notifications/notification_schemas.py @@ -74,6 +74,7 @@ get_notifications_request = { "enum": TEMPLATE_TYPES } }, + "include_jobs": {"enum": ["true", "True"]}, "older_than": uuid }, "additionalProperties": False, @@ -88,7 +89,7 @@ get_notifications_response = { "type": "array", "items": { "type": "object", - "ref": get_notification_response + "$ref": "#/definitions/notification" } }, "links": { @@ -106,7 +107,11 @@ get_notifications_response = { } }, "additionalProperties": False, - "required": ["notifications", "links"] + "required": ["notifications", "links"], + "definitions": { + "notification": get_notification_response + }, + } post_sms_request = { diff --git a/tests/app/v2/notifications/test_get_notifications.py b/tests/app/v2/notifications/test_get_notifications.py index fc6b091c9..de80073bd 100644 --- a/tests/app/v2/notifications/test_get_notifications.py +++ b/tests/app/v2/notifications/test_get_notifications.py @@ -266,7 +266,8 @@ def test_get_notification_doesnt_have_delivery_estimate_for_non_letters( assert 'estimated_delivery' not in json.loads(response.get_data(as_text=True)) -def test_get_all_notifications_returns_200(client, sample_template): +def test_get_all_notifications_except_job_notifications_returns_200(client, sample_template, sample_job): + create_notification(template=sample_template, job=sample_job) # should not return this job notification notifications = [create_notification(template=sample_template) for _ in range(2)] notification = notifications[-1] @@ -295,6 +296,34 @@ def test_get_all_notifications_returns_200(client, sample_template): assert not json_response['notifications'][0]['scheduled_for'] +def test_get_all_notifications_with_include_jobs_arg_returns_200( + client, sample_template, sample_job +): + notifications = [ + create_notification(template=sample_template, job=sample_job), + create_notification(template=sample_template) + ] + notification = notifications[-1] + + auth_header = create_authorization_header(service_id=notification.service_id) + response = client.get( + path='/v2/notifications?include_jobs=true', + headers=[('Content-Type', 'application/json'), auth_header]) + + json_response = json.loads(response.get_data(as_text=True)) + + assert response.status_code == 200 + assert json_response['links']['current'].endswith("/v2/notifications?include_jobs=true") + assert 'next' in json_response['links'].keys() + assert len(json_response['notifications']) == 2 + + assert json_response['notifications'][0]['id'] == str(notification.id) + assert json_response['notifications'][0]['status'] == notification.status + assert json_response['notifications'][0]['phone_number'] == notification.to + assert json_response['notifications'][0]['type'] == notification.template.template_type + assert not json_response['notifications'][0]['scheduled_for'] + + def test_get_all_notifications_no_notifications_if_no_notifications(client, sample_service): auth_header = create_authorization_header(service_id=sample_service.id) response = client.get( diff --git a/tests/app/v2/notifications/test_notification_schemas.py b/tests/app/v2/notifications/test_notification_schemas.py index 6b51b195d..a523dae8a 100644 --- a/tests/app/v2/notifications/test_notification_schemas.py +++ b/tests/app/v2/notifications/test_notification_schemas.py @@ -5,6 +5,7 @@ from flask import json from freezegun import freeze_time from jsonschema import ValidationError +from app.models import NOTIFICATION_CREATED, EMAIL_TYPE from app.schema_validation import validate from app.v2.notifications.notification_schemas import ( get_notifications_request, @@ -13,6 +14,22 @@ from app.v2.notifications.notification_schemas import ( ) +valid_get_json = {} + +valid_get_with_optionals_json = { + "reference": "test reference", + "status": [NOTIFICATION_CREATED], + "template_type": [EMAIL_TYPE], + "include_jobs": "true", + "older_than": "a5149c32-f03b-4711-af49-ad6993797d45" +} + + +@pytest.mark.parametrize("input", [valid_get_json, valid_get_with_optionals_json]) +def test_get_notifications_valid_json(input): + assert validate(input, get_notifications_request) == input + + @pytest.mark.parametrize('invalid_statuses, valid_statuses', [ # one invalid status (["elephant"], []),