diff --git a/app/main/views/service_settings.py b/app/main/views/service_settings.py index bb9cb1044..d2ca667e5 100644 --- a/app/main/views/service_settings.py +++ b/app/main/views/service_settings.py @@ -302,7 +302,7 @@ def archive_service(service_id): ): abort(403) if request.method == 'POST': - service_api_client.archive_service(service_id) + service_api_client.archive_service(service_id, current_service.active_users) flash( '‘{}’ was deleted'.format(current_service.name), 'default_with_tick', diff --git a/app/notify_client/service_api_client.py b/app/notify_client/service_api_client.py index b0ad13904..7f118fec0 100644 --- a/app/notify_client/service_api_client.py +++ b/app/notify_client/service_api_client.py @@ -129,7 +129,12 @@ class ServiceAPIClient(NotifyAdminAPIClient): return self.update_service(service_id, **properties) @cache.delete('service-{service_id}') - def archive_service(self, service_id): + @cache.delete('service-{service_id}-templates') + def archive_service(self, service_id, service_users): + # We need to purge the cache for the services users as otherwise, although they will have had their permissions + # removed in the DB, they would still have permissions in the cache to view/edit/manage this service + for user in service_users: + cache.delete(f'user-{user.id}') return self.post('/service/{}/archive'.format(service_id), data=None) @cache.delete('service-{service_id}') diff --git a/tests/app/main/views/test_service_settings.py b/tests/app/main/views/test_service_settings.py index 00126e9e8..862d5b13a 100644 --- a/tests/app/main/views/test_service_settings.py +++ b/tests/app/main/views/test_service_settings.py @@ -3807,9 +3807,11 @@ def test_archive_service_after_confirm( mock_get_organisations, mock_get_service_and_organisation_counts, mock_get_organisations_and_services_for_user, + mock_get_users_by_service, user, ): mocked_fn = mocker.patch('app.service_api_client.post') + cache_delete_mock = mocker.patch('app.notify_client.service_api_client.cache.delete') client_request.login(user) page = client_request.post( 'main.archive_service', @@ -3822,6 +3824,8 @@ def test_archive_service_after_confirm( assert normalize_spaces(page.select_one('.banner-default-with-tick').text) == ( '‘service one’ was deleted' ) + # The one user which is part of this service has the sample_uuid as it's user ID + cache_delete_mock.assert_called_once_with(f"user-{sample_uuid()}") @pytest.mark.parametrize('user', ( diff --git a/tests/app/notify_client/test_service_api_client.py b/tests/app/notify_client/test_service_api_client.py index ef8dfc33d..281af2ca0 100644 --- a/tests/app/notify_client/test_service_api_client.py +++ b/tests/app/notify_client/test_service_api_client.py @@ -389,7 +389,7 @@ def test_returns_value_from_cache( @pytest.mark.parametrize('client, method, extra_args, extra_kwargs', [ (service_api_client, 'update_service', [SERVICE_ONE_ID], {'name': 'foo'}), (service_api_client, 'update_service_with_properties', [SERVICE_ONE_ID], {'properties': {}}), - (service_api_client, 'archive_service', [SERVICE_ONE_ID], {}), + (service_api_client, 'archive_service', [SERVICE_ONE_ID, []], {}), (service_api_client, 'suspend_service', [SERVICE_ONE_ID], {}), (service_api_client, 'resume_service', [SERVICE_ONE_ID], {}), (service_api_client, 'remove_user_from_service', [SERVICE_ONE_ID, ''], {}), @@ -458,6 +458,10 @@ def test_deletes_service_cache( 'template-{}-version-None'.format(FAKE_TEMPLATE_ID), 'service-{}-templates'.format(SERVICE_ONE_ID), ]), + ('archive_service', [SERVICE_ONE_ID, []], [ + 'service-{}-templates'.format(SERVICE_ONE_ID), + 'service-{}'.format(SERVICE_ONE_ID), + ]), ]) def test_deletes_caches_when_modifying_templates( app_,