diff --git a/app/templates/views/templates/template.html b/app/templates/views/templates/template.html
index f18226a98..b1f827535 100644
--- a/app/templates/views/templates/template.html
+++ b/app/templates/views/templates/template.html
@@ -24,7 +24,7 @@
{% if template._template.updated_at %}
-
Last edited {{ template._template.updated_at|format_datetime_relative }}
+
Last edited {{ template._template.updated_at|format_delta }}
See previous versions
diff --git a/requirements.txt b/requirements.txt
index 3442d47e3..7b41e2bec 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -32,3 +32,4 @@ awscli>=1.11,<1.12
awscli-cwlogs>=1.4,<1.5
git+https://github.com/alphagov/notifications-utils.git@15.0.3#egg=notifications-utils==15.0.3
+
diff --git a/tests/app/main/views/test_dashboard.py b/tests/app/main/views/test_dashboard.py
index ec1eb7b5f..17c51ce59 100644
--- a/tests/app/main/views/test_dashboard.py
+++ b/tests/app/main/views/test_dashboard.py
@@ -1,8 +1,8 @@
-from datetime import datetime
from functools import partial
import copy
-from flask import url_for
+from unittest.mock import call, ANY
+from flask import url_for
import pytest
from bs4 import BeautifulSoup
from freezegun import freeze_time
@@ -14,6 +14,7 @@ from app.main.views.dashboard import (
aggregate_status_types,
format_template_stats_to_list,
get_tuples_of_financial_years,
+ get_dashboard_partials
)
from tests import validate_route_permission
@@ -39,14 +40,8 @@ stub_template_stats = [
def test_get_started(
logged_in_client,
mocker,
- api_user_active,
- mock_get_service,
mock_get_service_templates_when_no_templates_exist,
- mock_get_user,
- mock_get_user_by_email,
- mock_login,
mock_get_jobs,
- mock_has_permissions,
mock_get_detailed_service,
mock_get_usage,
):
@@ -63,14 +58,8 @@ def test_get_started(
def test_get_started_is_hidden_once_templates_exist(
logged_in_client,
mocker,
- api_user_active,
- mock_get_service,
mock_get_service_templates,
- mock_get_user,
- mock_get_user_by_email,
- mock_login,
mock_get_jobs,
- mock_has_permissions,
mock_get_detailed_service,
mock_get_usage,
):
@@ -86,14 +75,8 @@ def test_get_started_is_hidden_once_templates_exist(
def test_should_show_recent_templates_on_dashboard(
logged_in_client,
mocker,
- api_user_active,
- mock_get_service,
mock_get_service_templates,
- mock_get_user,
- mock_get_user_by_email,
- mock_login,
mock_get_jobs,
- mock_has_permissions,
mock_get_detailed_service,
mock_get_usage,
):
@@ -130,13 +113,7 @@ def test_should_show_recent_templates_on_dashboard(
])
def test_should_show_monthly_breakdown_of_template_usage(
logged_in_client,
- mocker,
- api_user_active,
- mock_get_service,
mock_get_monthly_template_statistics,
- mock_get_user,
- mock_get_user_by_email,
- mock_has_permissions,
partial_url,
):
response = logged_in_client.get(
@@ -162,17 +139,10 @@ def test_should_show_monthly_breakdown_of_template_usage(
@freeze_time("2016-01-01 11:09:00.061258")
def test_should_show_upcoming_jobs_on_dashboard(
logged_in_client,
- mocker,
- api_user_active,
- mock_get_service,
mock_get_service_templates,
- mock_get_user,
- mock_get_user_by_email,
- mock_login,
mock_get_template_statistics,
mock_get_detailed_service,
mock_get_jobs,
- mock_has_permissions,
mock_get_usage,
):
response = logged_in_client.get(url_for('main.service_dashboard', service_id=SERVICE_ONE_ID))
@@ -199,17 +169,10 @@ def test_should_show_upcoming_jobs_on_dashboard(
@freeze_time("2016-01-01 11:09:00.061258")
def test_should_show_recent_jobs_on_dashboard(
logged_in_client,
- mocker,
- api_user_active,
- mock_get_service,
mock_get_service_templates,
- mock_get_user,
- mock_get_user_by_email,
- mock_login,
mock_get_template_statistics,
mock_get_detailed_service,
mock_get_jobs,
- mock_has_permissions,
mock_get_usage,
):
response = logged_in_client.get(url_for('main.service_dashboard', service_id=SERVICE_ONE_ID))
@@ -464,16 +427,13 @@ def test_aggregate_template_stats():
def test_service_dashboard_updates_gets_dashboard_totals(
mocker,
logged_in_client,
- active_user_with_permissions,
- service_one,
- mock_get_user,
mock_get_service_templates,
mock_get_template_statistics,
mock_get_detailed_service,
mock_get_jobs,
mock_get_usage,
):
- dashboard_totals = mocker.patch('app.main.views.dashboard.get_dashboard_totals', return_value={
+ mocker.patch('app.main.views.dashboard.get_dashboard_totals', return_value={
'email': {'requested': 123, 'delivered': 0, 'failed': 0},
'sms': {'requested': 456, 'delivered': 0, 'failed': 0}
})
@@ -487,8 +447,6 @@ def test_service_dashboard_updates_gets_dashboard_totals(
assert '123' in numbers
assert '456' in numbers
- table_rows = page.find_all('tbody')[0].find_all('tr')
-
def test_get_dashboard_totals_adds_percentages():
stats = {
@@ -675,3 +633,28 @@ def test_get_tuples_of_financial_years_defaults_to_2015():
lambda year: 'http://example.com?year={}'.format(year),
end=2040,
))[0]
+
+
+@freeze_time("2016-01-01 11:09:00.061258")
+def test_should_show_all_jobs_with_valid_statuses(
+ logged_in_client,
+ mock_get_template_statistics,
+ mock_get_detailed_service,
+ mock_get_jobs,
+ mock_get_usage,
+):
+ get_dashboard_partials(service_id=SERVICE_ONE_ID)
+
+ first_call = mock_get_jobs.call_args_list[0]
+ # first call - scheduled jobs only
+ assert first_call == call(ANY, statuses=['scheduled'])
+ # second call - everything but scheduled and cancelled
+ second_call = mock_get_jobs.call_args_list[1]
+ assert second_call == call(ANY, limit_days=ANY, statuses={
+ 'pending',
+ 'in progress',
+ 'finished',
+ 'sending limits exceeded',
+ 'ready to send',
+ 'sent to dvla'
+ })
diff --git a/tests/app/main/views/test_send.py b/tests/app/main/views/test_send.py
index 31cffcb5f..f85470f4a 100644
--- a/tests/app/main/views/test_send.py
+++ b/tests/app/main/views/test_send.py
@@ -15,6 +15,11 @@ from app.main.views.send import get_check_messages_back_url
from tests import validate_route_permission, template_json
from tests.app.test_utils import normalize_spaces
+from tests.conftest import (
+ mock_get_service_template,
+ mock_get_service_template_with_placeholders,
+ mock_get_service_letter_template,
+)
template_types = ['email', 'sms']
@@ -688,18 +693,41 @@ def test_route_invalid_permissions(
@pytest.mark.parametrize(
- 'extra_args,expected_url',
+ 'template_mock, extra_args, expected_url',
[
(
+ mock_get_service_template,
dict(),
+ partial(url_for, '.send_messages')
+ ),
+ (
+ mock_get_service_template_with_placeholders,
+ dict(),
+ partial(url_for, '.send_messages')
+ ),
+ (
+ mock_get_service_template,
+ dict(from_test=True),
+ partial(url_for, '.view_template')
+ ),
+ (
+ mock_get_service_letter_template, # No placeholders
+ dict(from_test=True),
partial(url_for, '.send_test')
),
(
- dict(help='0'),
+ mock_get_service_template_with_placeholders,
+ dict(from_test=True),
partial(url_for, '.send_test')
),
(
- dict(help='2'),
+ mock_get_service_template_with_placeholders,
+ dict(help='0', from_test=True),
+ partial(url_for, '.send_test')
+ ),
+ (
+ mock_get_service_template_with_placeholders,
+ dict(help='2', from_test=True),
partial(url_for, '.send_test', help='1')
)
]
@@ -711,14 +739,16 @@ def test_check_messages_back_link(
mock_get_user_by_email,
mock_get_users_by_service,
mock_get_service,
- mock_get_service_template_with_placeholders,
mock_has_permissions,
mock_get_detailed_service_for_today,
mock_s3_download,
fake_uuid,
+ mocker,
+ template_mock,
extra_args,
expected_url
):
+ template_mock(mocker)
with logged_in_client.session_transaction() as session:
session['upload_data'] = {'original_file_name': 'valid.csv',
'template_id': fake_uuid,
@@ -729,7 +759,6 @@ def test_check_messages_back_link(
service_id=fake_uuid,
upload_id=fake_uuid,
template_type='sms',
- from_test=True,
**extra_args
))
assert response.status_code == 200
diff --git a/tests/app/main/views/test_templates.py b/tests/app/main/views/test_templates.py
index 71ea2fb8a..d4777468f 100644
--- a/tests/app/main/views/test_templates.py
+++ b/tests/app/main/views/test_templates.py
@@ -8,6 +8,7 @@ from flask import url_for
from freezegun import freeze_time
from notifications_python_client.errors import HTTPError
from tests.conftest import service_one as create_sample_service
+from tests.conftest import mock_get_service_email_template, mock_get_service_letter_template
from tests import validate_route_permission, template_json, single_notification_json
from tests.app.test_utils import normalize_spaces
@@ -313,18 +314,43 @@ def test_should_403_when_create_template_with_process_type_of_priority_for_non_p
mock_update_service_template.called == 0
+@pytest.mark.parametrize('template_mock, expected_paragraphs', [
+ (
+ mock_get_service_email_template,
+ [
+ 'You removed ((date))',
+ 'You added ((name))',
+ 'When you send messages using this template you’ll need 3 columns of data:',
+ ]
+ ),
+ (
+ mock_get_service_letter_template,
+ [
+ 'You removed ((date))',
+ 'You added ((name))',
+ 'When you send messages using this template you’ll need 9 columns of data:',
+ ]
+ ),
+])
def test_should_show_interstitial_when_making_breaking_change(
logged_in_client,
api_user_active,
mock_login,
- mock_get_service_email_template,
mock_update_service_template,
mock_get_user,
mock_get_service,
mock_get_user_by_email,
mock_has_permissions,
fake_uuid,
+ mocker,
+ template_mock,
+ expected_paragraphs,
):
+ template_mock(
+ mocker,
+ subject="Your ((thing)) is due soon",
+ content="Your vehicle tax expires on ((date))",
+ )
service_id = fake_uuid
template_id = fake_uuid
response = logged_in_client.post(
@@ -346,11 +372,7 @@ def test_should_show_interstitial_when_making_breaking_change(
assert page.find('a', {'class': 'page-footer-back-link'})['href'] == url_for(".edit_service_template",
service_id=service_id,
template_id=template_id)
- for index, p in enumerate([
- 'You removed ((date))',
- 'You added ((name))',
- 'When you send messages using this template you’ll need 3 columns of data:',
- ]):
+ for index, p in enumerate(expected_paragraphs):
assert normalize_spaces(page.select('main p')[index].text) == p
for key, value in {
diff --git a/tests/conftest.py b/tests/conftest.py
index b622768e2..7805b6568 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -336,15 +336,15 @@ def mock_get_service_template_with_placeholders(mocker):
@pytest.fixture(scope='function')
-def mock_get_service_email_template(mocker):
+def mock_get_service_email_template(mocker, content=None, subject=None):
def _get(service_id, template_id, version=None):
template = template_json(
service_id,
template_id,
"Two week reminder",
"email",
- "Your vehicle tax expires on ((date))",
- "Your ((thing)) is due soon"
+ content or "Your vehicle tax expires on ((date))",
+ subject or "Your ((thing)) is due soon",
)
return {'data': template}
@@ -354,30 +354,24 @@ def mock_get_service_email_template(mocker):
@pytest.fixture(scope='function')
def mock_get_service_email_template_without_placeholders(mocker):
- def _create(service_id, template_id):
- template = template_json(
- service_id,
- template_id,
- "Two week reminder",
- "email",
- "Your vehicle tax expires soon",
- "Your thing is due soon"
- )
- return {'data': template}
-
- return mocker.patch(
- 'app.service_api_client.get_service_template', side_effect=_create)
+ return mock_get_service_email_template(
+ mocker,
+ content="Your vehicle tax expires soon",
+ subject="Your thing is due soon",
+ )
@pytest.fixture(scope='function')
-def mock_get_service_letter_template(mocker):
+def mock_get_service_letter_template(mocker, content=None, subject=None):
def _create(service_id, template_id):
template = template_json(
service_id,
template_id,
"Two week reminder",
"letter",
- "Template
content with & entity", "Subject")
+ content or "Template
content with & entity",
+ subject or "Subject",
+ )
return {'data': template}
return mocker.patch(