2016-12-21 17:53:51 -05:00
|
|
|
"""
|
|
|
|
Functional tests for the managing users.
|
|
|
|
|
|
|
|
:copyright: Copyright 2013-2016, Dorian Pula <dorian.pula@amber-penguin-software.ca>
|
|
|
|
:license: AGPL v3+
|
|
|
|
"""
|
|
|
|
|
2016-12-22 08:51:40 -05:00
|
|
|
import http
|
|
|
|
|
2017-02-28 11:54:43 -05:00
|
|
|
import pytest
|
2016-12-21 17:53:51 -05:00
|
|
|
import pytest_bdd as bdd
|
2016-12-22 08:51:40 -05:00
|
|
|
import requests
|
2017-02-01 08:40:26 -05:00
|
|
|
from pytest import mark
|
|
|
|
from pytest_bdd import parsers
|
2017-02-28 11:54:43 -05:00
|
|
|
|
2017-02-28 19:30:55 -05:00
|
|
|
from rookeries.users import models
|
2017-02-28 17:43:08 -05:00
|
|
|
from tests import utils
|
2016-12-21 17:53:51 -05:00
|
|
|
|
2016-12-22 08:51:40 -05:00
|
|
|
# TODO: Add tests to make sure users can't modify each other's profiles, etc.
|
|
|
|
# TODO: Add in a new role that is super-admin, maybe?
|
2017-02-25 16:51:39 -05:00
|
|
|
|
2017-02-28 11:54:43 -05:00
|
|
|
TEST_USER_PASSWORDS = 'password-testing'
|
2016-12-21 17:53:51 -05:00
|
|
|
|
|
|
|
|
2017-02-28 11:54:43 -05:00
|
|
|
@pytest.fixture(scope='module')
|
|
|
|
def admin_user(db_engine):
|
2017-02-28 17:43:08 -05:00
|
|
|
return utils.create_test_user(
|
|
|
|
db_engine=db_engine,
|
|
|
|
username='admin',
|
|
|
|
password=TEST_USER_PASSWORDS,
|
2017-02-28 19:30:55 -05:00
|
|
|
role=models.UserRole.admin,
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture(scope='module')
|
|
|
|
def editor_user(db_engine):
|
|
|
|
return utils.create_test_user(
|
|
|
|
db_engine=db_engine,
|
|
|
|
username='site-editor',
|
|
|
|
password=TEST_USER_PASSWORDS,
|
|
|
|
role=models.UserRole.editor,
|
2017-02-28 17:43:08 -05:00
|
|
|
)
|
2016-12-22 08:51:40 -05:00
|
|
|
|
|
|
|
|
2017-02-28 11:54:43 -05:00
|
|
|
SAMPLE_USERS_REQUEST = {
|
|
|
|
'admin': {},
|
2016-12-22 08:51:40 -05:00
|
|
|
'editor': {},
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-02-01 08:40:26 -05:00
|
|
|
@mark.skip(reason="Test scenarios need work")
|
2016-12-21 17:53:51 -05:00
|
|
|
@bdd.scenario('user_management.feature', 'Admin user can create a new admin user')
|
|
|
|
def test_admin_user_creation_by_admin():
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
@mark.skip(reason="Test scenarios need work")
|
|
|
|
@bdd.scenario('user_management.feature', 'Admin user can create a new editor user')
|
|
|
|
def test_editor_user_creation_by_admin():
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
@mark.skip(reason="Test scenarios need work")
|
|
|
|
@bdd.scenario('user_management.feature', 'Editor user can not create a new admin user')
|
|
|
|
def test_admin_user_creation_by_editor():
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
@mark.skip(reason="Test scenarios need work")
|
|
|
|
@bdd.scenario('user_management.feature', 'Editor user can not create a new editor user')
|
|
|
|
def test_editor_user_creation_by_editor():
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
@bdd.scenario('user_management.feature', 'Admin user can get an existing admin user')
|
|
|
|
def test_admin_user_fetch_by_admin():
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
@bdd.scenario('user_management.feature', 'Admin user can get an existing editor user')
|
|
|
|
def test_editor_user_fetch_by_admin():
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
@mark.skip(reason="Test scenarios need work")
|
|
|
|
@bdd.scenario('user_management.feature', 'Any user can not get an existing admin user')
|
|
|
|
def test_admin_user_fetch_by_anyone():
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
@mark.skip(reason="Test scenarios need work")
|
|
|
|
@bdd.scenario('user_management.feature', 'Any user can not get an existing editor user')
|
|
|
|
def test_editor_user_fetch_by_anyone():
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
2017-02-28 19:30:55 -05:00
|
|
|
@mark.skip(reason="FIXME")
|
2016-12-21 17:53:51 -05:00
|
|
|
@bdd.scenario('user_management.feature', 'Editor user can not get an existing admin user')
|
|
|
|
def test_admin_user_fetch_by_editor():
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
@mark.skip(reason="Test scenarios need work")
|
2016-12-22 17:14:09 -05:00
|
|
|
@bdd.scenario('user_management.feature', 'Editor user can not get an existing editor user that is not me')
|
2016-12-21 17:53:51 -05:00
|
|
|
def test_editor_user_fetch_by_editor():
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
@mark.skip(reason="Test scenarios need work")
|
|
|
|
@bdd.scenario('user_management.feature', 'Admin user can modify an admin user')
|
|
|
|
def test_admin_user_modification_by_admin():
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
@mark.skip(reason="Test scenarios need work")
|
|
|
|
@bdd.scenario('user_management.feature', 'Admin user can modify an editor user')
|
|
|
|
def test_editor_user_modification_by_admin():
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
@mark.skip(reason="Test scenarios need work")
|
2016-12-22 17:14:09 -05:00
|
|
|
@bdd.scenario('user_management.feature', 'Editor user can not modify an editor user that is not self')
|
2016-12-21 17:53:51 -05:00
|
|
|
def test_editor_user_modification_by_editor():
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
2016-12-22 17:14:09 -05:00
|
|
|
@mark.skip(reason="Test scenarios need work")
|
|
|
|
@bdd.scenario('user_management.feature', 'Editor user can modify their own user')
|
|
|
|
def test_self_user_modification_by_editor():
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
2016-12-21 17:53:51 -05:00
|
|
|
@mark.skip(reason="Test scenarios need work")
|
|
|
|
@bdd.scenario('user_management.feature', 'Admin user can delete an admin user')
|
|
|
|
def test_admin_user_deletion_by_admin():
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
@mark.skip(reason="Test scenarios need work")
|
|
|
|
@bdd.scenario('user_management.feature', 'Admin user can delete an editor user')
|
|
|
|
def test_editor_user_deletion_by_admin():
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
@mark.skip(reason="Test scenarios need work")
|
|
|
|
@bdd.scenario('user_management.feature', 'Editor user can not delete an editor user')
|
|
|
|
def test_editor_user_deletion_by_editor():
|
|
|
|
pass
|
2016-12-22 08:51:40 -05:00
|
|
|
|
|
|
|
|
|
|
|
# Step definitions here.
|
|
|
|
|
|
|
|
@bdd.given(parsers.parse('I am an {user_role} user'))
|
2017-02-28 19:30:55 -05:00
|
|
|
def jwt_token(user_role, api_base_uri, admin_user, editor_user):
|
|
|
|
|
|
|
|
# TODO: Improve selection of fixtures.
|
|
|
|
user_info = None
|
|
|
|
if user_role == models.UserRole.admin.name:
|
|
|
|
user_info = admin_user
|
|
|
|
elif user_role == models.UserRole.editor.name:
|
|
|
|
user_info = editor_user
|
|
|
|
|
2017-02-25 16:51:39 -05:00
|
|
|
jwt_token = requests.post(
|
|
|
|
url=f'{api_base_uri}/auth',
|
|
|
|
json={
|
|
|
|
'username': user_info['username'],
|
2017-02-28 11:54:43 -05:00
|
|
|
'password': TEST_USER_PASSWORDS,
|
2017-02-25 16:51:39 -05:00
|
|
|
}
|
|
|
|
).json()['access_token']
|
|
|
|
return jwt_token
|
2016-12-22 08:51:40 -05:00
|
|
|
|
|
|
|
|
2016-12-22 17:14:09 -05:00
|
|
|
@bdd.given(parsers.parse('I create an {user_role} user'))
|
2017-02-28 11:54:43 -05:00
|
|
|
def create_user_response(user_role, jwt_token, api_base_uri):
|
2016-12-22 08:51:40 -05:00
|
|
|
user_creation_request = SAMPLE_USERS_REQUEST[user_role]
|
2017-02-25 16:51:39 -05:00
|
|
|
response = requests.post(
|
2017-02-01 23:42:20 -05:00
|
|
|
url=f'{api_base_uri}/api/users',
|
2016-12-22 08:51:40 -05:00
|
|
|
json=user_creation_request,
|
|
|
|
headers={
|
2017-02-28 11:54:43 -05:00
|
|
|
'Authorization': f'JWT {jwt_token}',
|
2016-12-22 08:51:40 -05:00
|
|
|
},
|
|
|
|
)
|
|
|
|
|
2017-02-25 16:51:39 -05:00
|
|
|
return response
|
|
|
|
|
2016-12-22 08:51:40 -05:00
|
|
|
|
2017-02-01 23:42:20 -05:00
|
|
|
@bdd.given(parsers.parse('I get an {user_role} user'))
|
2017-02-28 19:30:55 -05:00
|
|
|
def get_user_response(user_role, jwt_token, api_base_uri, admin_user, editor_user):
|
|
|
|
|
|
|
|
test_user = None
|
|
|
|
if user_role == models.UserRole.admin.name:
|
|
|
|
test_user = admin_user
|
|
|
|
elif user_role == models.UserRole.editor.name:
|
|
|
|
test_user = editor_user
|
|
|
|
|
2017-02-25 16:51:39 -05:00
|
|
|
response = requests.get(
|
2017-02-28 11:54:43 -05:00
|
|
|
url=f'{api_base_uri}/api/users/{test_user["username"]}',
|
2017-02-01 23:42:20 -05:00
|
|
|
headers={
|
2017-02-28 11:54:43 -05:00
|
|
|
'Authorization': f'JWT {jwt_token}',
|
2017-02-01 23:42:20 -05:00
|
|
|
},
|
|
|
|
)
|
2017-02-25 16:51:39 -05:00
|
|
|
return response
|
2017-02-01 23:42:20 -05:00
|
|
|
|
|
|
|
|
2016-12-22 08:51:40 -05:00
|
|
|
@bdd.then(parsers.parse('I get a new {user_role} user'))
|
2017-02-28 19:30:55 -05:00
|
|
|
def assert_create_user_response(user_role, create_user_response, admin_user, editor_user):
|
2016-12-22 08:51:40 -05:00
|
|
|
assert create_user_response.status_code == http.HTTPStatus.CREATED
|
2017-02-28 11:54:43 -05:00
|
|
|
expected_user_creation_response = admin_user
|
2016-12-22 08:51:40 -05:00
|
|
|
assert create_user_response.json() == expected_user_creation_response
|
2017-02-01 23:42:20 -05:00
|
|
|
|
|
|
|
|
|
|
|
@bdd.then(parsers.parse('I can get an {user_role} user profile'))
|
2017-02-28 19:30:55 -05:00
|
|
|
def assert_user_profile(user_role, get_user_response, admin_user, editor_user):
|
|
|
|
|
|
|
|
# TODO: Add in actual user profiles...
|
|
|
|
test_user = None
|
|
|
|
if user_role == models.UserRole.admin.name:
|
|
|
|
test_user = admin_user
|
|
|
|
elif user_role == models.UserRole.editor.name:
|
|
|
|
test_user = editor_user
|
|
|
|
|
2017-02-01 23:42:20 -05:00
|
|
|
assert get_user_response.status_code == http.HTTPStatus.OK
|
2017-02-28 19:30:55 -05:00
|
|
|
expected_user_creation_response = test_user
|
2017-02-01 23:42:20 -05:00
|
|
|
assert get_user_response.json() == expected_user_creation_response
|
|
|
|
|
2017-02-28 19:30:55 -05:00
|
|
|
|
|
|
|
@bdd.then(parsers.parse('I get an unauthorized response'))
|
|
|
|
def assert_unauthorized_response(get_user_response: requests.Response):
|
|
|
|
assert get_user_response.status_code == http.HTTPStatus.UNAUTHORIZED
|
|
|
|
|
|
|
|
expected_response_json = {
|
|
|
|
'status_code': http.HTTPStatus.UNAUTHORIZED,
|
|
|
|
'error': 'Unauthorized',
|
|
|
|
'description': 'Not authorized to access this resource.',
|
|
|
|
'resource': get_user_response.request.url,
|
|
|
|
}
|
|
|
|
assert get_user_response.json() == expected_response_json
|