Tests added for choose_template page.

Remove indifferent change to file.
This commit is contained in:
Nicholas Staples
2016-03-09 13:51:56 +00:00
parent d0f113b6bb
commit c5eaf97669
6 changed files with 142 additions and 92 deletions

View File

@@ -85,14 +85,9 @@ class User(UserMixin):
def has_permissions(self, permissions, service_id=None, or_=False): def has_permissions(self, permissions, service_id=None, or_=False):
if service_id is None: if service_id is None:
service_id = session.get('service_id', '') service_id = session.get('service_id', '')
#print(permissions)
#print(service_id)
#print(self._permissions)
if service_id in self._permissions: if service_id in self._permissions:
if or_: if or_:
return any([x in self._permissions[service_id] for x in permissions]) return any([x in self._permissions[service_id] for x in permissions])
return set(self._permissions[service_id]) >= set(permissions) return set(self._permissions[service_id]) >= set(permissions)
return False return False

View File

@@ -1,4 +1,5 @@
{% extends "withnav_template.html" %} {% extends "withnav_template.html" %}
{% from "components/banner.html" import banner_wrapper %}
{% from "components/table.html" import list_table, field, right_aligned_field_heading %} {% from "components/table.html" import list_table, field, right_aligned_field_heading %}
{% from "components/big-number.html" import big_number %} {% from "components/big-number.html" import big_number %}
@@ -24,33 +25,26 @@
</ul> </ul>
{% if not template_count and not jobs %} {% if not template_count and not jobs %}
{{ banner( {% call banner_wrapper(subhead='Get started', type="tip") %}
""" <ol>
<ol> {% if current_user.has_permissions(['manage_templates']) %}
<li> <li>
<a href='{}'>Add a template</a> <a href='url_for(".add_service_template", service_id=service_id, template_type="sms")'>Add a template</a>
</li> </li>
{% endif %}
{% if current_user.has_permissions(['send_texts', 'send_emails', 'send_letters']) %}
<li> <li>
<a href='{}'>Send yourself a text message</a> <a href='url_for(".choose_template", service_id=service_id, template_type="sms")'>Send yourself a text message</a>
</li> </li>
</ol> {% endif %}
""".format( </ol>
url_for(".add_service_template", service_id=service_id, template_type="sms"), {% endcall %}
url_for(".choose_template", service_id=service_id, template_type="sms")
)|safe,
subhead='Get started',
type="tip"
)}}
{% elif not jobs %} {% elif not jobs %}
{{ banner( {% call banner_wrapper(subhead='Next step', type="tip") %}
""" {% if current_user.has_permissions(['send_texts', 'send_emails', 'send_letters']) %}
<a href='{}'>Send yourself a text message</a> <a href='url_for(".choose_template", service_id=service_id, template_type="sms")'>Send yourself a text message</a>
""".format( {% endif %}
url_for(".choose_template", service_id=service_id, template_type="sms") {% endcall %}
)|safe,
subhead='Next step',
type="tip"
)}}
{% else %} {% else %}
{% call(item) list_table( {% call(item) list_table(
jobs, jobs,
@@ -69,9 +63,11 @@
{% endcall %} {% endcall %}
{% endcall %} {% endcall %}
{% if more_jobs_to_show %} {% if more_jobs_to_show %}
<p class="table-show-more-link"> {% if current_user.has_permissions(['send_texts', 'send_emails', 'send_letters']) %}
<a href="{{ url_for('.view_jobs', service_id=service_id) }}">See all sent text messages</a> <p class="table-show-more-link">
</p> <a href="{{ url_for('.view_jobs', service_id=service_id) }}">See all sent text messages</a>
</p>
{% endif %}
{% endif %} {% endif %}
{% endif %} {% endif %}

View File

@@ -161,3 +161,4 @@ def validate_route_permission(mocker,
pytest.fail("Invalid method call {}".format(method)) pytest.fail("Invalid method call {}".format(method))
if resp.status_code != response_code: if resp.status_code != response_code:
pytest.fail("Invalid permissions set for endpoint {}".format(route)) pytest.fail("Invalid permissions set for endpoint {}".format(route))
return resp

View File

@@ -6,65 +6,73 @@ from app.main.views.index import index
from werkzeug.exceptions import Forbidden from werkzeug.exceptions import Forbidden
def _test_permissions(app_, usr, permissions, will_succeed, or_=False):
with app_.test_request_context():
with app_.test_client() as client:
client.login(usr)
decorator = user_has_permissions(*permissions, or_=or_)
decorated_index = decorator(index)
if will_succeed:
response = decorated_index()
else:
try:
response = decorated_index()
pytest.fail("Failed to throw a forbidden exception")
except Forbidden:
pass
def test_user_has_permissions_on_endpoint_fail(app_, def test_user_has_permissions_on_endpoint_fail(app_,
api_user_active, api_user_active,
mock_login, mock_login,
mock_get_user_with_permissions): mock_get_user_with_permissions):
with app_.test_request_context(): _test_permissions(
with app_.test_client() as client: app_,
client.login(api_user_active) api_user_active,
decorator = user_has_permissions('something') ['something'],
decorated_index = decorator(index) False)
try:
response = decorated_index()
pytest.fail("Failed to throw a forbidden exception")
except Forbidden:
pass
def test_user_has_permissions_success(app_, def test_user_has_permissions_success(app_,
api_user_active, api_user_active,
mock_login, mock_login,
mock_get_user_with_permissions): mock_get_user_with_permissions):
with app_.test_request_context(): _test_permissions(
with app_.test_client() as client: app_,
client.login(api_user_active) api_user_active,
decorator = user_has_permissions('manage_users') ['manage_users'],
decorated_index = decorator(index) True)
response = decorated_index()
def test_user_has_permissions_or(app_, def test_user_has_permissions_or(app_,
api_user_active, api_user_active,
mock_login, mock_login,
mock_get_user_with_permissions): mock_get_user_with_permissions):
with app_.test_request_context(): _test_permissions(
with app_.test_client() as client: app_,
client.login(api_user_active) api_user_active,
decorator = user_has_permissions('something', 'manage_users', or_=True) ['something', 'manage_users'],
decorated_index = decorator(index) True,
response = decorated_index() or_=True)
def test_user_has_permissions_multiple(app_, def test_user_has_permissions_multiple(app_,
api_user_active, api_user_active,
mock_login, mock_login,
mock_get_user_with_permissions): mock_get_user_with_permissions):
with app_.test_request_context(): _test_permissions(
with app_.test_client() as client: app_,
client.login(api_user_active) api_user_active,
decorator = user_has_permissions('manage_templates', 'manage_users') ['manage_templates', 'manage_users'],
decorated_index = decorator(index) True)
response = decorated_index()
def test_exact_permissions(app_, def test_exact_permissions(app_,
api_user_active, api_user_active,
mock_login, mock_login,
mock_get_user_with_permissions): mock_get_user_with_permissions):
with app_.test_request_context(): _test_permissions(
with app_.test_client() as client: app_,
client.login(api_user_active) api_user_active,
decorator = user_has_permissions('manage_users', 'manage_templates', 'manage_settings') ['manage_users', 'manage_templates', 'manage_settings'],
decorated_index = decorator(index) True)
response = decorated_index()

View File

@@ -64,7 +64,6 @@ def test_menu_send_messages(mocker, app_, api_user_active, service_one):
assert url_for('main.documentation', service_id=service_one['id']) not in page assert url_for('main.documentation', service_id=service_one['id']) not in page
def test_menu_manage_service(mocker, app_, api_user_active, service_one): def test_menu_manage_service(mocker, app_, api_user_active, service_one):
with app_.test_request_context(): with app_.test_request_context():
resp = _test_dashboard_menu( resp = _test_dashboard_menu(
@@ -91,7 +90,6 @@ def test_menu_manage_service(mocker, app_, api_user_active, service_one):
assert url_for('main.documentation', service_id=service_one['id']) not in page assert url_for('main.documentation', service_id=service_one['id']) not in page
def test_menu_manage_api_keys(mocker, app_, api_user_active, service_one): def test_menu_manage_api_keys(mocker, app_, api_user_active, service_one):
with app_.test_request_context(): with app_.test_request_context():
resp = _test_dashboard_menu( resp = _test_dashboard_menu(

View File

@@ -8,32 +8,6 @@ from tests import validate_route_permission
template_types = ['email', 'sms'] template_types = ['email', 'sms']
@pytest.mark.parametrize("template_type", template_types)
def test_choose_template(
template_type,
app_,
api_user_active,
mock_login,
mock_get_user,
mock_get_service,
mock_check_verify_code,
mock_get_service_templates,
mock_get_jobs,
mock_has_permissions
):
with app_.test_request_context():
with app_.test_client() as client:
client.login(api_user_active)
response = client.get(url_for('main.choose_template', template_type=template_type, service_id=12345))
assert response.status_code == 200
content = response.get_data(as_text=True)
assert '{}_template_one'.format(template_type) in content
assert '{} template one content'.format(template_type) in content
assert '{}_template_two'.format(template_type) in content
assert '{} template two content'.format(template_type) in content
def test_upload_csvfile_with_errors_shows_check_page_with_errors( def test_upload_csvfile_with_errors_shows_check_page_with_errors(
app_, app_,
api_user_active, api_user_active,
@@ -323,3 +297,81 @@ def test_route_invalid_permissions(mocker,
['blah'], ['blah'],
api_user_active, api_user_active,
service_one) service_one)
def test_route_choose_template_manage_service_permissions(mocker,
app_,
api_user_active,
service_one,
mock_login,
mock_get_user,
mock_get_service,
mock_check_verify_code,
mock_get_service_templates,
mock_get_jobs):
with app_.test_request_context():
template_id = mock_get_service_templates(service_one['id'])['data'][0]['id']
resp = validate_route_permission(
mocker,
app_,
"GET",
200,
url_for(
'main.choose_template',
service_id=service_one['id'],
template_type='sms'),
['manage_users', 'manage_templates', 'manage_settings'],
api_user_active,
service_one)
page = resp.get_data(as_text=True)
assert url_for(
"main.send_messages",
service_id=service_one['id'],
template_id=template_id) not in page
assert url_for(
"main.send_message_to_self",
service_id=service_one['id'],
template_id=template_id) not in page
assert url_for(
"main.edit_service_template",
service_id=service_one['id'],
template_id=template_id) in page
def test_route_choose_template_send_messages_permissions(mocker,
app_,
api_user_active,
service_one,
mock_login,
mock_get_user,
mock_get_service,
mock_check_verify_code,
mock_get_service_templates,
mock_get_jobs):
with app_.test_request_context():
template_id = mock_get_service_templates(service_one['id'])['data'][0]['id']
resp = validate_route_permission(
mocker,
app_,
"GET",
200,
url_for(
'main.choose_template',
service_id=service_one['id'],
template_type='sms'),
['send_texts', 'send_emails', 'send_letters'],
api_user_active,
service_one)
page = resp.get_data(as_text=True)
assert url_for(
"main.send_messages",
service_id=service_one['id'],
template_id=template_id) in page
assert url_for(
"main.send_message_to_self",
service_id=service_one['id'],
template_id=template_id) in page
assert url_for(
"main.edit_service_template",
service_id=service_one['id'],
template_id=template_id) not in page