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_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
|
|
|
|
2017-03-01 23:58:05 -05:00
|
|
|
bdd.scenarios('user_management.feature')
|
|
|
|
|
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-03-01 22:34:23 -05:00
|
|
|
# TODO: Add scenarios regarding subscriber users.
|
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-03-01 22:34:23 -05:00
|
|
|
@pytest.fixture(scope='module')
|
|
|
|
def subscriber_user(db_engine):
|
|
|
|
return utils.create_test_user(
|
|
|
|
db_engine=db_engine,
|
|
|
|
username='site-member',
|
|
|
|
password=TEST_USER_PASSWORDS,
|
|
|
|
role=models.UserRole.subscriber,
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2017-03-01 09:18:44 -05:00
|
|
|
@pytest.fixture(scope='module')
|
|
|
|
def non_existent_user():
|
|
|
|
return {
|
|
|
|
'username': 'does-not-exist',
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-02-28 11:54:43 -05:00
|
|
|
SAMPLE_USERS_REQUEST = {
|
|
|
|
'admin': {},
|
2016-12-22 08:51:40 -05:00
|
|
|
'editor': {},
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# Step definitions here.
|
|
|
|
|
|
|
|
@bdd.given(parsers.parse('I am an {user_role} user'))
|
2017-03-01 23:58:05 -05:00
|
|
|
@bdd.given(parsers.parse('I am a {user_role} user'))
|
2017-03-01 22:34:23 -05:00
|
|
|
def jwt_token(user_role, api_base_uri, admin_user, editor_user, subscriber_user, non_existent_user):
|
2017-02-28 19:30:55 -05:00
|
|
|
|
|
|
|
# TODO: Improve selection of fixtures.
|
2017-03-01 22:34:23 -05:00
|
|
|
user_info = non_existent_user
|
2017-02-28 19:30:55 -05:00
|
|
|
if user_role == models.UserRole.admin.name:
|
|
|
|
user_info = admin_user
|
|
|
|
elif user_role == models.UserRole.editor.name:
|
|
|
|
user_info = editor_user
|
2017-03-01 22:34:23 -05:00
|
|
|
elif user_role == models.UserRole.subscriber.name:
|
|
|
|
user_info = subscriber_user
|
2017-02-28 19:30:55 -05:00
|
|
|
|
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-03-01 23:58:05 -05:00
|
|
|
@bdd.given(parsers.parse('I create a {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-03-01 23:58:05 -05:00
|
|
|
@bdd.given(parsers.parse('I get a {user_role} user'))
|
2017-03-01 22:34:23 -05:00
|
|
|
def get_user_response(user_role, jwt_token, api_base_uri, admin_user, editor_user, subscriber_user, non_existent_user):
|
2017-02-28 19:30:55 -05:00
|
|
|
|
2017-03-01 22:34:23 -05:00
|
|
|
user_info = non_existent_user
|
2017-02-28 19:30:55 -05:00
|
|
|
if user_role == models.UserRole.admin.name:
|
2017-03-01 22:34:23 -05:00
|
|
|
user_info = admin_user
|
2017-02-28 19:30:55 -05:00
|
|
|
elif user_role == models.UserRole.editor.name:
|
2017-03-01 22:34:23 -05:00
|
|
|
user_info = editor_user
|
|
|
|
elif user_role == models.UserRole.subscriber.name:
|
|
|
|
user_info = subscriber_user
|
2017-02-28 19:30:55 -05:00
|
|
|
|
2017-02-25 16:51:39 -05:00
|
|
|
response = requests.get(
|
2017-03-01 22:34:23 -05:00
|
|
|
url=f'{api_base_uri}/api/users/{user_info["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-03-01 22:34:23 -05:00
|
|
|
def assert_create_user_response(user_role, create_user_response, admin_user, editor_user, subscriber_user,
|
|
|
|
non_existent_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-03-01 23:58:05 -05:00
|
|
|
@bdd.then(parsers.parse('I can get a {user_role} user profile'))
|
2017-03-01 22:34:23 -05:00
|
|
|
def assert_user_profile(user_role, get_user_response, admin_user, editor_user, subscriber_user, non_existent_user):
|
2017-02-28 19:30:55 -05:00
|
|
|
|
|
|
|
# TODO: Add in actual user profiles...
|
2017-03-01 22:34:23 -05:00
|
|
|
user_info = non_existent_user
|
2017-02-28 19:30:55 -05:00
|
|
|
if user_role == models.UserRole.admin.name:
|
2017-03-01 22:34:23 -05:00
|
|
|
user_info = admin_user
|
2017-02-28 19:30:55 -05:00
|
|
|
elif user_role == models.UserRole.editor.name:
|
2017-03-01 22:34:23 -05:00
|
|
|
user_info = editor_user
|
|
|
|
elif user_role == models.UserRole.subscriber.name:
|
|
|
|
user_info = subscriber_user
|
2017-02-28 19:30:55 -05:00
|
|
|
|
2017-02-01 23:42:20 -05:00
|
|
|
assert get_user_response.status_code == http.HTTPStatus.OK
|
2017-03-01 22:34:23 -05:00
|
|
|
expected_user_creation_response = user_info
|
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 = {
|
2017-03-01 22:34:23 -05:00
|
|
|
'error': {
|
|
|
|
'status_code': http.HTTPStatus.UNAUTHORIZED.value,
|
|
|
|
'message': 'Not authorized to access this resource.',
|
|
|
|
'resource': get_user_response.request.url,
|
|
|
|
}
|
2017-02-28 19:30:55 -05:00
|
|
|
}
|
|
|
|
assert get_user_response.json() == expected_response_json
|
2017-03-01 09:18:44 -05:00
|
|
|
|
|
|
|
|
|
|
|
@bdd.then(parsers.parse('I can get a user can not be found message'))
|
2017-03-01 09:32:16 -05:00
|
|
|
def assert_resource_not_found_response(get_user_response: requests.Response):
|
2017-03-01 09:18:44 -05:00
|
|
|
assert get_user_response.status_code == http.HTTPStatus.NOT_FOUND
|
|
|
|
|
|
|
|
expected_response_json = {
|
|
|
|
'error': {
|
|
|
|
'status_code': http.HTTPStatus.NOT_FOUND.value,
|
|
|
|
'message': 'Resource not found.',
|
|
|
|
'resource': get_user_response.request.url,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
assert get_user_response.json() == expected_response_json
|