diff --git a/app/service/rest.py b/app/service/rest.py index 99478ca7d..e0e1591fa 100644 --- a/app/service/rest.py +++ b/app/service/rest.py @@ -9,6 +9,7 @@ from notifications_utils.letter_timings import ( from notifications_utils.timezones import convert_utc_to_bst from sqlalchemy.exc import IntegrityError from sqlalchemy.orm.exc import NoResultFound +from werkzeug.datastructures import MultiDict from app.aws import s3 from app.config import QueueNames @@ -404,9 +405,15 @@ def get_service_history(service_id): return jsonify(data=data) -@service_blueprint.route('//notifications', methods=['GET']) +@service_blueprint.route('//notifications', methods=['GET', 'POST']) def get_all_notifications_for_service(service_id): - data = notifications_filter_schema.load(request.args).data + if request.method == 'GET': + data = notifications_filter_schema.load(request.args).data + elif request.method == 'POST': + # Must transform request.get_json() to MultiDict as NotificationsFilterSchema expects a MultiDict. + # Unlike request.args, request.get_json() does not return a MultiDict but instead just a dict. + data = notifications_filter_schema.load(MultiDict(request.get_json())).data + if data.get('to'): notification_type = data.get('template_type')[0] if data.get('template_type') else None return search_for_notification_by_to_field(service_id=service_id, diff --git a/tests/app/service/test_rest.py b/tests/app/service/test_rest.py index c8c79a765..90cd27a9d 100644 --- a/tests/app/service/test_rest.py +++ b/tests/app/service/test_rest.py @@ -1710,6 +1710,64 @@ def test_get_all_notifications_for_service_in_order(notify_api, notify_db_sessio assert response.status_code == 200 +def test_get_all_notifications_for_service_in_order_with_post_request(client, notify_db_session): + service_1 = create_service(service_name="1") + service_2 = create_service(service_name="2") + + service_1_template = create_template(service_1) + service_2_template = create_template(service_2) + + # create notification for service_2 + create_notification(service_2_template) + + notification_1 = create_notification(service_1_template) + notification_2 = create_notification(service_1_template) + notification_3 = create_notification(service_1_template) + + response = client.post( + path=f'/service/{service_1.id}/notifications', + data=json.dumps({}), + headers=[('Content-Type', 'application/json'), create_admin_authorization_header()]) + + resp = json.loads(response.get_data(as_text=True)) + assert len(resp['notifications']) == 3 + assert resp['notifications'][0]['to'] == notification_3.to + assert resp['notifications'][1]['to'] == notification_2.to + assert resp['notifications'][2]['to'] == notification_1.to + assert response.status_code == 200 + + +def test_get_all_notifications_for_service_filters_notifications_when_using_post_request(client, notify_db_session): + service_1 = create_service(service_name="1") + service_2 = create_service(service_name="2") + + service_1_sms_template = create_template(service_1) + service_1_email_template = create_template(service_1, template_type=EMAIL_TYPE) + service_2_sms_template = create_template(service_2) + + returned_notification = create_notification(service_1_sms_template, normalised_to='447700900855') + + create_notification(service_1_sms_template, to_field='+447700900000', normalised_to='447700900000') + create_notification(service_1_sms_template, status='delivered', normalised_to='447700900855') + create_notification(service_1_email_template, normalised_to='447700900855') + # create notification for service_2 + create_notification(service_2_sms_template) + + auth_header = create_admin_authorization_header() + data = {'page': 1, 'template_type': ['sms'], 'status': ['created', 'sending'], 'to': '0855'} + + response = client.post( + path=f'/service/{service_1.id}/notifications', + data=json.dumps(data), + headers=[('Content-Type', 'application/json'), auth_header]) + + resp = json.loads(response.get_data(as_text=True)) + assert len(resp['notifications']) == 1 + assert resp['notifications'][0]['to'] == returned_notification.to + assert resp['notifications'][0]['status'] == returned_notification.status + assert response.status_code == 200 + + def test_get_all_notifications_for_service_formatted_for_csv(client, sample_template): notification = create_notification(template=sample_template) auth_header = create_admin_authorization_header()