mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-08-26 17:24:23 -04:00
Download CSV option now available.
App is updated to use the rebased db.
This commit is contained in:
@@ -38,7 +38,7 @@ def add_service():
|
|||||||
email_from = email_safe(form.name.data)
|
email_from = email_safe(form.name.data)
|
||||||
service_id = service_api_client.create_service(service_name=form.name.data,
|
service_id = service_api_client.create_service(service_name=form.name.data,
|
||||||
active=False,
|
active=False,
|
||||||
limit=current_app.config['DEFAULT_SERVICE_LIMIT'],
|
message_limit=current_app.config['DEFAULT_SERVICE_LIMIT'],
|
||||||
restricted=True,
|
restricted=True,
|
||||||
user_id=session['user_id'],
|
user_id=session['user_id'],
|
||||||
email_from=email_from)
|
email_from=email_from)
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ def create_api_key(service_id):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@main.route("/services/<service_id>/api-keys/revoke/<int:key_id>", methods=['GET', 'POST'])
|
@main.route("/services/<service_id>/api-keys/revoke/<key_id>", methods=['GET', 'POST'])
|
||||||
@login_required
|
@login_required
|
||||||
@user_has_permissions('manage_api_keys')
|
@user_has_permissions('manage_api_keys')
|
||||||
def revoke_api_key(service_id, key_id):
|
def revoke_api_key(service_id, key_id):
|
||||||
|
|||||||
@@ -77,11 +77,11 @@ def add_rates_to(delivery_statistics):
|
|||||||
|
|
||||||
latest_stats.update({
|
latest_stats.update({
|
||||||
'emails_failure_rate': (
|
'emails_failure_rate': (
|
||||||
"{0:.1f}".format((float(today['emails_error']) / today['emails_requested'] * 100))
|
"{0:.1f}".format((float(today['emails_failed']) / today['emails_requested'] * 100))
|
||||||
if today and today['emails_requested'] else 0
|
if today and today['emails_requested'] else 0
|
||||||
),
|
),
|
||||||
'sms_failure_rate': (
|
'sms_failure_rate': (
|
||||||
"{0:.1f}".format((float(today['sms_error']) / today['sms_requested'] * 100))
|
"{0:.1f}".format((float(today['sms_failed']) / today['sms_requested'] * 100))
|
||||||
if today and today['sms_requested'] else 0
|
if today and today['sms_requested'] else 0
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -21,7 +21,8 @@ from app.main import main
|
|||||||
from app.utils import (
|
from app.utils import (
|
||||||
get_page_from_request,
|
get_page_from_request,
|
||||||
generate_previous_next_dict,
|
generate_previous_next_dict,
|
||||||
user_has_permissions)
|
user_has_permissions,
|
||||||
|
generate_notifications_csv)
|
||||||
|
|
||||||
|
|
||||||
def _parse_filter_args(filter_dict):
|
def _parse_filter_args(filter_dict):
|
||||||
@@ -132,6 +133,12 @@ def view_notifications(service_id):
|
|||||||
page + 1,
|
page + 1,
|
||||||
'Next page',
|
'Next page',
|
||||||
'page {}'.format(page + 1))
|
'page {}'.format(page + 1))
|
||||||
|
if 'download' in request.args and request.args['download'] == 'csv':
|
||||||
|
csv_content = generate_notifications_csv(notifications['notifications'])
|
||||||
|
return csv_content, 200, {
|
||||||
|
'Content-Type': 'text/csv; charset=utf-8',
|
||||||
|
'Content-Disposition': 'inline; filename="notifications.csv"'
|
||||||
|
}
|
||||||
return render_template(
|
return render_template(
|
||||||
'views/notifications.html',
|
'views/notifications.html',
|
||||||
notifications=notifications['notifications'],
|
notifications=notifications['notifications'],
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ def choose_template(service_id, template_type):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@main.route("/services/<service_id>/send/<int:template_id>", methods=['GET', 'POST'])
|
@main.route("/services/<service_id>/send/<template_id>/csv", methods=['GET', 'POST'])
|
||||||
@login_required
|
@login_required
|
||||||
@user_has_permissions('send_texts', 'send_emails', 'send_letters')
|
@user_has_permissions('send_texts', 'send_emails', 'send_letters')
|
||||||
def send_messages(service_id, template_id):
|
def send_messages(service_id, template_id):
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ def service_name_change_confirm(service_id):
|
|||||||
current_service['id'],
|
current_service['id'],
|
||||||
current_service['name'],
|
current_service['name'],
|
||||||
current_service['active'],
|
current_service['active'],
|
||||||
current_service['limit'],
|
current_service['message_limit'],
|
||||||
current_service['restricted'],
|
current_service['restricted'],
|
||||||
current_service['users'],
|
current_service['users'],
|
||||||
current_service['email_from'])
|
current_service['email_from'])
|
||||||
@@ -123,7 +123,7 @@ def service_status_change_confirm(service_id):
|
|||||||
current_service['id'],
|
current_service['id'],
|
||||||
current_service['name'],
|
current_service['name'],
|
||||||
current_service['active'],
|
current_service['active'],
|
||||||
current_service['limit'],
|
current_service['message_limit'],
|
||||||
current_service['restricted'],
|
current_service['restricted'],
|
||||||
current_service['users'],
|
current_service['users'],
|
||||||
current_service['email_from'])
|
current_service['email_from'])
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ def add_service_template(service_id, template_type):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@main.route("/services/<service_id>/templates/<int:template_id>", methods=['GET', 'POST'])
|
@main.route("/services/<service_id>/templates/<template_id>", methods=['GET', 'POST'])
|
||||||
@login_required
|
@login_required
|
||||||
@user_has_permissions('manage_templates', admin_override=True)
|
@user_has_permissions('manage_templates', admin_override=True)
|
||||||
def edit_service_template(service_id, template_id):
|
def edit_service_template(service_id, template_id):
|
||||||
@@ -76,7 +76,7 @@ def edit_service_template(service_id, template_id):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@main.route("/services/<service_id>/templates/<int:template_id>/delete", methods=['GET', 'POST'])
|
@main.route("/services/<service_id>/templates/<template_id>/delete", methods=['GET', 'POST'])
|
||||||
@login_required
|
@login_required
|
||||||
@user_has_permissions('manage_templates', admin_override=True)
|
@user_has_permissions('manage_templates', admin_override=True)
|
||||||
def delete_service_template(service_id, template_id):
|
def delete_service_template(service_id, template_id):
|
||||||
|
|||||||
@@ -18,14 +18,14 @@ class ServiceAPIClient(NotificationsAPIClient):
|
|||||||
self.client_id = application.config['ADMIN_CLIENT_USER_NAME']
|
self.client_id = application.config['ADMIN_CLIENT_USER_NAME']
|
||||||
self.secret = application.config['ADMIN_CLIENT_SECRET']
|
self.secret = application.config['ADMIN_CLIENT_SECRET']
|
||||||
|
|
||||||
def create_service(self, service_name, active, limit, restricted, user_id, email_from):
|
def create_service(self, service_name, active, message_limit, restricted, user_id, email_from):
|
||||||
"""
|
"""
|
||||||
Create a service and return the json.
|
Create a service and return the json.
|
||||||
"""
|
"""
|
||||||
data = {
|
data = {
|
||||||
"name": service_name,
|
"name": service_name,
|
||||||
"active": active,
|
"active": active,
|
||||||
"limit": limit,
|
"message_limit": message_limit,
|
||||||
"user_id": user_id,
|
"user_id": user_id,
|
||||||
"restricted": restricted,
|
"restricted": restricted,
|
||||||
"email_from": email_from
|
"email_from": email_from
|
||||||
@@ -56,7 +56,7 @@ class ServiceAPIClient(NotificationsAPIClient):
|
|||||||
service_id,
|
service_id,
|
||||||
service_name,
|
service_name,
|
||||||
active,
|
active,
|
||||||
limit,
|
message_limit,
|
||||||
restricted,
|
restricted,
|
||||||
users,
|
users,
|
||||||
email_from):
|
email_from):
|
||||||
@@ -67,7 +67,7 @@ class ServiceAPIClient(NotificationsAPIClient):
|
|||||||
"id": service_id,
|
"id": service_id,
|
||||||
"name": service_name,
|
"name": service_name,
|
||||||
"active": active,
|
"active": active,
|
||||||
"limit": limit,
|
"message_limit": message_limit,
|
||||||
"restricted": restricted,
|
"restricted": restricted,
|
||||||
"users": users,
|
"users": users,
|
||||||
"email_from": email_from
|
"email_from": email_from
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
{{ api_key(secret, key_name) }}
|
{{ api_key(secret, key_name) }}
|
||||||
|
|
||||||
{{ page_footer(
|
{{ page_footer(
|
||||||
secondary_link=url_for('.api_keys', service_id=service_id),
|
secondary_link=url_for('.api_keys', service_id=current_service.id),
|
||||||
secondary_link_text='Back to API keys'
|
secondary_link_text='Back to API keys'
|
||||||
) }}
|
) }}
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
{{ big_number_with_status(
|
{{ big_number_with_status(
|
||||||
statistics.get('emails_requested', 0),
|
statistics.get('emails_requested', 0),
|
||||||
'email' if statistics.get('emails_requested') == 1 else 'emails',
|
'email' if statistics.get('emails_requested') == 1 else 'emails',
|
||||||
statistics.get('emails_error'),
|
statistics.get('emails_failed'),
|
||||||
statistics.get('emails_failure_rate', 0.0),
|
statistics.get('emails_failure_rate', 0.0),
|
||||||
statistics.get('emails_failure_rate', 0)|float > 3
|
statistics.get('emails_failure_rate', 0)|float > 3
|
||||||
) }}
|
) }}
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
{{ big_number_with_status(
|
{{ big_number_with_status(
|
||||||
statistics.get('sms_requested', 0),
|
statistics.get('sms_requested', 0),
|
||||||
'text message' if statistics.get('sms_requested') == 1 else 'text messages',
|
'text message' if statistics.get('sms_requested') == 1 else 'text messages',
|
||||||
statistics.get('sms_error'),
|
statistics.get('sms_failed'),
|
||||||
statistics.get('sms_failure_rate', 0.0),
|
statistics.get('sms_failure_rate', 0.0),
|
||||||
statistics.get('sms_failure_rate', 0)|float > 3
|
statistics.get('sms_failure_rate', 0)|float > 3
|
||||||
) }}
|
) }}
|
||||||
|
|||||||
@@ -17,8 +17,8 @@
|
|||||||
<a href="{{ url_for(".view_notifications", service_id=current_service.id, type="email", page=1) }}">Email messages</a>
|
<a href="{{ url_for(".view_notifications", service_id=current_service.id, type="email", page=1) }}">Email messages</a>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<a href="{{ url_for(".view_notifications", service_id=current_service.id, status=['sent', 'delivered'], page=1) }}">Successful messages</a> 
|
<a href="{{ url_for(".view_notifications", service_id=current_service.id, status=['delivered'], page=1) }}">Successful messages</a> 
|
||||||
<a href="{{ url_for(".view_notifications", service_id=current_service.id, status=['failed', 'complaint', 'bounce'], page=1) }}">Failed messages</a>
|
<a href="{{ url_for(".view_notifications", service_id=current_service.id, status=['failed'], page=1) }}">Failed messages</a>
|
||||||
</p>
|
</p>
|
||||||
{% call(item, row_number) list_table(
|
{% call(item, row_number) list_table(
|
||||||
notifications,
|
notifications,
|
||||||
@@ -45,8 +45,12 @@
|
|||||||
{{ item.status }}
|
{{ item.status }}
|
||||||
{% endcall %}
|
{% endcall %}
|
||||||
{% call field() %}
|
{% call field() %}
|
||||||
{{ item.created_at | format_datetime}}
|
{{ item.created_at | format_datetime }}
|
||||||
{% endcall %}
|
{% endcall %}
|
||||||
{% endcall %}
|
{% endcall %}
|
||||||
|
<p class="table-show-more-link">
|
||||||
|
<a href="{{ request.url }}&download=csv">Download csv</a>
|
||||||
|
</p>
|
||||||
{{ previous_next_navigation(prev_page, next_page) }}
|
{{ previous_next_navigation(prev_page, next_page) }}
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
22
app/utils.py
22
app/utils.py
@@ -1,5 +1,6 @@
|
|||||||
import re
|
import re
|
||||||
|
import csv
|
||||||
|
from io import StringIO
|
||||||
from functools import wraps
|
from functools import wraps
|
||||||
from flask import (abort, session, request, url_for)
|
from flask import (abort, session, request, url_for)
|
||||||
|
|
||||||
@@ -85,6 +86,25 @@ def get_errors_for_csv(recipients, template_type):
|
|||||||
return errors
|
return errors
|
||||||
|
|
||||||
|
|
||||||
|
def generate_notifications_csv(json_list):
|
||||||
|
from app import format_datetime
|
||||||
|
content = StringIO()
|
||||||
|
retval = None
|
||||||
|
with content as csvfile:
|
||||||
|
csvwriter = csv.writer(csvfile)
|
||||||
|
csvwriter.writerow(['Recipient', 'Template', 'Type', 'Job', 'Status', 'Time'])
|
||||||
|
for x in json_list:
|
||||||
|
csvwriter.writerow([
|
||||||
|
x['to'],
|
||||||
|
x['template']['name'],
|
||||||
|
x['template']['template_type'],
|
||||||
|
x['job']['original_file_name'],
|
||||||
|
x['status'],
|
||||||
|
format_datetime(x['created_at'])])
|
||||||
|
retval = content.getvalue()
|
||||||
|
return retval
|
||||||
|
|
||||||
|
|
||||||
def get_page_from_request():
|
def get_page_from_request():
|
||||||
if 'page' in request.args:
|
if 'page' in request.args:
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -30,6 +30,11 @@ display_result $? 1 "Code style check"
|
|||||||
npm test
|
npm test
|
||||||
display_result $? 2 "Front end code style check"
|
display_result $? 2 "Front end code style check"
|
||||||
|
|
||||||
|
export NOTIFY_ADMIN_ENVIRONMENT='config.Test'
|
||||||
|
|
||||||
## Code coverage
|
## Code coverage
|
||||||
py.test --cov=app --cov-report=term-missing tests/
|
py.test --cov=app --cov-report=term-missing tests/
|
||||||
display_result $? 3 "Code coverage"
|
display_result $? 3 "Code coverage"
|
||||||
|
|
||||||
|
#py.test -v
|
||||||
|
#display_result $? 4 "Unit tests
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
import pytest
|
import pytest
|
||||||
|
import uuid
|
||||||
|
import datetime
|
||||||
from flask.testing import FlaskClient
|
from flask.testing import FlaskClient
|
||||||
from flask import url_for
|
from flask import url_for
|
||||||
from flask_login import login_user
|
from flask_login import login_user
|
||||||
@@ -23,19 +25,27 @@ class TestClient(FlaskClient):
|
|||||||
self.get(url_for("main.logout"))
|
self.get(url_for("main.logout"))
|
||||||
|
|
||||||
|
|
||||||
def service_json(id_, name, users, limit=1000, active=False, restricted=True, email_from=None):
|
def sample_uuid():
|
||||||
|
return "6ce466d0-fd6a-11e5-82f5-e0accb9d11a6"
|
||||||
|
|
||||||
|
|
||||||
|
def generate_uuid():
|
||||||
|
return uuid.uuid4()
|
||||||
|
|
||||||
|
|
||||||
|
def service_json(id_, name, users, message_limit=1000, active=False, restricted=True, email_from=None):
|
||||||
return {
|
return {
|
||||||
'id': id_,
|
'id': id_,
|
||||||
'name': name,
|
'name': name,
|
||||||
'users': users,
|
'users': users,
|
||||||
'limit': limit,
|
'message_limit': message_limit,
|
||||||
'active': active,
|
'active': active,
|
||||||
'restricted': restricted,
|
'restricted': restricted,
|
||||||
'email_from': email_from
|
'email_from': email_from
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def template_json(service_id, id_=1, name="sample template", type_="sms", content="template content"):
|
def template_json(service_id, id_, name="sample template", type_="sms", content="template content"):
|
||||||
return {
|
return {
|
||||||
'id': id_,
|
'id': id_,
|
||||||
'name': name,
|
'name': name,
|
||||||
@@ -52,8 +62,8 @@ def api_key_json(id_, name, expiry_date=None):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def invite_json(id, from_user, service_id, email_address, permissions, created_at, status):
|
def invite_json(id_, from_user, service_id, email_address, permissions, created_at, status):
|
||||||
return {'id': id,
|
return {'id': id_,
|
||||||
'from_user': from_user,
|
'from_user': from_user,
|
||||||
'service': service_id,
|
'service': service_id,
|
||||||
'email_address': email_address,
|
'email_address': email_address,
|
||||||
@@ -81,13 +91,10 @@ def create_test_api_user(state, permissions={}):
|
|||||||
|
|
||||||
|
|
||||||
def job_json():
|
def job_json():
|
||||||
import uuid
|
job_id = str(generate_uuid())
|
||||||
import datetime
|
|
||||||
uuid.uuid4()
|
|
||||||
job_id = str(uuid.uuid4())
|
|
||||||
created_at = str(datetime.datetime.now().time())
|
created_at = str(datetime.datetime.now().time())
|
||||||
data = {
|
data = {
|
||||||
'id': str(job_id),
|
'id': job_id,
|
||||||
'service': 1,
|
'service': 1,
|
||||||
'template': 1,
|
'template': 1,
|
||||||
'original_file_name': 'thisisatest.csv',
|
'original_file_name': 'thisisatest.csv',
|
||||||
@@ -107,11 +114,10 @@ def notification_json(service_id,
|
|||||||
sent_at=None,
|
sent_at=None,
|
||||||
created_at=None,
|
created_at=None,
|
||||||
with_links=False):
|
with_links=False):
|
||||||
import datetime
|
|
||||||
if job is None:
|
if job is None:
|
||||||
job = job_json()
|
job = job_json()
|
||||||
if template is None:
|
if template is None:
|
||||||
template = template_json(service_id)
|
template = template_json(service_id, str(generate_uuid()))
|
||||||
if sent_at is None:
|
if sent_at is None:
|
||||||
sent_at = str(datetime.datetime.now().time())
|
sent_at = str(datetime.datetime.now().time())
|
||||||
if created_at is None:
|
if created_at is None:
|
||||||
@@ -126,7 +132,10 @@ def notification_json(service_id,
|
|||||||
data = {
|
data = {
|
||||||
'notifications': [{
|
'notifications': [{
|
||||||
'to': to,
|
'to': to,
|
||||||
'template': {'id': template['id'], 'name': template['name']},
|
'template': {
|
||||||
|
'id': template['id'],
|
||||||
|
'name': template['name'],
|
||||||
|
'template_type': template['template_type']},
|
||||||
'job': {'id': job['id'], 'original_file_name': job['original_file_name']},
|
'job': {'id': job['id'], 'original_file_name': job['original_file_name']},
|
||||||
'sent_at': sent_at,
|
'sent_at': sent_at,
|
||||||
'status': status,
|
'status': status,
|
||||||
|
|||||||
@@ -45,18 +45,18 @@ def test_should_show_api_keys_page(app_,
|
|||||||
mock_get_user_by_email,
|
mock_get_user_by_email,
|
||||||
mock_get_api_keys,
|
mock_get_api_keys,
|
||||||
mock_get_service,
|
mock_get_service,
|
||||||
mock_has_permissions):
|
mock_has_permissions,
|
||||||
|
fake_uuid):
|
||||||
with app_.test_request_context():
|
with app_.test_request_context():
|
||||||
with app_.test_client() as client:
|
with app_.test_client() as client:
|
||||||
client.login(api_user_active)
|
client.login(api_user_active)
|
||||||
service_id = str(uuid.uuid4())
|
response = client.get(url_for('main.api_keys', service_id=fake_uuid))
|
||||||
response = client.get(url_for('main.api_keys', service_id=service_id))
|
|
||||||
|
|
||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
assert 'some key name' in response.get_data(as_text=True)
|
assert 'some key name' in response.get_data(as_text=True)
|
||||||
assert 'another key name' in response.get_data(as_text=True)
|
assert 'another key name' in response.get_data(as_text=True)
|
||||||
assert 'Revoked Thursday 01 January 1970 at 00:00' in response.get_data(as_text=True)
|
assert 'Revoked Thursday 01 January 1970 at 00:00' in response.get_data(as_text=True)
|
||||||
mock_get_api_keys.assert_called_once_with(service_id=service_id)
|
mock_get_api_keys.assert_called_once_with(service_id=fake_uuid)
|
||||||
|
|
||||||
|
|
||||||
def test_should_show_name_api_key_page(app_,
|
def test_should_show_name_api_key_page(app_,
|
||||||
@@ -104,16 +104,16 @@ def test_should_show_confirm_revoke_api_key(app_,
|
|||||||
mock_get_user_by_email,
|
mock_get_user_by_email,
|
||||||
mock_get_api_keys,
|
mock_get_api_keys,
|
||||||
mock_get_service,
|
mock_get_service,
|
||||||
mock_has_permissions):
|
mock_has_permissions,
|
||||||
|
fake_uuid):
|
||||||
with app_.test_request_context():
|
with app_.test_request_context():
|
||||||
with app_.test_client() as client:
|
with app_.test_client() as client:
|
||||||
client.login(api_user_active)
|
client.login(api_user_active)
|
||||||
service_id = str(uuid.uuid4())
|
response = client.get(url_for('main.revoke_api_key', service_id=fake_uuid, key_id=fake_uuid))
|
||||||
response = client.get(url_for('main.revoke_api_key', service_id=service_id, key_id=321))
|
|
||||||
|
|
||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
assert 'some key name' in response.get_data(as_text=True)
|
assert 'some key name' in response.get_data(as_text=True)
|
||||||
mock_get_api_keys.assert_called_once_with(service_id=service_id, key_id=321)
|
mock_get_api_keys.assert_called_once_with(service_id=fake_uuid, key_id=fake_uuid)
|
||||||
|
|
||||||
|
|
||||||
def test_should_redirect_after_revoking_api_key(app_,
|
def test_should_redirect_after_revoking_api_key(app_,
|
||||||
@@ -124,17 +124,17 @@ def test_should_redirect_after_revoking_api_key(app_,
|
|||||||
mock_revoke_api_key,
|
mock_revoke_api_key,
|
||||||
mock_get_api_keys,
|
mock_get_api_keys,
|
||||||
mock_get_service,
|
mock_get_service,
|
||||||
mock_has_permissions):
|
mock_has_permissions,
|
||||||
|
fake_uuid):
|
||||||
with app_.test_request_context():
|
with app_.test_request_context():
|
||||||
with app_.test_client() as client:
|
with app_.test_client() as client:
|
||||||
client.login(api_user_active)
|
client.login(api_user_active)
|
||||||
service_id = str(uuid.uuid4())
|
response = client.post(url_for('main.revoke_api_key', service_id=fake_uuid, key_id=fake_uuid))
|
||||||
response = client.post(url_for('main.revoke_api_key', service_id=service_id, key_id=321))
|
|
||||||
|
|
||||||
assert response.status_code == 302
|
assert response.status_code == 302
|
||||||
assert response.location == url_for('.api_keys', service_id=service_id, _external=True)
|
assert response.location == url_for('.api_keys', service_id=fake_uuid, _external=True)
|
||||||
mock_revoke_api_key.assert_called_once_with(service_id=service_id, key_id=321)
|
mock_revoke_api_key.assert_called_once_with(service_id=fake_uuid, key_id=fake_uuid)
|
||||||
mock_get_api_keys.assert_called_once_with(service_id=service_id, key_id=321)
|
mock_get_api_keys.assert_called_once_with(service_id=fake_uuid, key_id=fake_uuid)
|
||||||
|
|
||||||
|
|
||||||
def test_route_permissions(mocker,
|
def test_route_permissions(mocker,
|
||||||
|
|||||||
@@ -233,7 +233,14 @@ def test_menu_all_services_for_platform_admin_user(mocker,
|
|||||||
assert url_for('main.service_settings', service_id=service_one['id']) in page
|
assert url_for('main.service_settings', service_id=service_one['id']) in page
|
||||||
assert url_for('main.view_notifications', service_id=service_one['id']) in page
|
assert url_for('main.view_notifications', service_id=service_one['id']) in page
|
||||||
assert url_for('main.api_keys', service_id=service_one['id']) not in page
|
assert url_for('main.api_keys', service_id=service_one['id']) not in page
|
||||||
assert url_for('main.edit_service_template', service_id=service_one['id'], template_id=1) in page
|
|
||||||
|
# Should this be here??
|
||||||
|
# template_json = mock_get_service_templates(service_one['id'])['data'][0]
|
||||||
|
|
||||||
|
# assert url_for(
|
||||||
|
# 'main.edit_service_template',
|
||||||
|
# service_id=service_one['id'],
|
||||||
|
# template_id=template_json['id']) in page
|
||||||
|
|
||||||
|
|
||||||
def test_route_for_service_permissions(mocker,
|
def test_route_for_service_permissions(mocker,
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
from flask import url_for
|
from flask import url_for
|
||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
import json
|
import json
|
||||||
|
from app.utils import generate_notifications_csv
|
||||||
|
|
||||||
|
|
||||||
def test_should_return_list_of_all_jobs(app_,
|
def test_should_return_list_of_all_jobs(app_,
|
||||||
@@ -179,3 +180,26 @@ def test_should_show_notifications_for_a_service_with_next_previous(app_,
|
|||||||
assert url_for('main.view_notifications', service_id=service_one['id'], page=1) in content
|
assert url_for('main.view_notifications', service_id=service_one['id'], page=1) in content
|
||||||
assert 'Previous page' in content
|
assert 'Previous page' in content
|
||||||
assert 'Next page' in content
|
assert 'Next page' in content
|
||||||
|
|
||||||
|
|
||||||
|
def test_should_download_notifications_for_a_service(app_,
|
||||||
|
service_one,
|
||||||
|
api_user_active,
|
||||||
|
mock_login,
|
||||||
|
mock_get_user,
|
||||||
|
mock_get_user_by_email,
|
||||||
|
mock_get_service,
|
||||||
|
mock_get_notifications,
|
||||||
|
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.view_notifications',
|
||||||
|
service_id=service_one['id'],
|
||||||
|
download='csv'))
|
||||||
|
csv_content = generate_notifications_csv(
|
||||||
|
mock_get_notifications(service_one['id'])['notifications'])
|
||||||
|
assert response.status_code == 200
|
||||||
|
assert response.get_data(as_text=True) == csv_content
|
||||||
|
assert 'text/csv' in response.headers['Content-Type']
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import pytest
|
import pytest
|
||||||
|
import re
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
from bs4 import BeautifulSoup
|
||||||
from flask import url_for
|
from flask import url_for
|
||||||
from unittest.mock import ANY
|
from unittest.mock import ANY
|
||||||
from tests import validate_route_permission
|
from tests import validate_route_permission
|
||||||
@@ -17,7 +18,8 @@ def test_upload_csvfile_with_errors_shows_check_page_with_errors(
|
|||||||
mock_get_service_template,
|
mock_get_service_template,
|
||||||
mock_s3_upload,
|
mock_s3_upload,
|
||||||
mock_has_permissions,
|
mock_has_permissions,
|
||||||
mock_get_users_by_service
|
mock_get_users_by_service,
|
||||||
|
fake_uuid
|
||||||
):
|
):
|
||||||
|
|
||||||
contents = u'phone number,name\n+44 123,test1\n+44 456,test2'
|
contents = u'phone number,name\n+44 123,test1\n+44 456,test2'
|
||||||
@@ -27,13 +29,13 @@ def test_upload_csvfile_with_errors_shows_check_page_with_errors(
|
|||||||
with app_.test_client() as client:
|
with app_.test_client() as client:
|
||||||
client.login(api_user_active)
|
client.login(api_user_active)
|
||||||
initial_upload = client.post(
|
initial_upload = client.post(
|
||||||
url_for('main.send_messages', service_id=12345, template_id=54321),
|
url_for('main.send_messages', service_id=fake_uuid, template_id=fake_uuid),
|
||||||
data={'file': (BytesIO(contents.encode('utf-8')), 'invalid.csv')},
|
data={'file': (BytesIO(contents.encode('utf-8')), 'invalid.csv')},
|
||||||
content_type='multipart/form-data',
|
content_type='multipart/form-data',
|
||||||
follow_redirects=True
|
follow_redirects=True
|
||||||
)
|
)
|
||||||
reupload = client.post(
|
reupload = client.post(
|
||||||
url_for('main.check_messages', service_id=12345, template_type='sms', upload_id='abc123'),
|
url_for('main.check_messages', service_id=fake_uuid, template_type='sms', upload_id='abc123'),
|
||||||
data={'file': (BytesIO(contents.encode('utf-8')), 'invalid.csv')},
|
data={'file': (BytesIO(contents.encode('utf-8')), 'invalid.csv')},
|
||||||
content_type='multipart/form-data',
|
content_type='multipart/form-data',
|
||||||
follow_redirects=True
|
follow_redirects=True
|
||||||
@@ -57,7 +59,8 @@ def test_send_test_sms_message_to_self(
|
|||||||
mock_get_service_template,
|
mock_get_service_template,
|
||||||
mock_s3_upload,
|
mock_s3_upload,
|
||||||
mock_has_permissions,
|
mock_has_permissions,
|
||||||
mock_get_users_by_service
|
mock_get_users_by_service,
|
||||||
|
fake_uuid
|
||||||
):
|
):
|
||||||
|
|
||||||
expected_data = {'data': 'phone number\r\n07700 900 762\r\n', 'file_name': 'Test run'}
|
expected_data = {'data': 'phone number\r\n07700 900 762\r\n', 'file_name': 'Test run'}
|
||||||
@@ -67,11 +70,11 @@ def test_send_test_sms_message_to_self(
|
|||||||
with app_.test_client() as client:
|
with app_.test_client() as client:
|
||||||
client.login(api_user_active)
|
client.login(api_user_active)
|
||||||
response = client.get(
|
response = client.get(
|
||||||
url_for('main.send_message_to_self', service_id=12345, template_id=54321),
|
url_for('main.send_message_to_self', service_id=fake_uuid, template_id=fake_uuid),
|
||||||
follow_redirects=True
|
follow_redirects=True
|
||||||
)
|
)
|
||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
mock_s3_upload.assert_called_with(ANY, '12345', expected_data, 'eu-west-1')
|
mock_s3_upload.assert_called_with(ANY, fake_uuid, expected_data, 'eu-west-1')
|
||||||
|
|
||||||
|
|
||||||
def test_send_test_email_message_to_self(
|
def test_send_test_email_message_to_self(
|
||||||
@@ -83,7 +86,8 @@ def test_send_test_email_message_to_self(
|
|||||||
mock_get_service_email_template,
|
mock_get_service_email_template,
|
||||||
mock_s3_upload,
|
mock_s3_upload,
|
||||||
mock_has_permissions,
|
mock_has_permissions,
|
||||||
mock_get_users_by_service
|
mock_get_users_by_service,
|
||||||
|
fake_uuid
|
||||||
):
|
):
|
||||||
|
|
||||||
expected_data = {'data': 'email address\r\ntest@user.gov.uk\r\n', 'file_name': 'Test run'}
|
expected_data = {'data': 'email address\r\ntest@user.gov.uk\r\n', 'file_name': 'Test run'}
|
||||||
@@ -93,11 +97,11 @@ def test_send_test_email_message_to_self(
|
|||||||
with app_.test_client() as client:
|
with app_.test_client() as client:
|
||||||
client.login(api_user_active)
|
client.login(api_user_active)
|
||||||
response = client.get(
|
response = client.get(
|
||||||
url_for('main.send_message_to_self', service_id=12345, template_id=54321),
|
url_for('main.send_message_to_self', service_id=fake_uuid, template_id=fake_uuid),
|
||||||
follow_redirects=True
|
follow_redirects=True
|
||||||
)
|
)
|
||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
mock_s3_upload.assert_called_with(ANY, '12345', expected_data, 'eu-west-1')
|
mock_s3_upload.assert_called_with(ANY, fake_uuid, expected_data, 'eu-west-1')
|
||||||
|
|
||||||
|
|
||||||
def test_send_test_message_from_api_page(
|
def test_send_test_message_from_api_page(
|
||||||
@@ -108,13 +112,14 @@ def test_send_test_message_from_api_page(
|
|||||||
mock_get_service,
|
mock_get_service,
|
||||||
mock_get_service_email_template,
|
mock_get_service_email_template,
|
||||||
mock_s3_upload,
|
mock_s3_upload,
|
||||||
mock_has_permissions
|
mock_has_permissions,
|
||||||
|
fake_uuid
|
||||||
):
|
):
|
||||||
with app_.test_request_context():
|
with app_.test_request_context():
|
||||||
with app_.test_client() as client:
|
with app_.test_client() as client:
|
||||||
client.login(api_user_active)
|
client.login(api_user_active)
|
||||||
response = client.get(
|
response = client.get(
|
||||||
url_for('main.send_from_api', service_id=12345, template_id=54321),
|
url_for('main.send_from_api', service_id=fake_uuid, template_id=fake_uuid),
|
||||||
follow_redirects=True
|
follow_redirects=True
|
||||||
)
|
)
|
||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
@@ -128,14 +133,15 @@ def test_download_example_csv(
|
|||||||
mock_login,
|
mock_login,
|
||||||
mock_get_service,
|
mock_get_service,
|
||||||
mock_get_service_template,
|
mock_get_service_template,
|
||||||
mock_has_permissions
|
mock_has_permissions,
|
||||||
|
fake_uuid
|
||||||
):
|
):
|
||||||
|
|
||||||
with app_.test_request_context():
|
with app_.test_request_context():
|
||||||
with app_.test_client() as client:
|
with app_.test_client() as client:
|
||||||
client.login(api_user_active)
|
client.login(api_user_active)
|
||||||
response = client.get(
|
response = client.get(
|
||||||
url_for('main.get_example_csv', service_id=12345, template_id=54321),
|
url_for('main.get_example_csv', service_id=fake_uuid, template_id=fake_uuid),
|
||||||
follow_redirects=True
|
follow_redirects=True
|
||||||
)
|
)
|
||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
@@ -152,7 +158,8 @@ def test_upload_csvfile_with_valid_phone_shows_all_numbers(
|
|||||||
mock_get_service_template,
|
mock_get_service_template,
|
||||||
mock_s3_upload,
|
mock_s3_upload,
|
||||||
mock_has_permissions,
|
mock_has_permissions,
|
||||||
mock_get_users_by_service
|
mock_get_users_by_service,
|
||||||
|
fake_uuid
|
||||||
):
|
):
|
||||||
|
|
||||||
mocker.patch(
|
mocker.patch(
|
||||||
@@ -166,13 +173,13 @@ def test_upload_csvfile_with_valid_phone_shows_all_numbers(
|
|||||||
with app_.test_client() as client:
|
with app_.test_client() as client:
|
||||||
client.login(api_user_active)
|
client.login(api_user_active)
|
||||||
response = client.post(
|
response = client.post(
|
||||||
url_for('main.send_messages', service_id=12345, template_id=54321),
|
url_for('main.send_messages', service_id=fake_uuid, template_id=fake_uuid),
|
||||||
data={'file': (BytesIO(''.encode('utf-8')), 'valid.csv')},
|
data={'file': (BytesIO(''.encode('utf-8')), 'valid.csv')},
|
||||||
content_type='multipart/form-data',
|
content_type='multipart/form-data',
|
||||||
follow_redirects=True
|
follow_redirects=True
|
||||||
)
|
)
|
||||||
with client.session_transaction() as sess:
|
with client.session_transaction() as sess:
|
||||||
assert int(sess['upload_data']['template_id']) == 54321
|
assert sess['upload_data']['template_id'] == fake_uuid
|
||||||
assert sess['upload_data']['original_file_name'] == 'valid.csv'
|
assert sess['upload_data']['original_file_name'] == 'valid.csv'
|
||||||
assert sess['upload_data']['notification_count'] == 53
|
assert sess['upload_data']['notification_count'] == 53
|
||||||
|
|
||||||
@@ -272,7 +279,8 @@ def test_route_permissions(mocker,
|
|||||||
mock_get_jobs,
|
mock_get_jobs,
|
||||||
mock_get_notifications,
|
mock_get_notifications,
|
||||||
mock_create_job,
|
mock_create_job,
|
||||||
mock_s3_upload):
|
mock_s3_upload,
|
||||||
|
fake_uuid):
|
||||||
routes = [
|
routes = [
|
||||||
'main.choose_template',
|
'main.choose_template',
|
||||||
'main.send_messages',
|
'main.send_messages',
|
||||||
@@ -288,7 +296,7 @@ def test_route_permissions(mocker,
|
|||||||
route,
|
route,
|
||||||
service_id=service_one['id'],
|
service_id=service_one['id'],
|
||||||
template_type='sms',
|
template_type='sms',
|
||||||
template_id=123),
|
template_id=fake_uuid),
|
||||||
['send_texts', 'send_emails', 'send_letters'],
|
['send_texts', 'send_emails', 'send_letters'],
|
||||||
api_user_active,
|
api_user_active,
|
||||||
service_one)
|
service_one)
|
||||||
@@ -303,7 +311,7 @@ def test_route_permissions(mocker,
|
|||||||
'main.send_message_to_self',
|
'main.send_message_to_self',
|
||||||
service_id=service_one['id'],
|
service_id=service_one['id'],
|
||||||
template_type='sms',
|
template_type='sms',
|
||||||
template_id=123),
|
template_id=fake_uuid),
|
||||||
['send_texts', 'send_emails', 'send_letters'],
|
['send_texts', 'send_emails', 'send_letters'],
|
||||||
api_user_active,
|
api_user_active,
|
||||||
service_one)
|
service_one)
|
||||||
@@ -317,7 +325,8 @@ def test_route_invalid_permissions(mocker,
|
|||||||
mock_get_service_templates,
|
mock_get_service_templates,
|
||||||
mock_get_jobs,
|
mock_get_jobs,
|
||||||
mock_get_notifications,
|
mock_get_notifications,
|
||||||
mock_create_job):
|
mock_create_job,
|
||||||
|
fake_uuid):
|
||||||
routes = [
|
routes = [
|
||||||
'main.choose_template',
|
'main.choose_template',
|
||||||
'main.send_messages',
|
'main.send_messages',
|
||||||
@@ -334,7 +343,7 @@ def test_route_invalid_permissions(mocker,
|
|||||||
route,
|
route,
|
||||||
service_id=service_one['id'],
|
service_id=service_one['id'],
|
||||||
template_type='sms',
|
template_type='sms',
|
||||||
template_id=123),
|
template_id=fake_uuid),
|
||||||
['blah'],
|
['blah'],
|
||||||
api_user_active,
|
api_user_active,
|
||||||
service_one)
|
service_one)
|
||||||
@@ -388,7 +397,11 @@ def test_route_choose_template_send_messages_permissions(mocker,
|
|||||||
mock_get_service_templates,
|
mock_get_service_templates,
|
||||||
mock_get_jobs):
|
mock_get_jobs):
|
||||||
with app_.test_request_context():
|
with app_.test_request_context():
|
||||||
template_id = mock_get_service_templates(service_one['id'])['data'][0]['id']
|
template_id = None
|
||||||
|
for temp in mock_get_service_templates(service_one['id'])['data']:
|
||||||
|
if temp['template_type'] == 'sms':
|
||||||
|
template_id = temp['id']
|
||||||
|
assert template_id
|
||||||
resp = validate_route_permission(
|
resp = validate_route_permission(
|
||||||
mocker,
|
mocker,
|
||||||
app_,
|
app_,
|
||||||
@@ -426,7 +439,11 @@ def test_route_choose_template_manage_api_keys_permissions(mocker,
|
|||||||
mock_get_service_templates,
|
mock_get_service_templates,
|
||||||
mock_get_jobs):
|
mock_get_jobs):
|
||||||
with app_.test_request_context():
|
with app_.test_request_context():
|
||||||
template_id = mock_get_service_templates(service_one['id'])['data'][0]['id']
|
template_id = None
|
||||||
|
for temp in mock_get_service_templates(service_one['id'])['data']:
|
||||||
|
if temp['template_type'] == 'sms':
|
||||||
|
template_id = temp['id']
|
||||||
|
assert template_id
|
||||||
resp = validate_route_permission(
|
resp = validate_route_permission(
|
||||||
mocker,
|
mocker,
|
||||||
app_,
|
app_,
|
||||||
@@ -440,10 +457,6 @@ def test_route_choose_template_manage_api_keys_permissions(mocker,
|
|||||||
api_user_active,
|
api_user_active,
|
||||||
service_one)
|
service_one)
|
||||||
page = resp.get_data(as_text=True)
|
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(
|
assert url_for(
|
||||||
"main.send_message_to_self",
|
"main.send_message_to_self",
|
||||||
service_id=service_one['id'],
|
service_id=service_one['id'],
|
||||||
@@ -452,3 +465,9 @@ def test_route_choose_template_manage_api_keys_permissions(mocker,
|
|||||||
"main.edit_service_template",
|
"main.edit_service_template",
|
||||||
service_id=service_one['id'],
|
service_id=service_one['id'],
|
||||||
template_id=template_id) not in page
|
template_id=template_id) not in page
|
||||||
|
page = BeautifulSoup(resp.data.decode('utf-8'), 'html.parser')
|
||||||
|
links = page.findAll('a', href=re.compile('^' + url_for(
|
||||||
|
"main.send_from_api",
|
||||||
|
service_id=service_one['id'],
|
||||||
|
template_id=template_id)))
|
||||||
|
assert len(links) == 1
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ def test_should_redirect_after_service_name_confirmation(app_,
|
|||||||
mock_update_service.assert_called_once_with(service_id,
|
mock_update_service.assert_called_once_with(service_id,
|
||||||
service_new_name,
|
service_new_name,
|
||||||
service_one['active'],
|
service_one['active'],
|
||||||
service_one['limit'],
|
service_one['message_limit'],
|
||||||
service_one['restricted'],
|
service_one['restricted'],
|
||||||
service_one['users'],
|
service_one['users'],
|
||||||
email_safe(service_new_name))
|
email_safe(service_new_name))
|
||||||
|
|||||||
@@ -12,12 +12,13 @@ def test_should_show_page_for_one_templates(app_,
|
|||||||
mock_get_service_template,
|
mock_get_service_template,
|
||||||
mock_get_user,
|
mock_get_user,
|
||||||
mock_get_user_by_email,
|
mock_get_user_by_email,
|
||||||
mock_has_permissions):
|
mock_has_permissions,
|
||||||
|
fake_uuid):
|
||||||
with app_.test_request_context():
|
with app_.test_request_context():
|
||||||
with app_.test_client() as client:
|
with app_.test_client() as client:
|
||||||
client.login(api_user_active)
|
client.login(api_user_active)
|
||||||
service_id = str(uuid.uuid4())
|
service_id = fake_uuid
|
||||||
template_id = 456
|
template_id = fake_uuid
|
||||||
response = client.get(url_for(
|
response = client.get(url_for(
|
||||||
'.edit_service_template',
|
'.edit_service_template',
|
||||||
service_id=service_id,
|
service_id=service_id,
|
||||||
@@ -38,12 +39,13 @@ def test_should_redirect_when_saving_a_template(app_,
|
|||||||
mock_get_user,
|
mock_get_user,
|
||||||
mock_get_service,
|
mock_get_service,
|
||||||
mock_get_user_by_email,
|
mock_get_user_by_email,
|
||||||
mock_has_permissions):
|
mock_has_permissions,
|
||||||
|
fake_uuid):
|
||||||
with app_.test_request_context():
|
with app_.test_request_context():
|
||||||
with app_.test_client() as client:
|
with app_.test_client() as client:
|
||||||
client.login(api_user_active)
|
client.login(api_user_active)
|
||||||
service_id = str(uuid.uuid4())
|
service_id = fake_uuid
|
||||||
template_id = 456
|
template_id = fake_uuid
|
||||||
name = "new name"
|
name = "new name"
|
||||||
content = "template content"
|
content = "template content"
|
||||||
data = {
|
data = {
|
||||||
@@ -72,12 +74,13 @@ def test_should_show_delete_template_page(app_,
|
|||||||
mock_get_service_template,
|
mock_get_service_template,
|
||||||
mock_get_user,
|
mock_get_user,
|
||||||
mock_get_user_by_email,
|
mock_get_user_by_email,
|
||||||
mock_has_permissions):
|
mock_has_permissions,
|
||||||
|
fake_uuid):
|
||||||
with app_.test_request_context():
|
with app_.test_request_context():
|
||||||
with app_.test_client() as client:
|
with app_.test_client() as client:
|
||||||
client.login(api_user_active)
|
client.login(api_user_active)
|
||||||
service_id = str(uuid.uuid4())
|
service_id = fake_uuid
|
||||||
template_id = 456
|
template_id = fake_uuid
|
||||||
response = client.get(url_for(
|
response = client.get(url_for(
|
||||||
'.delete_service_template',
|
'.delete_service_template',
|
||||||
service_id=service_id,
|
service_id=service_id,
|
||||||
@@ -100,17 +103,18 @@ def test_should_redirect_when_deleting_a_template(app_,
|
|||||||
mock_delete_service_template,
|
mock_delete_service_template,
|
||||||
mock_get_user,
|
mock_get_user,
|
||||||
mock_get_user_by_email,
|
mock_get_user_by_email,
|
||||||
mock_has_permissions):
|
mock_has_permissions,
|
||||||
|
fake_uuid):
|
||||||
with app_.test_request_context():
|
with app_.test_request_context():
|
||||||
with app_.test_client() as client:
|
with app_.test_client() as client:
|
||||||
client.login(api_user_active)
|
client.login(api_user_active)
|
||||||
service_id = str(uuid.uuid4())
|
service_id = fake_uuid
|
||||||
template_id = 456
|
template_id = fake_uuid
|
||||||
name = "new name"
|
name = "new name"
|
||||||
type_ = "sms"
|
type_ = "sms"
|
||||||
content = "template content"
|
content = "template content"
|
||||||
data = {
|
data = {
|
||||||
'id': template_id,
|
'id': str(template_id),
|
||||||
'name': name,
|
'name': name,
|
||||||
'template_type': type_,
|
'template_type': type_,
|
||||||
'content': content,
|
'content': content,
|
||||||
@@ -136,7 +140,8 @@ def test_route_permissions(mocker,
|
|||||||
app_,
|
app_,
|
||||||
api_user_active,
|
api_user_active,
|
||||||
service_one,
|
service_one,
|
||||||
mock_get_service_template):
|
mock_get_service_template,
|
||||||
|
fake_uuid):
|
||||||
routes = [
|
routes = [
|
||||||
'main.add_service_template',
|
'main.add_service_template',
|
||||||
'main.edit_service_template',
|
'main.edit_service_template',
|
||||||
@@ -152,7 +157,7 @@ def test_route_permissions(mocker,
|
|||||||
route,
|
route,
|
||||||
service_id=service_one['id'],
|
service_id=service_one['id'],
|
||||||
template_type='sms',
|
template_type='sms',
|
||||||
template_id=123),
|
template_id=fake_uuid),
|
||||||
['manage_templates'],
|
['manage_templates'],
|
||||||
api_user_active,
|
api_user_active,
|
||||||
service_one)
|
service_one)
|
||||||
@@ -183,7 +188,8 @@ def test_route_invalid_permissions(mocker,
|
|||||||
app_,
|
app_,
|
||||||
api_user_active,
|
api_user_active,
|
||||||
service_one,
|
service_one,
|
||||||
mock_get_service_template):
|
mock_get_service_template,
|
||||||
|
fake_uuid):
|
||||||
routes = [
|
routes = [
|
||||||
'main.add_service_template',
|
'main.add_service_template',
|
||||||
'main.edit_service_template',
|
'main.edit_service_template',
|
||||||
@@ -199,7 +205,7 @@ def test_route_invalid_permissions(mocker,
|
|||||||
route,
|
route,
|
||||||
service_id=service_one['id'],
|
service_id=service_one['id'],
|
||||||
template_type='sms',
|
template_type='sms',
|
||||||
template_id=123),
|
template_id=fake_uuid),
|
||||||
['view_activity'],
|
['view_activity'],
|
||||||
api_user_active,
|
api_user_active,
|
||||||
service_one)
|
service_one)
|
||||||
|
|||||||
@@ -12,7 +12,9 @@ from . import (
|
|||||||
api_key_json,
|
api_key_json,
|
||||||
job_json,
|
job_json,
|
||||||
notification_json,
|
notification_json,
|
||||||
invite_json
|
invite_json,
|
||||||
|
sample_uuid,
|
||||||
|
generate_uuid
|
||||||
)
|
)
|
||||||
from app.notify_client.models import (
|
from app.notify_client.models import (
|
||||||
User,
|
User,
|
||||||
@@ -47,11 +49,16 @@ def mock_send_sms(request, mocker):
|
|||||||
return mocker.patch("app.service_api_client.send_sms")
|
return mocker.patch("app.service_api_client.send_sms")
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(scope='function')
|
||||||
|
def fake_uuid():
|
||||||
|
return sample_uuid()
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope='function')
|
@pytest.fixture(scope='function')
|
||||||
def mock_get_service(mocker, api_user_active):
|
def mock_get_service(mocker, api_user_active):
|
||||||
def _get(service_id):
|
def _get(service_id):
|
||||||
service = service_json(
|
service = service_json(
|
||||||
service_id, "Test Service", [api_user_active.id], limit=1000,
|
service_id, "Test Service", [api_user_active.id], message_limit=1000,
|
||||||
active=False, restricted=True)
|
active=False, restricted=True)
|
||||||
return {'data': service}
|
return {'data': service}
|
||||||
|
|
||||||
@@ -60,9 +67,9 @@ def mock_get_service(mocker, api_user_active):
|
|||||||
|
|
||||||
@pytest.fixture(scope='function')
|
@pytest.fixture(scope='function')
|
||||||
def mock_create_service(mocker):
|
def mock_create_service(mocker):
|
||||||
def _create(service_name, active, limit, restricted, user_id, email_from):
|
def _create(service_name, active, message_limit, restricted, user_id, email_from):
|
||||||
service = service_json(
|
service = service_json(
|
||||||
101, service_name, [user_id], limit=limit,
|
101, service_name, [user_id], message_limit=message_limit,
|
||||||
active=active, restricted=restricted, email_from=email_from)
|
active=active, restricted=restricted, email_from=email_from)
|
||||||
return service['id']
|
return service['id']
|
||||||
|
|
||||||
@@ -75,12 +82,12 @@ def mock_update_service(mocker):
|
|||||||
def _update(service_id,
|
def _update(service_id,
|
||||||
service_name,
|
service_name,
|
||||||
active,
|
active,
|
||||||
limit,
|
message_limit,
|
||||||
restricted,
|
restricted,
|
||||||
users,
|
users,
|
||||||
email_from):
|
email_from):
|
||||||
service = service_json(
|
service = service_json(
|
||||||
service_id, service_name, users, limit=limit,
|
service_id, service_name, users, message_limit=message_limit,
|
||||||
active=active, restricted=restricted, email_from=email_from)
|
active=active, restricted=restricted, email_from=email_from)
|
||||||
return {'data': service}
|
return {'data': service}
|
||||||
|
|
||||||
@@ -111,9 +118,9 @@ SERVICE_TWO_ID = "147ad62a-2951-4fa1-9ca0-093cd1a52c52"
|
|||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope='function')
|
@pytest.fixture(scope='function')
|
||||||
def mock_get_services(mocker, user=None):
|
def mock_get_services(mocker, fake_uuid, user=None):
|
||||||
if user is None:
|
if user is None:
|
||||||
user = active_user_with_permissions()
|
user = active_user_with_permissions(fake_uuid)
|
||||||
|
|
||||||
def _create(user_id=None):
|
def _create(user_id=None):
|
||||||
service_one = service_json(
|
service_one = service_json(
|
||||||
@@ -127,9 +134,9 @@ def mock_get_services(mocker, user=None):
|
|||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope='function')
|
@pytest.fixture(scope='function')
|
||||||
def mock_get_services_with_one_service(mocker, user=None):
|
def mock_get_services_with_one_service(mocker, fake_uuid, user=None):
|
||||||
if user is None:
|
if user is None:
|
||||||
user = api_user_active()
|
user = api_user_active(fake_uuid)
|
||||||
|
|
||||||
def _create(user_id=None):
|
def _create(user_id=None):
|
||||||
return {'data': [service_json(
|
return {'data': [service_json(
|
||||||
@@ -181,10 +188,10 @@ def mock_get_service_email_template(mocker):
|
|||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope='function')
|
@pytest.fixture(scope='function')
|
||||||
def mock_create_service_template(mocker):
|
def mock_create_service_template(mocker, fake_uuid):
|
||||||
def _create(name, type_, content, service):
|
def _create(name, type_, content, service):
|
||||||
template = template_json(
|
template = template_json(
|
||||||
101, name, type_, content, service)
|
fake_uuid, name, type_, content, service)
|
||||||
return {'data': template}
|
return {'data': template}
|
||||||
|
|
||||||
return mocker.patch(
|
return mocker.patch(
|
||||||
@@ -196,7 +203,7 @@ def mock_create_service_template(mocker):
|
|||||||
def mock_update_service_template(mocker):
|
def mock_update_service_template(mocker):
|
||||||
def _update(id_, name, type_, content, service):
|
def _update(id_, name, type_, content, service):
|
||||||
template = template_json(
|
template = template_json(
|
||||||
id_, name, type_, content, service)
|
service, id_, name, type_, content)
|
||||||
return {'data': template}
|
return {'data': template}
|
||||||
|
|
||||||
return mocker.patch(
|
return mocker.patch(
|
||||||
@@ -206,19 +213,24 @@ def mock_update_service_template(mocker):
|
|||||||
|
|
||||||
@pytest.fixture(scope='function')
|
@pytest.fixture(scope='function')
|
||||||
def mock_get_service_templates(mocker):
|
def mock_get_service_templates(mocker):
|
||||||
|
uuid1 = str(generate_uuid())
|
||||||
|
uuid2 = str(generate_uuid())
|
||||||
|
uuid3 = str(generate_uuid())
|
||||||
|
uuid4 = str(generate_uuid())
|
||||||
|
|
||||||
def _create(service_id):
|
def _create(service_id):
|
||||||
return {'data': [
|
return {'data': [
|
||||||
template_json(
|
template_json(
|
||||||
service_id, 1, "sms_template_one", "sms", "sms template one content"
|
service_id, uuid1, "sms_template_one", "sms", "sms template one content"
|
||||||
),
|
),
|
||||||
template_json(
|
template_json(
|
||||||
service_id, 2, "sms_template_two", "sms", "sms template two content"
|
service_id, uuid2, "sms_template_two", "sms", "sms template two content"
|
||||||
),
|
),
|
||||||
template_json(
|
template_json(
|
||||||
service_id, 3, "email_template_one", "email", "email template one content"
|
service_id, uuid3, "email_template_one", "email", "email template one content"
|
||||||
),
|
),
|
||||||
template_json(
|
template_json(
|
||||||
service_id, 4, "email_template_two", "email", "email template two content"
|
service_id, uuid4, "email_template_two", "email", "email template two content"
|
||||||
)
|
)
|
||||||
]}
|
]}
|
||||||
|
|
||||||
@@ -239,9 +251,9 @@ def mock_delete_service_template(mocker):
|
|||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope='function')
|
@pytest.fixture(scope='function')
|
||||||
def api_user_pending():
|
def api_user_pending(fake_uuid):
|
||||||
from app.notify_client.user_api_client import User
|
from app.notify_client.user_api_client import User
|
||||||
user_data = {'id': 111,
|
user_data = {'id': fake_uuid,
|
||||||
'name': 'Test User',
|
'name': 'Test User',
|
||||||
'password': 'somepassword',
|
'password': 'somepassword',
|
||||||
'email_address': 'test@user.gov.uk',
|
'email_address': 'test@user.gov.uk',
|
||||||
@@ -255,9 +267,9 @@ def api_user_pending():
|
|||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope='function')
|
@pytest.fixture(scope='function')
|
||||||
def platform_admin_user():
|
def platform_admin_user(fake_uuid):
|
||||||
from app.notify_client.user_api_client import User
|
from app.notify_client.user_api_client import User
|
||||||
user_data = {'id': 222,
|
user_data = {'id': fake_uuid,
|
||||||
'name': 'Platform admin user',
|
'name': 'Platform admin user',
|
||||||
'password': 'somepassword',
|
'password': 'somepassword',
|
||||||
'email_address': 'platform@admin.gov.uk',
|
'email_address': 'platform@admin.gov.uk',
|
||||||
@@ -272,9 +284,9 @@ def platform_admin_user():
|
|||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope='function')
|
@pytest.fixture(scope='function')
|
||||||
def api_user_active():
|
def api_user_active(fake_uuid):
|
||||||
from app.notify_client.user_api_client import User
|
from app.notify_client.user_api_client import User
|
||||||
user_data = {'id': 222,
|
user_data = {'id': fake_uuid,
|
||||||
'name': 'Test User',
|
'name': 'Test User',
|
||||||
'password': 'somepassword',
|
'password': 'somepassword',
|
||||||
'email_address': 'test@user.gov.uk',
|
'email_address': 'test@user.gov.uk',
|
||||||
@@ -289,10 +301,10 @@ def api_user_active():
|
|||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope='function')
|
@pytest.fixture(scope='function')
|
||||||
def active_user_with_permissions():
|
def active_user_with_permissions(fake_uuid):
|
||||||
from app.notify_client.user_api_client import User
|
from app.notify_client.user_api_client import User
|
||||||
|
|
||||||
user_data = {'id': 222,
|
user_data = {'id': fake_uuid,
|
||||||
'name': 'Test User',
|
'name': 'Test User',
|
||||||
'password': 'somepassword',
|
'password': 'somepassword',
|
||||||
'email_address': 'test@user.gov.uk',
|
'email_address': 'test@user.gov.uk',
|
||||||
@@ -314,9 +326,9 @@ def active_user_with_permissions():
|
|||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope='function')
|
@pytest.fixture(scope='function')
|
||||||
def api_user_locked():
|
def api_user_locked(fake_uuid):
|
||||||
from app.notify_client.user_api_client import User
|
from app.notify_client.user_api_client import User
|
||||||
user_data = {'id': 333,
|
user_data = {'id': fake_uuid,
|
||||||
'name': 'Test User',
|
'name': 'Test User',
|
||||||
'password': 'somepassword',
|
'password': 'somepassword',
|
||||||
'email_address': 'test@user.gov.uk',
|
'email_address': 'test@user.gov.uk',
|
||||||
@@ -330,9 +342,9 @@ def api_user_locked():
|
|||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope='function')
|
@pytest.fixture(scope='function')
|
||||||
def api_user_request_password_reset():
|
def api_user_request_password_reset(fake_uuid):
|
||||||
from app.notify_client.user_api_client import User
|
from app.notify_client.user_api_client import User
|
||||||
user_data = {'id': 555,
|
user_data = {'id': fake_uuid,
|
||||||
'name': 'Test User',
|
'name': 'Test User',
|
||||||
'password': 'somepassword',
|
'password': 'somepassword',
|
||||||
'email_address': 'test@user.gov.uk',
|
'email_address': 'test@user.gov.uk',
|
||||||
@@ -347,9 +359,9 @@ def api_user_request_password_reset():
|
|||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope='function')
|
@pytest.fixture(scope='function')
|
||||||
def api_user_changed_password():
|
def api_user_changed_password(fake_uuid):
|
||||||
from app.notify_client.user_api_client import User
|
from app.notify_client.user_api_client import User
|
||||||
user_data = {'id': 555,
|
user_data = {'id': fake_uuid,
|
||||||
'name': 'Test User',
|
'name': 'Test User',
|
||||||
'password': 'somepassword',
|
'password': 'somepassword',
|
||||||
'email_address': 'test@user.gov.uk',
|
'email_address': 'test@user.gov.uk',
|
||||||
@@ -377,8 +389,8 @@ def mock_register_user(mocker, api_user_pending):
|
|||||||
|
|
||||||
@pytest.fixture(scope='function')
|
@pytest.fixture(scope='function')
|
||||||
def mock_get_user(mocker, api_user_active):
|
def mock_get_user(mocker, api_user_active):
|
||||||
def _get_user(id):
|
def _get_user(id_):
|
||||||
api_user_active.id = id
|
api_user_active.id = id_
|
||||||
return api_user_active
|
return api_user_active
|
||||||
return mocker.patch(
|
return mocker.patch(
|
||||||
'app.user_api_client.get_user', side_effect=_get_user)
|
'app.user_api_client.get_user', side_effect=_get_user)
|
||||||
@@ -507,7 +519,7 @@ def mock_create_api_key(mocker):
|
|||||||
|
|
||||||
def _create(service_id, key_name):
|
def _create(service_id, key_name):
|
||||||
import uuid
|
import uuid
|
||||||
return {'data': str(uuid.uuid4())}
|
return {'data': str(generate_uuid())}
|
||||||
|
|
||||||
return mocker.patch('app.api_key_api_client.create_api_key', side_effect=_create)
|
return mocker.patch('app.api_key_api_client.create_api_key', side_effect=_create)
|
||||||
|
|
||||||
@@ -525,8 +537,8 @@ def mock_revoke_api_key(mocker):
|
|||||||
@pytest.fixture(scope='function')
|
@pytest.fixture(scope='function')
|
||||||
def mock_get_api_keys(mocker):
|
def mock_get_api_keys(mocker):
|
||||||
def _get_keys(service_id, key_id=None):
|
def _get_keys(service_id, key_id=None):
|
||||||
keys = {'apiKeys': [api_key_json(1, 'some key name'),
|
keys = {'apiKeys': [api_key_json(service_id, 'some key name'),
|
||||||
api_key_json(2, 'another key name', expiry_date=str(date.fromtimestamp(0)))]}
|
api_key_json(service_id, 'another key name', expiry_date=str(date.fromtimestamp(0)))]}
|
||||||
return keys
|
return keys
|
||||||
|
|
||||||
return mocker.patch('app.api_key_api_client.get_api_keys', side_effect=_get_keys)
|
return mocker.patch('app.api_key_api_client.get_api_keys', side_effect=_get_keys)
|
||||||
@@ -629,11 +641,10 @@ def mock_get_job(mocker, job_data):
|
|||||||
@pytest.fixture(scope='function')
|
@pytest.fixture(scope='function')
|
||||||
def mock_get_jobs(mocker):
|
def mock_get_jobs(mocker):
|
||||||
def _get_jobs(service_id):
|
def _get_jobs(service_id):
|
||||||
import uuid
|
|
||||||
data = []
|
data = []
|
||||||
for i in range(5):
|
for i in range(5):
|
||||||
job_data = job_json()
|
job_data = job_json()
|
||||||
job_data['id'] = str(uuid.uuid4())
|
job_data['id'] = str(generate_uuid())
|
||||||
job_data['service'] = service_id
|
job_data['service'] = service_id
|
||||||
data.append(job_data)
|
data.append(job_data)
|
||||||
return {"data": data}
|
return {"data": data}
|
||||||
@@ -709,14 +720,13 @@ def mock_s3_upload(mocker):
|
|||||||
|
|
||||||
@pytest.fixture(scope='function')
|
@pytest.fixture(scope='function')
|
||||||
def sample_invite(mocker, service_one, status='pending'):
|
def sample_invite(mocker, service_one, status='pending'):
|
||||||
import datetime
|
id_ = str(generate_uuid())
|
||||||
id = str(uuid.uuid4())
|
|
||||||
from_user = service_one['users'][0]
|
from_user = service_one['users'][0]
|
||||||
email_address = 'invited_user@test.gov.uk'
|
email_address = 'invited_user@test.gov.uk'
|
||||||
service_id = service_one['id']
|
service_id = service_one['id']
|
||||||
permissions = 'send_messages,manage_service,manage_api_keys'
|
permissions = 'send_messages,manage_service,manage_api_keys'
|
||||||
created_at = str(datetime.datetime.now())
|
created_at = str(datetime.now())
|
||||||
return invite_json(id, from_user, service_id, email_address, permissions, created_at, status)
|
return invite_json(id_, from_user, service_id, email_address, permissions, created_at, status)
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope='function')
|
@pytest.fixture(scope='function')
|
||||||
@@ -783,10 +793,8 @@ def mock_remove_user_from_service(mocker):
|
|||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope='function')
|
@pytest.fixture(scope='function')
|
||||||
def mock_get_template_statistics(mocker, service_one):
|
def mock_get_template_statistics(mocker, service_one, fake_uuid):
|
||||||
|
template = template_json(service_one['id'], fake_uuid, "Test template", "sms", "Something very interesting")
|
||||||
import uuid
|
|
||||||
template = template_json(service_one['id'], 1, "Test template", "sms", "Something very interesting")
|
|
||||||
data = {
|
data = {
|
||||||
"usage_count": 1,
|
"usage_count": 1,
|
||||||
"template": {
|
"template": {
|
||||||
@@ -795,7 +803,7 @@ def mock_get_template_statistics(mocker, service_one):
|
|||||||
"id": template['id']
|
"id": template['id']
|
||||||
},
|
},
|
||||||
"service": template['service'],
|
"service": template['service'],
|
||||||
"id": str(uuid.uuid4()),
|
"id": str(generate_uuid()),
|
||||||
"day": "2016-04-04"
|
"day": "2016-04-04"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user