Set folder permissions when creating and accepting invites to services

Added a folder permissions form to the page to invite users to services.
This only shows if the service has 'edit_folder_permissions' enabled,
and all folder checkboxes are checked by default. This change means that
InviteApiClient.create_invite now sends folder_permissions through to
notifications_api (so invites get created with folder permissions).

Started passing the folder_permissions through to notifications-api when
accepting an invite. This changes UserApiClient.add_user_to_service to
send folder_permissions to notifications_api so that new users get folder
permissions when they are added to the service.
This commit is contained in:
Katie Smith
2019-03-15 14:57:39 +00:00
parent 782bd34394
commit c39f6d49ea
10 changed files with 82 additions and 24 deletions

View File

@@ -38,13 +38,13 @@ def test_existing_user_accept_invite_calls_api_and_redirects_to_dashboard(
mock_check_invite_token.assert_called_with('thisisnotarealtoken')
mock_get_unknown_user_by_email.assert_called_with('invited_user@test.gov.uk')
assert mock_accept_invite.call_count == 1
mock_add_user_to_service.assert_called_with(expected_service, USER_ONE_ID, expected_permissions)
mock_add_user_to_service.assert_called_with(expected_service, USER_ONE_ID, expected_permissions, [])
assert response.status_code == 302
assert response.location == url_for('main.service_dashboard', service_id=expected_service, _external=True)
def test_existing_user_with_no_permissions_accept_invite(
def test_existing_user_with_no_permissions_or_folder_permissions_accept_invite(
client,
mocker,
service_one,
@@ -59,10 +59,14 @@ def test_existing_user_with_no_permissions_accept_invite(
expected_service = service_one['id']
sample_invite['permissions'] = ''
expected_permissions = set()
expected_folder_permissions = []
mocker.patch('app.invite_api_client.accept_invite', return_value=sample_invite)
response = client.get(url_for('main.accept_invite', token='thisisnotarealtoken'))
mock_add_user_to_service.assert_called_with(expected_service, USER_ONE_ID, expected_permissions)
mock_add_user_to_service.assert_called_with(expected_service,
USER_ONE_ID,
expected_permissions,
expected_folder_permissions)
assert response.status_code == 302
@@ -212,7 +216,10 @@ def test_existing_signed_out_user_accept_invite_redirects_to_sign_in(
mock_check_invite_token.assert_called_with('thisisnotarealtoken')
mock_get_unknown_user_by_email.assert_called_with('invited_user@test.gov.uk')
mock_add_user_to_service.assert_called_with(expected_service, USER_ONE_ID, expected_permissions)
mock_add_user_to_service.assert_called_with(expected_service,
USER_ONE_ID,
expected_permissions,
sample_invite['folder_permissions'])
assert mock_accept_invite.call_count == 1
assert response.status_code == 200
@@ -490,7 +497,7 @@ def test_new_invited_user_verifies_and_added_to_service(
with client.session_transaction() as session:
new_user_id = session['user_id']
mock_add_user_to_service.assert_called_with(data['service'], new_user_id, expected_permissions)
mock_add_user_to_service.assert_called_with(data['service'], new_user_id, expected_permissions, [])
mock_accept_invite.assert_called_with(data['service'], sample_invite['id'])
mock_check_verify_code.assert_called_once_with(new_user_id, '12345', 'sms')
assert service_one['id'] == session['service_id']
@@ -528,7 +535,7 @@ def test_existing_user_accepts_and_sets_email_auth(
mock_get_unknown_user_by_email.assert_called_once_with('test@user.gov.uk')
mock_update_user_attribute.assert_called_once_with(USER_ONE_ID, auth_type='email_auth')
mock_add_user_to_service.assert_called_once_with(ANY, USER_ONE_ID, ANY)
mock_add_user_to_service.assert_called_once_with(ANY, USER_ONE_ID, ANY, ANY)
def test_existing_user_doesnt_get_auth_changed_by_service_without_permission(

View File

@@ -578,12 +578,37 @@ def test_should_show_page_for_inviting_user(
logged_in_client,
active_user_with_permissions,
mocker,
mock_get_template_folders,
):
service = create_sample_service(active_user_with_permissions)
response = logged_in_client.get(url_for('main.invite_user', service_id=service['id']))
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
assert 'Invite a team member' in response.get_data(as_text=True)
assert 'Invite a team member' in page.find('h1').text.strip()
assert response.status_code == 200
assert not page.find('div', class_='checkboxes-nested')
def test_should_show_folder_permission_form_if_service_has_folder_permissions_enabled(
logged_in_client,
mocker,
mock_get_template_folders,
service_one
):
service_one['permissions'].append('edit_folder_permissions')
mock_get_template_folders.return_value = [
{'id': 'folder-id-1', 'name': 'folder_one', 'parent_id': None, 'users_with_permission': []},
{'id': 'folder-id-2', 'name': 'folder_two', 'parent_id': None, 'users_with_permission': []},
{'id': 'folder-id-3', 'name': 'folder_three', 'parent_id': 'folder-id-1', 'users_with_permission': []},
]
response = logged_in_client.get(url_for('main.invite_user', service_id=service_one['id']))
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
assert 'Invite a team member' in page.find('h1').text.strip()
assert response.status_code == 200
folder_checkboxes = page.find('div', class_='checkboxes-nested').find_all('li')
assert len(folder_checkboxes) == 3
@pytest.mark.parametrize('email_address, gov_user', [
@@ -597,6 +622,7 @@ def test_invite_user(
sample_invite,
email_address,
gov_user,
mock_get_template_folders,
):
service = create_sample_service(active_user_with_permissions)
sample_invite['email_address'] = 'test@example.gov.uk'
@@ -629,7 +655,8 @@ def test_invite_user(
sample_invite['service'],
email_address,
expected_permissions,
'sms_auth')
'sms_auth',
folder_permissions=sample_invite['folder_permissions'])
@pytest.mark.parametrize('auth_type', [
@@ -648,7 +675,8 @@ def test_invite_user_with_email_auth_service(
gov_user,
mocker,
service_one,
auth_type
auth_type,
mock_get_template_folders,
):
service_one['permissions'].append('email_auth')
sample_invite['email_address'] = 'test@example.gov.uk'
@@ -682,7 +710,8 @@ def test_invite_user_with_email_auth_service(
sample_invite['service'],
email_address,
expected_permissions,
auth_type)
auth_type,
folder_permissions=sample_invite['folder_permissions'])
def test_cancel_invited_user_cancels_user_invitations(
@@ -785,6 +814,7 @@ def test_user_cant_invite_themselves(
mocker,
active_user_with_permissions,
mock_create_invite,
mock_get_template_folders,
):
service = create_sample_service(active_user_with_permissions)
response = logged_in_client.post(

View File

@@ -362,7 +362,7 @@ def test_returns_value_from_cache(
(service_api_client, 'delete_sms_sender', [SERVICE_ONE_ID, ''], {}),
(service_api_client, 'update_service_callback_api', [SERVICE_ONE_ID] + [''] * 4, {}),
(service_api_client, 'create_service_callback_api', [SERVICE_ONE_ID] + [''] * 3, {}),
(user_api_client, 'add_user_to_service', [SERVICE_ONE_ID, uuid4(), []], {}),
(user_api_client, 'add_user_to_service', [SERVICE_ONE_ID, uuid4(), [], []], {}),
(invite_api_client, 'accept_invite', [SERVICE_ONE_ID, uuid4()], {}),
])
def test_deletes_service_cache(

View File

@@ -152,7 +152,10 @@ def test_client_converts_admin_permissions_to_db_permissions_on_edit(app_, mocke
def test_client_converts_admin_permissions_to_db_permissions_on_add_to_service(app_, mocker):
mock_post = mocker.patch('app.notify_client.user_api_client.UserApiClient.post', return_value={'data': {}})
user_api_client.add_user_to_service('service_id', 'user_id', permissions={'send_messages', 'view_activity'})
user_api_client.add_user_to_service('service_id',
'user_id',
permissions={'send_messages', 'view_activity'},
folder_permissions=[])
assert sorted(mock_post.call_args[1]['data']['permissions'], key=lambda x: x['permission']) == sorted([
{'permission': 'send_texts'},
@@ -237,14 +240,14 @@ def test_returns_value_from_cache(
@pytest.mark.parametrize('client, method, extra_args, extra_kwargs', [
(user_api_client, 'add_user_to_service', [SERVICE_ONE_ID, sample_uuid(), []], {}),
(user_api_client, 'add_user_to_service', [SERVICE_ONE_ID, sample_uuid(), [], []], {}),
(user_api_client, 'update_user_attribute', [user_id], {}),
(user_api_client, 'reset_failed_login_count', [user_id], {}),
(user_api_client, 'update_user_attribute', [user_id], {}),
(user_api_client, 'update_password', [user_id, 'hunter2'], {}),
(user_api_client, 'verify_password', [user_id, 'hunter2'], {}),
(user_api_client, 'check_verify_code', [user_id, '', ''], {}),
(user_api_client, 'add_user_to_service', [SERVICE_ONE_ID, user_id, []], {}),
(user_api_client, 'add_user_to_service', [SERVICE_ONE_ID, user_id, [], []], {}),
(user_api_client, 'add_user_to_organisation', [sample_uuid(), user_id], {}),
(user_api_client, 'set_user_permissions', [user_id, SERVICE_ONE_ID, []], {}),
(user_api_client, 'activate_user', [api_user_pending(sample_uuid())], {}),