mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-09-10 10:03:21 -04:00
Merge pull request #885 from alphagov/new-api-for-deleting-templates
Using new endpoint for template statistics
This commit is contained in:
@@ -186,7 +186,23 @@ def delete_service_template(service_id, template_id):
|
|||||||
template['template_content'] = template['content']
|
template['template_content'] = template['content']
|
||||||
form = form_objects[template['template_type']](**template)
|
form = form_objects[template['template_type']](**template)
|
||||||
|
|
||||||
flash('Are you sure you want to delete it?', 'delete')
|
try:
|
||||||
|
last_used_notification = template_statistics_client.get_template_statistics_for_template(
|
||||||
|
service_id, template['id']
|
||||||
|
)
|
||||||
|
message = '{} was last used {} ago'.format(
|
||||||
|
last_used_notification['template']['name'],
|
||||||
|
get_human_readable_delta(
|
||||||
|
parse(last_used_notification['created_at']).replace(tzinfo=None),
|
||||||
|
datetime.utcnow())
|
||||||
|
)
|
||||||
|
except HTTPError as e:
|
||||||
|
if e.status_code == 404:
|
||||||
|
message = '{} has never been used'.format(template['name'])
|
||||||
|
else:
|
||||||
|
raise e
|
||||||
|
|
||||||
|
flash('{}. Are you sure you want to delete it?'.format(message), 'delete')
|
||||||
return render_template(
|
return render_template(
|
||||||
'views/edit-{}-template.html'.format(template['template_type']),
|
'views/edit-{}-template.html'.format(template['template_type']),
|
||||||
h1='Edit template',
|
h1='Edit template',
|
||||||
|
|||||||
@@ -213,6 +213,10 @@ def notification_json(
|
|||||||
'next': '/service/{}/notifications'.format(service_id),
|
'next': '/service/{}/notifications'.format(service_id),
|
||||||
'last': '/service/{}/notifications'.format(service_id)
|
'last': '/service/{}/notifications'.format(service_id)
|
||||||
}
|
}
|
||||||
|
job_payload = None
|
||||||
|
if job:
|
||||||
|
job_payload = {'id': job['id'], 'original_file_name': job['original_file_name']}
|
||||||
|
|
||||||
data = {
|
data = {
|
||||||
'notifications': [{
|
'notifications': [{
|
||||||
'to': to,
|
'to': to,
|
||||||
@@ -220,7 +224,7 @@ def notification_json(
|
|||||||
'id': template['id'],
|
'id': template['id'],
|
||||||
'name': template['name'],
|
'name': template['name'],
|
||||||
'template_type': template['template_type']},
|
'template_type': template['template_type']},
|
||||||
'job': {'id': job['id'], 'original_file_name': job['original_file_name']} if job else None,
|
'job': job_payload,
|
||||||
'sent_at': sent_at,
|
'sent_at': sent_at,
|
||||||
'status': status,
|
'status': status,
|
||||||
'created_at': created_at,
|
'created_at': created_at,
|
||||||
@@ -228,13 +232,56 @@ def notification_json(
|
|||||||
'job_row_number': job_row_number,
|
'job_row_number': job_row_number,
|
||||||
'template_version': template['version']
|
'template_version': template['version']
|
||||||
} for i in range(rows)],
|
} for i in range(rows)],
|
||||||
'total': 5,
|
'total': rows,
|
||||||
'page_size': 50,
|
'page_size': 50,
|
||||||
'links': links
|
'links': links
|
||||||
}
|
}
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
def single_notification_json(
|
||||||
|
service_id,
|
||||||
|
job=None,
|
||||||
|
template=None,
|
||||||
|
status=None,
|
||||||
|
sent_at=None,
|
||||||
|
created_at=None,
|
||||||
|
updated_at=None
|
||||||
|
):
|
||||||
|
if template is None:
|
||||||
|
template = template_json(service_id, str(generate_uuid()))
|
||||||
|
if sent_at is None:
|
||||||
|
sent_at = str(datetime.utcnow())
|
||||||
|
if created_at is None:
|
||||||
|
created_at = str(datetime.utcnow())
|
||||||
|
if updated_at is None:
|
||||||
|
updated_at = str(datetime.utcnow() + timedelta(minutes=1))
|
||||||
|
if status is None:
|
||||||
|
status = 'delivered'
|
||||||
|
job_payload = None
|
||||||
|
if job:
|
||||||
|
job_payload = {'id': job['id'], 'original_file_name': job['original_file_name']}
|
||||||
|
|
||||||
|
data = {
|
||||||
|
'sent_at': sent_at,
|
||||||
|
'billable_units': 1,
|
||||||
|
'status': status,
|
||||||
|
'created_at': created_at,
|
||||||
|
'reference': None,
|
||||||
|
'updated_at': updated_at,
|
||||||
|
'template_version': 5,
|
||||||
|
'service': service_id,
|
||||||
|
'id': '29441662-17ce-4ffe-9502-fcaed73b2826',
|
||||||
|
'template': template,
|
||||||
|
'job_row_number': 0,
|
||||||
|
'notification_type': 'sms',
|
||||||
|
'api_key': None,
|
||||||
|
'job': job_payload,
|
||||||
|
'sent_by': 'mmg'
|
||||||
|
}
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
def validate_route_permission(mocker,
|
def validate_route_permission(mocker,
|
||||||
app_,
|
app_,
|
||||||
method,
|
method,
|
||||||
|
|||||||
@@ -1,24 +1,26 @@
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
from unittest.mock import Mock
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
from flask import url_for
|
from flask import url_for
|
||||||
from freezegun import freeze_time
|
from freezegun import freeze_time
|
||||||
|
from notifications_python_client.errors import HTTPError
|
||||||
|
|
||||||
from tests import validate_route_permission
|
from tests import validate_route_permission, template_json, single_notification_json
|
||||||
from app.main.views.templates import get_last_use_message, get_human_readable_delta
|
from app.main.views.templates import get_last_use_message, get_human_readable_delta
|
||||||
|
|
||||||
|
|
||||||
def test_should_show_page_for_one_template(
|
def test_should_show_page_for_one_template(
|
||||||
app_,
|
app_,
|
||||||
api_user_active,
|
api_user_active,
|
||||||
mock_login,
|
mock_login,
|
||||||
mock_get_service,
|
mock_get_service,
|
||||||
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
|
fake_uuid
|
||||||
):
|
):
|
||||||
with app_.test_request_context():
|
with app_.test_request_context():
|
||||||
with app_.test_client() as client:
|
with app_.test_client() as client:
|
||||||
@@ -74,16 +76,16 @@ def test_should_redirect_when_saving_a_template(app_,
|
|||||||
|
|
||||||
|
|
||||||
def test_should_show_interstitial_when_making_breaking_change(
|
def test_should_show_interstitial_when_making_breaking_change(
|
||||||
app_,
|
app_,
|
||||||
api_user_active,
|
api_user_active,
|
||||||
mock_login,
|
mock_login,
|
||||||
mock_get_service_template,
|
mock_get_service_template,
|
||||||
mock_update_service_template,
|
mock_update_service_template,
|
||||||
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
|
fake_uuid
|
||||||
):
|
):
|
||||||
with app_.test_request_context():
|
with app_.test_request_context():
|
||||||
with app_.test_client() as client:
|
with app_.test_client() as client:
|
||||||
@@ -143,9 +145,9 @@ def test_should_not_create_too_big_template(app_,
|
|||||||
|
|
||||||
assert resp.status_code == 200
|
assert resp.status_code == 200
|
||||||
assert (
|
assert (
|
||||||
"Content has a character count greater"
|
"Content has a character count greater"
|
||||||
" than the limit of 459"
|
" than the limit of 459"
|
||||||
) in resp.get_data(as_text=True)
|
) in resp.get_data(as_text=True)
|
||||||
|
|
||||||
|
|
||||||
def test_should_not_update_too_big_template(app_,
|
def test_should_not_update_too_big_template(app_,
|
||||||
@@ -178,9 +180,9 @@ def test_should_not_update_too_big_template(app_,
|
|||||||
|
|
||||||
assert resp.status_code == 200
|
assert resp.status_code == 200
|
||||||
assert (
|
assert (
|
||||||
"Content has a character count greater"
|
"Content has a character count greater"
|
||||||
" than the limit of 459"
|
" than the limit of 459"
|
||||||
) in resp.get_data(as_text=True)
|
) in resp.get_data(as_text=True)
|
||||||
|
|
||||||
|
|
||||||
def test_should_redirect_when_saving_a_template_email(app_,
|
def test_should_redirect_when_saving_a_template_email(app_,
|
||||||
@@ -223,18 +225,59 @@ def test_should_redirect_when_saving_a_template_email(app_,
|
|||||||
template_id, name, 'email', content, service_id, subject)
|
template_id, name, 'email', content, service_id, subject)
|
||||||
|
|
||||||
|
|
||||||
def test_should_show_delete_template_page(app_,
|
def test_should_show_delete_template_page_with_time_block(app_,
|
||||||
api_user_active,
|
api_user_active,
|
||||||
mock_login,
|
mock_login,
|
||||||
mock_get_service,
|
mock_get_service,
|
||||||
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,
|
||||||
mock_get_template_statistics_for_template,
|
fake_uuid,
|
||||||
fake_uuid):
|
mocker):
|
||||||
with app_.test_request_context():
|
with app_.test_request_context():
|
||||||
with app_.test_client() as client:
|
with app_.test_client() as client:
|
||||||
|
with freeze_time('2012-01-01 12:00:00'):
|
||||||
|
template = template_json('1234', '1234', "Test template", "sms", "Something very interesting")
|
||||||
|
notification = single_notification_json('1234', template=template)
|
||||||
|
|
||||||
|
mocker.patch('app.template_statistics_client.get_template_statistics_for_template',
|
||||||
|
return_value=notification)
|
||||||
|
|
||||||
|
with freeze_time('2012-01-01 12:10:00'):
|
||||||
|
client.login(api_user_active)
|
||||||
|
service_id = fake_uuid
|
||||||
|
template_id = fake_uuid
|
||||||
|
response = client.get(url_for(
|
||||||
|
'.delete_service_template',
|
||||||
|
service_id=service_id,
|
||||||
|
template_id=template_id))
|
||||||
|
content = response.get_data(as_text=True)
|
||||||
|
assert response.status_code == 200
|
||||||
|
assert 'Test template was last used 10 minutes ago. Are you sure you want to delete it?' in content
|
||||||
|
assert 'Are you sure' in content
|
||||||
|
assert 'Two week reminder' in content
|
||||||
|
assert 'Your vehicle tax is about to expire' in content
|
||||||
|
mock_get_service_template.assert_called_with(service_id, template_id)
|
||||||
|
|
||||||
|
|
||||||
|
def test_should_show_delete_template_page_with_never_used_block(app_,
|
||||||
|
api_user_active,
|
||||||
|
mock_login,
|
||||||
|
mock_get_service,
|
||||||
|
mock_get_service_template,
|
||||||
|
mock_get_user,
|
||||||
|
mock_get_user_by_email,
|
||||||
|
mock_has_permissions,
|
||||||
|
fake_uuid,
|
||||||
|
mocker):
|
||||||
|
with app_.test_request_context():
|
||||||
|
with app_.test_client() as client:
|
||||||
|
mocker.patch(
|
||||||
|
'app.template_statistics_client.get_template_statistics_for_template',
|
||||||
|
side_effect=HTTPError(response=Mock(status_code=404), message="Default message")
|
||||||
|
)
|
||||||
|
|
||||||
client.login(api_user_active)
|
client.login(api_user_active)
|
||||||
service_id = fake_uuid
|
service_id = fake_uuid
|
||||||
template_id = fake_uuid
|
template_id = fake_uuid
|
||||||
@@ -243,12 +286,13 @@ def test_should_show_delete_template_page(app_,
|
|||||||
service_id=service_id,
|
service_id=service_id,
|
||||||
template_id=template_id))
|
template_id=template_id))
|
||||||
|
|
||||||
content = response.get_data(as_text=True)
|
content = response.get_data(as_text=True)
|
||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
assert 'Are you sure' in content
|
assert 'Two week reminder has never been used. Are you sure you want to delete it?' in content
|
||||||
assert 'Two week reminder' in content
|
assert 'Are you sure' in content
|
||||||
assert 'Your vehicle tax is about to expire' in content
|
assert 'Two week reminder' in content
|
||||||
mock_get_service_template.assert_called_with(service_id, template_id)
|
assert 'Your vehicle tax is about to expire' in content
|
||||||
|
mock_get_service_template.assert_called_with(service_id, template_id)
|
||||||
|
|
||||||
|
|
||||||
def test_should_redirect_when_deleting_a_template(app_,
|
def test_should_redirect_when_deleting_a_template(app_,
|
||||||
@@ -294,15 +338,15 @@ def test_should_redirect_when_deleting_a_template(app_,
|
|||||||
|
|
||||||
@freeze_time('2016-01-01T15:00')
|
@freeze_time('2016-01-01T15:00')
|
||||||
def test_should_show_page_for_a_deleted_template(
|
def test_should_show_page_for_a_deleted_template(
|
||||||
app_,
|
app_,
|
||||||
api_user_active,
|
api_user_active,
|
||||||
mock_login,
|
mock_login,
|
||||||
mock_get_service,
|
mock_get_service,
|
||||||
mock_get_deleted_template,
|
mock_get_deleted_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
|
fake_uuid
|
||||||
):
|
):
|
||||||
with app_.test_request_context(), app_.test_client() as client:
|
with app_.test_request_context(), app_.test_client() as client:
|
||||||
client.login(api_user_active)
|
client.login(api_user_active)
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ from . import (
|
|||||||
notification_json,
|
notification_json,
|
||||||
invite_json,
|
invite_json,
|
||||||
sample_uuid,
|
sample_uuid,
|
||||||
generate_uuid)
|
generate_uuid, single_notification_json)
|
||||||
from app.notify_client.models import (
|
from app.notify_client.models import (
|
||||||
User,
|
User,
|
||||||
InvitedUser
|
InvitedUser
|
||||||
@@ -1086,20 +1086,8 @@ def mock_get_template_statistics(mocker, service_one, fake_uuid):
|
|||||||
def mock_get_template_statistics_for_template(mocker, service_one):
|
def mock_get_template_statistics_for_template(mocker, service_one):
|
||||||
def _get_stats(service_id, template_id):
|
def _get_stats(service_id, template_id):
|
||||||
template = template_json(service_id, template_id, "Test template", "sms", "Something very interesting")
|
template = template_json(service_id, template_id, "Test template", "sms", "Something very interesting")
|
||||||
return [
|
notification = single_notification_json(service_id, template=template)
|
||||||
{
|
return notification
|
||||||
"usage_count": 1,
|
|
||||||
"template": {
|
|
||||||
"name": template['name'],
|
|
||||||
"template_type": template['template_type'],
|
|
||||||
"id": template['id']
|
|
||||||
},
|
|
||||||
"service": template['service'],
|
|
||||||
"id": str(generate_uuid()),
|
|
||||||
"day": "2016-04-04",
|
|
||||||
"updated_at": "2016-04-04T12:00:00.000000+00:00"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
return mocker.patch(
|
return mocker.patch(
|
||||||
'app.template_statistics_client.get_template_statistics_for_template', side_effect=_get_stats)
|
'app.template_statistics_client.get_template_statistics_for_template', side_effect=_get_stats)
|
||||||
|
|||||||
Reference in New Issue
Block a user