From 4b3e826ec802aed16fc8f86d52ba38c6f0c912ce Mon Sep 17 00:00:00 2001 From: Pea Tyczynska Date: Fri, 28 May 2021 15:06:31 +0100 Subject: [PATCH] Let platform admins add or update service reply to email address without the need for verification. This is for when the email takes too long to arrive and the service users cannot update it as a result. A more streamlined solution has been proposed where we could send a link in the verification email to the users and clicking that link would add/update reply-email-to address. That would require a bit more work so right now I am proposing this as a quick stop gap so that we don't have to go to the database manually to add the reply-to email address. --- app/main/views/service_settings.py | 42 ++++++----- tests/app/main/views/test_service_settings.py | 69 +++++++++++++++++++ 2 files changed, 94 insertions(+), 17 deletions(-) diff --git a/app/main/views/service_settings.py b/app/main/views/service_settings.py index 5153351a3..652c0c059 100644 --- a/app/main/views/service_settings.py +++ b/app/main/views/service_settings.py @@ -511,22 +511,30 @@ def service_add_email_reply_to(service_id): first_email_address = current_service.count_email_reply_to_addresses == 0 is_default = first_email_address if first_email_address else form.is_default.data if form.validate_on_submit(): - try: - notification_id = service_api_client.verify_reply_to_email_address( - service_id, form.email_address.data - )["data"]["id"] - except HTTPError as e: - if e.status_code == 409: - flash(e.message, 'error') - return redirect(url_for('.service_email_reply_to', service_id=service_id)) - else: - raise e - return redirect(url_for( - '.service_verify_reply_to_address', - service_id=service_id, - notification_id=notification_id, - is_default=is_default - )) + if current_user.platform_admin: + service_api_client.add_reply_to_email_address( + service_id, + email_address=form.email_address.data, + is_default=is_default + ) + return redirect(url_for('.service_email_reply_to', service_id=service_id)) + else: + try: + notification_id = service_api_client.verify_reply_to_email_address( + service_id, form.email_address.data + )["data"]["id"] + except HTTPError as e: + if e.status_code == 409: + flash(e.message, 'error') + return redirect(url_for('.service_email_reply_to', service_id=service_id)) + else: + raise e + return redirect(url_for( + '.service_verify_reply_to_address', + service_id=service_id, + notification_id=notification_id, + is_default=is_default + )) return render_template( 'views/service-settings/email-reply-to/add.html', @@ -630,7 +638,7 @@ def service_edit_email_reply_to(service_id, reply_to_email_id): form.email_address.data = reply_to_email_address['email_address'] form.is_default.data = reply_to_email_address['is_default'] if form.validate_on_submit(): - if form.email_address.data == reply_to_email_address["email_address"]: + if form.email_address.data == reply_to_email_address["email_address"] or current_user.platform_admin: service_api_client.update_reply_to_email_address( current_service.id, reply_to_email_id=reply_to_email_id, diff --git a/tests/app/main/views/test_service_settings.py b/tests/app/main/views/test_service_settings.py index 0fc8bf55c..25cef5665 100644 --- a/tests/app/main/views/test_service_settings.py +++ b/tests/app/main/views/test_service_settings.py @@ -2443,6 +2443,39 @@ def test_add_reply_to_email_address_sends_test_notification( mock_verify.assert_called_once_with(SERVICE_ONE_ID, "test@example.com") +def test_service_add_reply_to_email_address_without_verification_for_platform_admin( + mocker, + client_request, + platform_admin_user +): + client_request.login(platform_admin_user) + + mock_update = mocker.patch( + 'app.service_api_client.add_reply_to_email_address' + ) + mocker.patch( + 'app.service_api_client.get_reply_to_email_addresses', + return_value=[create_reply_to_email_address(is_default=True)] + ) + data = {"is_default": "y", "email_address": "test@example.gov.uk"} + + client_request.post( + 'main.service_add_email_reply_to', + service_id=SERVICE_ONE_ID, + _data=data, + _expected_status=302, + _expected_redirect=url_for( + 'main.service_email_reply_to', + service_id=SERVICE_ONE_ID, + _external=True, + ) + ) + mock_update.assert_called_once_with( + SERVICE_ONE_ID, + email_address='test@example.gov.uk', + is_default=True) + + @pytest.mark.parametrize("is_default,replace,expected_header", [(True, "&replace=123", "Change"), (False, "", "Add")]) @pytest.mark.parametrize("status,expected_failure,expected_success", [ ("delivered", 0, 1), @@ -2708,6 +2741,42 @@ def test_edit_reply_to_email_address_sends_verification_notification_if_address_ mock_verify.assert_called_once_with(SERVICE_ONE_ID, "test@example.gov.uk") +def test_service_edit_email_reply_to_updates_email_address_without_verification_for_platform_admin( + mocker, + fake_uuid, + client_request, + platform_admin_user +): + client_request.login(platform_admin_user) + + mock_update = mocker.patch( + 'app.service_api_client.update_reply_to_email_address' + ) + mocker.patch( + 'app.service_api_client.get_reply_to_email_address', + return_value=create_reply_to_email_address(is_default=True) + ) + data = {"is_default": "y", "email_address": "test@example.gov.uk"} + + client_request.post( + 'main.service_edit_email_reply_to', + service_id=SERVICE_ONE_ID, + reply_to_email_id=fake_uuid, + _data=data, + _expected_status=302, + _expected_redirect=url_for( + 'main.service_email_reply_to', + service_id=SERVICE_ONE_ID, + _external=True, + ) + ) + mock_update.assert_called_once_with( + SERVICE_ONE_ID, + reply_to_email_id=fake_uuid, + email_address='test@example.gov.uk', + is_default=True) + + @pytest.mark.parametrize('reply_to_address, data, api_default_args', [ (create_reply_to_email_address(), {"is_default": "y"}, True), (create_reply_to_email_address(), {}, True),