Files
notifications-admin/tests/app/main/test_permissions.py
T

242 lines
5.9 KiB
Python
Raw Normal View History

2016-02-19 16:38:04 +00:00
import pytest
from flask import request
2018-02-20 11:22:17 +00:00
from werkzeug.exceptions import Forbidden, Unauthorized
from app.main.views.index import index
2018-02-28 15:37:49 +00:00
from app.notify_client.models import (
translate_permissions_from_admin_roles_to_db,
translate_permissions_from_db_to_admin_roles,
)
2018-02-20 11:22:17 +00:00
from app.utils import user_has_permissions
2016-02-19 16:38:04 +00:00
2017-02-03 10:42:01 +00:00
def _test_permissions(
2017-02-03 12:07:21 +00:00
client,
2017-02-03 10:42:01 +00:00
usr,
permissions,
will_succeed,
kwargs={}
2017-02-03 10:42:01 +00:00
):
request.view_args.update({'service_id': 'foo'})
2017-02-03 12:07:21 +00:00
if usr:
client.login(usr)
decorator = user_has_permissions(*permissions, **kwargs)
2017-02-03 12:07:21 +00:00
decorated_index = decorator(index)
2017-02-03 12:07:21 +00:00
if will_succeed:
2017-10-18 14:51:26 +01:00
decorated_index()
2017-02-03 12:07:21 +00:00
else:
try:
2017-10-18 14:51:26 +01:00
decorated_index()
2017-02-03 12:07:21 +00:00
pytest.fail("Failed to throw a forbidden or unauthorised exception")
except (Forbidden, Unauthorized):
pass
2016-03-09 13:51:56 +00:00
2017-02-03 10:42:01 +00:00
def test_user_has_permissions_on_endpoint_fail(
2017-02-03 12:07:21 +00:00
client,
2017-02-03 10:42:01 +00:00
mocker,
):
user = _user_with_permissions()
mocker.patch('app.user_api_client.get_user', return_value=user)
2016-03-09 13:51:56 +00:00
_test_permissions(
2017-02-03 12:07:21 +00:00
client,
user,
['send_messages'],
will_succeed=False)
2016-03-03 09:02:56 +00:00
2017-02-03 10:42:01 +00:00
def test_user_has_permissions_success(
2017-02-03 12:07:21 +00:00
client,
2017-02-03 10:42:01 +00:00
mocker,
):
user = _user_with_permissions()
mocker.patch('app.user_api_client.get_user', return_value=user)
2016-03-09 13:51:56 +00:00
_test_permissions(
2017-02-03 12:07:21 +00:00
client,
user,
['manage_service'],
will_succeed=True)
2016-03-03 09:02:56 +00:00
2017-02-03 10:42:01 +00:00
def test_user_has_permissions_or(
2017-02-03 12:07:21 +00:00
client,
2017-02-03 10:42:01 +00:00
mocker,
):
user = _user_with_permissions()
mocker.patch('app.user_api_client.get_user', return_value=user)
2016-03-09 13:51:56 +00:00
_test_permissions(
2017-02-03 12:07:21 +00:00
client,
user,
['send_messages', 'manage_service'],
will_succeed=True)
2016-03-03 09:02:56 +00:00
2017-02-03 10:42:01 +00:00
def test_user_has_permissions_multiple(
2017-02-03 12:07:21 +00:00
client,
2017-02-03 10:42:01 +00:00
mocker,
):
user = _user_with_permissions()
mocker.patch('app.user_api_client.get_user', return_value=user)
2016-03-09 13:51:56 +00:00
_test_permissions(
2017-02-03 12:07:21 +00:00
client,
user,
['manage_templates', 'manage_service'],
will_succeed=True)
2016-03-04 10:09:46 +00:00
2017-02-03 10:42:01 +00:00
def test_exact_permissions(
2017-02-03 12:07:21 +00:00
client,
2017-02-03 10:42:01 +00:00
mocker,
):
user = _user_with_permissions()
mocker.patch('app.user_api_client.get_user', return_value=user)
2016-03-09 13:51:56 +00:00
_test_permissions(
2017-02-03 12:07:21 +00:00
client,
user,
['manage_service', 'manage_templates'],
will_succeed=True)
2016-03-17 14:25:28 +00:00
def test_platform_admin_user_can_access_page_that_has_no_permissions(
2017-02-03 12:07:21 +00:00
client,
2017-02-03 10:42:01 +00:00
platform_admin_user,
mocker,
):
mocker.patch('app.user_api_client.get_user', return_value=platform_admin_user)
2016-03-17 14:25:28 +00:00
_test_permissions(
2017-02-03 12:07:21 +00:00
client,
2016-03-17 14:25:28 +00:00
platform_admin_user,
[],
will_succeed=True)
2016-03-17 14:25:28 +00:00
2017-02-03 10:42:01 +00:00
def test_platform_admin_user_can_not_access_page(
2017-02-03 12:07:21 +00:00
client,
2017-02-03 10:42:01 +00:00
platform_admin_user,
mocker,
):
mocker.patch('app.user_api_client.get_user', return_value=platform_admin_user)
2016-03-17 14:25:28 +00:00
_test_permissions(
2017-02-03 12:07:21 +00:00
client,
2016-03-17 14:25:28 +00:00
platform_admin_user,
[],
2016-03-21 15:36:47 +00:00
will_succeed=False,
kwargs={'restrict_admin_usage': True})
2017-02-03 10:42:01 +00:00
def test_no_user_returns_401_unauth(
2017-02-03 12:07:21 +00:00
client
2017-02-03 10:42:01 +00:00
):
from flask_login import current_user
2017-02-03 12:07:21 +00:00
assert not current_user.is_authenticated
_test_permissions(
2017-02-03 12:07:21 +00:00
client,
None,
[],
will_succeed=False)
def test_user_has_permissions_for_organisation(
client,
mocker,
):
user = _user_with_permissions()
user.organisations = ['org_1', 'org_2']
mocker.patch('app.user_api_client.get_user', return_value=user)
client.login(user)
request.view_args = {'org_id': 'org_2'}
@user_has_permissions()
def index():
pass
index()
def test_platform_admin_can_see_orgs_they_dont_have(
client,
platform_admin_user,
mocker,
):
platform_admin_user.organisations = []
mocker.patch('app.user_api_client.get_user', return_value=platform_admin_user)
client.login(platform_admin_user)
request.view_args = {'org_id': 'org_2'}
@user_has_permissions()
def index():
pass
index()
def test_cant_use_decorator_without_view_args(
client,
platform_admin_user,
mocker,
):
mocker.patch('app.user_api_client.get_user', return_value=platform_admin_user)
client.login(platform_admin_user)
request.view_args = {}
@user_has_permissions()
def index():
pass
with pytest.raises(NotImplementedError):
index()
def test_user_doesnt_have_permissions_for_organisation(
client,
mocker,
):
user = _user_with_permissions()
user.organisations = ['org_1', 'org_2']
mocker.patch('app.user_api_client.get_user', return_value=user)
client.login(user)
request.view_args = {'org_id': 'org_3'}
@user_has_permissions()
def index():
pass
with pytest.raises(Forbidden):
index()
def _user_with_permissions():
from app.notify_client.user_api_client import User
user_data = {'id': 999,
'name': 'Test User',
'password': 'somepassword',
'email_address': 'test@user.gov.uk',
'mobile_number': '+4412341234',
'state': 'active',
'failed_login_count': 0,
'permissions': {'foo': ['manage_users', 'manage_templates', 'manage_settings']},
'platform_admin': False,
'organisations': ['org_1', 'org_2'],
}
user = User(user_data)
return user
2018-02-28 15:37:49 +00:00
def test_translate_permissions_from_db_to_admin_roles():
db_perms = ['send_texts', 'send_emails', 'send_letters', 'manage_templates', 'some_unknown_permission']
roles = translate_permissions_from_db_to_admin_roles(db_perms)
assert roles == {'send_messages', 'manage_templates', 'some_unknown_permission'}
def test_translate_permissions_from_admin_roles_to_db():
roles = ['send_messages', 'manage_templates', 'some_unknown_permission']
db_perms = translate_permissions_from_admin_roles_to_db(roles)
assert db_perms == {'send_texts', 'send_emails', 'send_letters', 'manage_templates', 'some_unknown_permission'}