2016-12-02 09:18:22 -05:00
|
|
|
"""
|
|
|
|
Functional tests for the managing sites.
|
|
|
|
|
2017-03-16 08:34:57 -04:00
|
|
|
:copyright: Copyright 2013-2017, Dorian Pula <dorian.pula@amber-penguin-software.ca>
|
2016-12-02 09:18:22 -05:00
|
|
|
:license: AGPL v3+
|
|
|
|
"""
|
|
|
|
|
2017-04-05 17:43:24 -04:00
|
|
|
import http
|
|
|
|
from unittest import mock
|
|
|
|
|
2016-12-02 09:18:22 -05:00
|
|
|
import pytest_bdd as bdd
|
|
|
|
import requests
|
2017-03-14 09:09:16 -04:00
|
|
|
from pytest_bdd import parsers
|
2016-12-02 09:18:22 -05:00
|
|
|
|
2017-03-14 08:46:54 -04:00
|
|
|
from tests import utils
|
2016-12-02 09:18:22 -05:00
|
|
|
|
|
|
|
|
2017-04-26 08:34:48 -04:00
|
|
|
# TODO: Rework site management and testing.
|
|
|
|
# bdd.scenarios('site_access.feature')
|
|
|
|
# bdd.scenarios('site_modification.feature')
|
2017-04-05 17:43:24 -04:00
|
|
|
|
2016-12-02 09:18:22 -05:00
|
|
|
|
2017-04-05 20:59:19 -04:00
|
|
|
@bdd.given(parsers.parse('I try to create a site'), target_fixture='api_response')
|
2017-04-05 17:43:24 -04:00
|
|
|
def create_site_response(auth_token_headers, api_base_uri):
|
|
|
|
|
|
|
|
test_site = utils.generate_test_site()
|
|
|
|
site_creation_request = {
|
|
|
|
'name': test_site.site_name,
|
|
|
|
'base_url': test_site.base_url,
|
|
|
|
}
|
|
|
|
|
|
|
|
response = requests.post(
|
|
|
|
url=f'{api_base_uri}/api/sites/',
|
|
|
|
json=site_creation_request,
|
|
|
|
headers=auth_token_headers,
|
|
|
|
)
|
2017-04-05 18:12:06 -04:00
|
|
|
return utils.ResponseSampleBundle(response, test_site)
|
2017-04-05 17:43:24 -04:00
|
|
|
|
|
|
|
|
2017-04-05 20:59:19 -04:00
|
|
|
@bdd.given(parsers.parse('I try to create a site with the same site name'), target_fixture='api_response')
|
|
|
|
def recreate_existing_site_response(api_response, auth_token_headers, api_base_uri):
|
2017-04-05 17:43:24 -04:00
|
|
|
|
2017-04-05 20:59:19 -04:00
|
|
|
test_site = api_response.sample
|
2017-04-05 17:43:24 -04:00
|
|
|
site_creation_request = {
|
|
|
|
'name': test_site.site_name,
|
|
|
|
'base_url': test_site.base_url,
|
|
|
|
}
|
|
|
|
|
|
|
|
response = requests.post(
|
|
|
|
url=f'{api_base_uri}/api/sites/',
|
|
|
|
json=site_creation_request,
|
|
|
|
headers=auth_token_headers,
|
|
|
|
)
|
2017-04-05 18:12:06 -04:00
|
|
|
return utils.ResponseSampleBundle(response, test_site)
|
2017-04-05 17:43:24 -04:00
|
|
|
|
|
|
|
|
2017-04-05 20:59:19 -04:00
|
|
|
@bdd.given(parsers.parse('I try to create a site with a non-json request'), target_fixture='api_response')
|
2017-04-05 17:43:24 -04:00
|
|
|
def invalid_non_json_create_site_response(auth_token_headers, api_base_uri):
|
|
|
|
return requests.post(
|
|
|
|
url=f'{api_base_uri}/api/sites/',
|
|
|
|
data='',
|
|
|
|
headers=auth_token_headers,
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2017-04-05 20:59:19 -04:00
|
|
|
@bdd.given(parsers.parse('I try to create a site with an empty request'), target_fixture='api_response')
|
2017-04-05 17:43:24 -04:00
|
|
|
def invalid_empty_create_site_response(auth_token_headers, api_base_uri):
|
|
|
|
return requests.post(
|
|
|
|
url=f'{api_base_uri}/api/sites/',
|
|
|
|
json={},
|
|
|
|
headers=auth_token_headers,
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2017-04-05 20:59:19 -04:00
|
|
|
@bdd.given(parsers.parse('I try to modify the site with a non-json request'), target_fixture='api_response')
|
|
|
|
def invalid_non_json_modify_site_response(api_response, auth_token_headers, api_base_uri):
|
|
|
|
test_site = api_response.sample
|
2017-04-05 17:43:24 -04:00
|
|
|
return requests.put(
|
|
|
|
url=f'{api_base_uri}/api/sites/{test_site.site_name}',
|
|
|
|
data='',
|
|
|
|
headers=auth_token_headers,
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2017-04-05 20:59:19 -04:00
|
|
|
@bdd.given(parsers.parse('I try to modify the site with an empty request'), target_fixture='api_response')
|
|
|
|
def invalid_empty_modify_site_response(api_response, auth_token_headers, api_base_uri):
|
|
|
|
test_site = api_response.sample
|
2017-04-05 17:43:24 -04:00
|
|
|
return requests.put(
|
|
|
|
url=f'{api_base_uri}/api/sites/{test_site.site_name}',
|
|
|
|
json={},
|
|
|
|
headers=auth_token_headers,
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2017-04-05 20:59:19 -04:00
|
|
|
@bdd.given(parsers.parse('I get a {state} site'), target_fixture='api_response')
|
2017-04-05 17:43:24 -04:00
|
|
|
def get_site_request(state, auth_token_headers, api_base_uri, db_engine):
|
|
|
|
|
|
|
|
# TODO: Generate a test site by its state
|
|
|
|
test_site = utils.generate_test_site()
|
|
|
|
utils.save_test_site_in_db(db_engine, test_site)
|
|
|
|
|
|
|
|
response = requests.get(
|
|
|
|
url=f'{api_base_uri}/api/sites/{test_site.site_name}',
|
|
|
|
headers=auth_token_headers,
|
|
|
|
)
|
2017-04-05 18:12:06 -04:00
|
|
|
return utils.ResponseSampleBundle(response, test_site)
|
2017-04-05 17:43:24 -04:00
|
|
|
|
|
|
|
|
2017-04-05 20:59:19 -04:00
|
|
|
@bdd.given(parsers.parse('I get a site that does not exist'), target_fixture='api_response')
|
2017-04-05 17:43:24 -04:00
|
|
|
def get_non_existent_site_request(auth_token_headers, api_base_uri):
|
|
|
|
return requests.get(
|
|
|
|
url=f'{api_base_uri}/api/sites/this-does-not-exist',
|
|
|
|
headers=auth_token_headers,
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
@bdd.then(parsers.parse('I get a valid site'))
|
2017-04-05 20:59:19 -04:00
|
|
|
def assert_site_response(api_response, api_base_uri):
|
2017-04-05 17:43:24 -04:00
|
|
|
|
2017-04-05 20:59:19 -04:00
|
|
|
test_site = api_response.sample
|
|
|
|
actual_response = utils.extract_response(api_response)
|
2017-04-05 17:43:24 -04:00
|
|
|
assert actual_response.status_code == http.HTTPStatus.OK
|
|
|
|
|
|
|
|
expected_json = {
|
|
|
|
'name': test_site.site_name,
|
|
|
|
'base_url': test_site.base_url,
|
|
|
|
'urls': mock.ANY,
|
|
|
|
}
|
|
|
|
assert expected_json == actual_response.json()
|
|
|
|
assert f'{api_base_uri}/api/sites/{test_site.site_name}' == actual_response.json()['urls']['self']
|
|
|
|
|
|
|
|
|
|
|
|
@bdd.then(parsers.parse('I get a valid new site'))
|
2017-04-05 20:59:19 -04:00
|
|
|
def assert_new_site_response(api_response, api_base_uri):
|
2017-04-05 17:43:24 -04:00
|
|
|
|
2017-04-05 20:59:19 -04:00
|
|
|
test_site = api_response.sample
|
|
|
|
actual_response = utils.extract_response(api_response)
|
2017-04-05 17:43:24 -04:00
|
|
|
assert actual_response.status_code == http.HTTPStatus.CREATED
|
|
|
|
|
|
|
|
expected_json = {
|
|
|
|
'name': test_site.site_name,
|
|
|
|
'base_url': test_site.base_url,
|
|
|
|
'urls': mock.ANY,
|
|
|
|
}
|
|
|
|
assert expected_json == actual_response.json()
|
|
|
|
assert f'{api_base_uri}/api/sites/{test_site.site_name}' == actual_response.json()['urls']['self']
|
|
|
|
|
|
|
|
|
2017-04-05 20:59:19 -04:00
|
|
|
@bdd.given(parsers.parse('I try to delete the site'), target_fixture='api_response')
|
|
|
|
def delete_site_response(api_response, auth_token_headers, api_base_uri):
|
|
|
|
test_site = api_response.sample
|
2017-04-05 17:43:24 -04:00
|
|
|
response = requests.delete(
|
|
|
|
url=f'{api_base_uri}/api/sites/{test_site.site_name}',
|
|
|
|
headers=auth_token_headers,
|
|
|
|
)
|
2017-04-05 18:12:06 -04:00
|
|
|
return utils.ResponseSampleBundle(response, test_site)
|
2017-04-05 17:43:24 -04:00
|
|
|
|
|
|
|
|
2017-04-05 20:59:19 -04:00
|
|
|
@bdd.given(parsers.parse('I try to delete the deleted site again'), target_fixture='api_response')
|
|
|
|
def delete_deleted_site_response(api_response, auth_token_headers, api_base_uri):
|
|
|
|
return delete_site_response(api_response, auth_token_headers, api_base_uri)
|
2017-04-05 17:43:24 -04:00
|
|
|
|
|
|
|
|
2017-04-05 20:59:19 -04:00
|
|
|
@bdd.given(parsers.parse('I try to modify the site'), target_fixture='api_response')
|
|
|
|
def modify_site_response(api_response, auth_token_headers, api_base_uri):
|
|
|
|
test_site = api_response.sample
|
2017-04-05 17:43:24 -04:00
|
|
|
modified_base_url = f'{test_site.base_url}/new_'
|
|
|
|
modified_site = utils.generate_test_site(test_site.site_name, modified_base_url)
|
|
|
|
site_modification_request = {
|
|
|
|
'name': test_site.site_name,
|
|
|
|
'base_url': modified_base_url,
|
|
|
|
}
|
|
|
|
|
|
|
|
response = requests.put(
|
|
|
|
url=f'{api_base_uri}/api/sites/{test_site.site_name}',
|
|
|
|
json=site_modification_request,
|
|
|
|
headers=auth_token_headers,
|
|
|
|
)
|
2017-04-05 18:12:06 -04:00
|
|
|
return utils.ResponseSampleBundle(response, modified_site)
|
2017-04-05 17:43:24 -04:00
|
|
|
|
|
|
|
|
2017-04-05 20:59:19 -04:00
|
|
|
@bdd.given(parsers.parse('I try to modify a site that does not exist'), target_fixture='api_response')
|
2017-04-05 17:43:24 -04:00
|
|
|
def modify_non_existent_site_request(auth_token_headers, api_base_uri):
|
|
|
|
test_site = utils.generate_test_site()
|
|
|
|
site_modification_request = {
|
|
|
|
'name': 'this-does-not-exist',
|
|
|
|
'base_url': test_site.base_url,
|
|
|
|
}
|
|
|
|
|
|
|
|
return requests.put(
|
|
|
|
url=f'{api_base_uri}/api/sites/this-does-not-exist',
|
|
|
|
json=site_modification_request,
|
|
|
|
headers=auth_token_headers,
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
@bdd.then(parsers.parse('my updates are reflected in the site'))
|
2017-04-05 20:59:19 -04:00
|
|
|
def assert_updated_site_response(api_response, api_base_uri):
|
2017-04-05 17:43:24 -04:00
|
|
|
|
2017-04-05 20:59:19 -04:00
|
|
|
test_site = api_response.sample
|
|
|
|
actual_response = utils.extract_response(api_response)
|
2017-04-05 17:43:24 -04:00
|
|
|
assert actual_response.status_code == http.HTTPStatus.OK
|
|
|
|
|
|
|
|
expected_json = {
|
|
|
|
'name': test_site.site_name,
|
|
|
|
'base_url': test_site.base_url,
|
|
|
|
'urls': mock.ANY,
|
|
|
|
}
|
|
|
|
assert expected_json == actual_response.json()
|
|
|
|
assert f'{api_base_uri}/api/sites/{test_site.site_name}' == actual_response.json()['urls']['self']
|
|
|
|
|
|
|
|
|
|
|
|
@bdd.then(parsers.parse('I get a site can not be found message'))
|
2017-04-05 20:59:19 -04:00
|
|
|
def assert_resource_not_found_response(api_response):
|
|
|
|
actual_response = utils.extract_response(api_response)
|
2017-04-05 17:43:24 -04:00
|
|
|
expected_response_json = {
|
|
|
|
'error': {
|
|
|
|
'status_code': http.HTTPStatus.NOT_FOUND.value,
|
|
|
|
'message': 'Resource not found.',
|
|
|
|
'resource': actual_response.request.url,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
assert actual_response.status_code == http.HTTPStatus.NOT_FOUND
|
|
|
|
assert actual_response.json() == expected_response_json
|