diff --git a/app/main/views/service_settings.py b/app/main/views/service_settings.py index 9aa2257e8..6bebd361b 100644 --- a/app/main/views/service_settings.py +++ b/app/main/views/service_settings.py @@ -305,6 +305,35 @@ def service_set_permission(service_id, permission): ) +@main.route("/services//service-settings/permissions/broadcast", methods=["GET", "POST"]) +@user_is_platform_admin +def service_set_broadcast_permission(service_id): + + title = PLATFORM_ADMIN_SERVICE_PERMISSIONS['broadcast']['title'] + form = ServiceOnOffSettingForm( + name=title, + enabled=current_service.has_permission('broadcast') + ) + + if form.validate_on_submit(): + + if form.enabled.data: + current_service.force_permission('broadcast', on=True) + current_service.force_permission('email', on=False) + current_service.force_permission('sms', on=False) + current_service.force_permission('letter', on=False) + else: + current_service.force_permission('broadcast', on=False) + + return redirect(url_for(".service_settings", service_id=service_id)) + + return render_template( + 'views/service-settings/set-service-setting.html', + title=title, + form=form, + ) + + @main.route("/services//service-settings/archive", methods=['GET', 'POST']) @user_has_permissions('manage_service') def archive_service(service_id): diff --git a/app/navigation.py b/app/navigation.py index a2a5137cd..e099d3776 100644 --- a/app/navigation.py +++ b/app/navigation.py @@ -307,6 +307,7 @@ class HeaderNavigation(Navigation): 'service_switch_count_as_live', 'service_switch_live', 'service_set_permission', + 'service_set_broadcast_permission', 'service_verify_reply_to_address', 'service_verify_reply_to_address_updates', 'services_or_dashboard', @@ -635,6 +636,7 @@ class MainNavigation(Navigation): 'service_switch_count_as_live', 'service_switch_live', 'service_set_permission', + 'service_set_broadcast_permission', 'services_or_dashboard', 'show_accounts_or_dashboard', 'sign_in', @@ -933,6 +935,7 @@ class CaseworkNavigation(Navigation): 'service_switch_count_as_live', 'service_switch_live', 'service_set_permission', + 'service_set_broadcast_permission', 'service_verify_reply_to_address', 'service_verify_reply_to_address_updates', 'services_or_dashboard', @@ -1237,6 +1240,7 @@ class OrgNavigation(Navigation): 'service_switch_count_as_live', 'service_switch_live', 'service_set_permission', + 'service_set_broadcast_permission', 'service_verify_reply_to_address', 'service_verify_reply_to_address_updates', 'services_or_dashboard', diff --git a/tests/app/main/views/service_settings/test_service_setting_permissions.py b/tests/app/main/views/service_settings/test_service_setting_permissions.py index ece67d2a3..8c88d630b 100644 --- a/tests/app/main/views/service_settings/test_service_setting_permissions.py +++ b/tests/app/main/views/service_settings/test_service_setting_permissions.py @@ -1,4 +1,5 @@ import functools +from unittest.mock import call import pytest from flask import url_for @@ -38,15 +39,34 @@ def test_service_set_permission_requires_platform_admin( ) -@pytest.mark.parametrize('permission, form_data, on', [ - ('inbound_sms', 'True', True), - ('inbound_sms', 'False', False), - ('email_auth', 'True', True), - ('email_auth', 'False', False), - ('international_letters', 'True', True), - ('international_letters', 'False', False), - ('broadcast', 'True', True), - ('broadcast', 'False', False), +@pytest.mark.parametrize('permission, form_data, expected_calls', [ + ('inbound_sms', 'True', [ + call('inbound_sms', on=True), + ]), + ('inbound_sms', 'False', [ + call('inbound_sms', on=False), + ]), + ('email_auth', 'True', [ + call('email_auth', on=True), + ]), + ('email_auth', 'False', [ + call('email_auth', on=False), + ]), + ('international_letters', 'True', [ + call('international_letters', on=True), + ]), + ('international_letters', 'False', [ + call('international_letters', on=False), + ]), + ('broadcast', 'True', [ + call('broadcast', on=True), + call('email', on=False), + call('sms', on=False), + call('letter', on=False), + ]), + ('broadcast', 'False', [ + call('broadcast', on=False), + ]), ]) def test_service_set_permission( mocker, @@ -55,7 +75,7 @@ def test_service_set_permission( mock_get_inbound_number_for_service, permission, form_data, - on + expected_calls, ): force_permission = mocker.patch('app.models.service.Service.force_permission') response = platform_admin_client.post( @@ -64,9 +84,7 @@ def test_service_set_permission( ) assert response.status_code == 302 assert response.location == url_for('main.service_settings', service_id=service_one['id'], _external=True) - force_permission.assert_called_with( - permission, on=on - ) + assert force_permission.call_args_list == expected_calls @pytest.mark.parametrize('service_fields, endpoint, kwargs, text', [