Merge branch 'master' into convert-all-links-to-govuk-frontend

This commit is contained in:
Tom Byers
2020-02-24 10:12:58 +00:00
committed by GitHub
34 changed files with 468 additions and 135 deletions

View File

@@ -51,8 +51,8 @@ def test_csrf_returns_400(logged_in_client, mocker):
assert response.status_code == 400
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
assert page.h1.string.strip() == 'Something went wrong, please go back and try again.'
assert page.title.string.strip() == 'Bad request GOV.UK Notify'
assert page.h1.string.strip() == 'Sorry, theres a problem with GOV.UK Notify'
assert page.title.string.strip() == 'Sorry, theres a problem with the service GOV.UK Notify'
def test_csrf_redirects_to_sign_in_page_if_not_signed_in(client, mocker):
@@ -70,5 +70,5 @@ def test_405_returns_something_went_wrong_page(client, mocker):
assert response.status_code == 405
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
assert page.h1.string.strip() == 'Something went wrong, please go back and try again.'
assert page.title.string.strip() == 'Bad request GOV.UK Notify'
assert page.h1.string.strip() == 'Sorry, theres a problem with GOV.UK Notify'
assert page.title.string.strip() == 'Sorry, theres a problem with the service GOV.UK Notify'

View File

@@ -149,6 +149,7 @@ def test_accepting_invite_removes_invite_from_session(
mock_get_billable_units,
mock_get_free_sms_fragment_limit,
mock_get_inbound_sms_summary,
mock_get_returned_letter_summary_with_no_returned_letters,
fake_uuid,
user,
landing_page_title,
@@ -470,6 +471,7 @@ def test_new_invited_user_verifies_and_added_to_service(
mock_get_service_statistics,
mock_get_usage,
mock_get_free_sms_fragment_limit,
mock_get_returned_letter_summary_with_no_returned_letters,
mock_create_event,
mocker,
):

View File

@@ -143,7 +143,8 @@ def test_get_started(
mock_get_service_statistics,
mock_get_usage,
mock_get_free_sms_fragment_limit,
mock_get_inbound_sms_summary
mock_get_inbound_sms_summary,
mock_get_returned_letter_summary_with_no_returned_letters,
):
mocker.patch(
'app.template_statistics_client.get_template_statistics_for_service',
@@ -167,7 +168,8 @@ def test_get_started_is_hidden_once_templates_exist(
mock_get_service_statistics,
mock_get_usage,
mock_get_free_sms_fragment_limit,
mock_get_inbound_sms_summary
mock_get_inbound_sms_summary,
mock_get_returned_letter_summary_with_no_returned_letters,
):
mocker.patch(
'app.template_statistics_client.get_template_statistics_for_service',
@@ -184,6 +186,7 @@ def test_get_started_is_hidden_once_templates_exist(
def test_inbound_messages_not_visible_to_service_without_permissions(
client_request,
mocker,
service_one,
mock_get_service_templates_when_no_templates_exist,
mock_get_jobs,
@@ -191,7 +194,8 @@ def test_inbound_messages_not_visible_to_service_without_permissions(
mock_get_template_statistics,
mock_get_usage,
mock_get_free_sms_fragment_limit,
mock_get_inbound_sms_summary
mock_get_inbound_sms_summary,
mock_get_returned_letter_summary_with_no_returned_letters,
):
service_one['permissions'] = []
@@ -216,6 +220,7 @@ def test_inbound_messages_shows_count_of_messages_when_there_are_messages(
mock_get_usage,
mock_get_free_sms_fragment_limit,
mock_get_inbound_sms_summary,
mock_get_returned_letter_summary_with_no_returned_letters,
):
service_one['permissions'] = ['inbound_sms']
page = client_request.get(
@@ -242,6 +247,7 @@ def test_inbound_messages_shows_count_of_messages_when_there_are_no_messages(
mock_get_usage,
mock_get_free_sms_fragment_limit,
mock_get_inbound_sms_summary_with_no_messages,
mock_get_returned_letter_summary_with_no_returned_letters,
):
service_one['permissions'] = ['inbound_sms']
page = client_request.get(
@@ -472,6 +478,129 @@ def test_download_inbox_strips_formulae(
assert expected_cell in response.get_data(as_text=True).split('\r\n')[1]
def test_returned_letters_not_visible_if_service_has_no_returned_letters(
client_request,
mocker,
service_one,
mock_get_service_templates_when_no_templates_exist,
mock_get_jobs,
mock_get_service_statistics,
mock_get_template_statistics,
mock_get_usage,
mock_get_free_sms_fragment_limit,
mock_get_inbound_sms_summary,
mock_get_returned_letter_summary_with_no_returned_letters,
):
page = client_request.get(
'main.service_dashboard',
service_id=SERVICE_ONE_ID,
)
assert not page.select('#total-returned-letters')
@freeze_time('2020-01-10')
def test_returned_letters_shows_count_of_recently_returned_letters(
client_request,
mocker,
service_one,
mock_get_service_templates_when_no_templates_exist,
mock_get_jobs,
mock_get_service_statistics,
mock_get_template_statistics,
mock_get_usage,
mock_get_free_sms_fragment_limit,
mock_get_inbound_sms_summary,
):
mocker.patch(
'app.service_api_client.get_returned_letter_summary',
return_value=[
# Today (should be counted)
{
'returned_letter_count': 1000, 'reported_at': '2020-01-10'
},
# Just within the last 7 days (should be counted)
{
'returned_letter_count': 3000, 'reported_at': '2020-01-3'
},
# Just after the last 7 days (should not be counted)
{
'returned_letter_count': 2000, 'reported_at': '2020-01-2'
},
],
)
page = client_request.get(
'main.service_dashboard',
service_id=SERVICE_ONE_ID,
)
banner = page.select_one('#total-returned-letters')
assert normalize_spaces(
banner.text
) == '4,000 returned letters latest report today'
assert banner['href'] == url_for(
'main.returned_letter_summary', service_id=SERVICE_ONE_ID
)
@pytest.mark.parametrize('reporting_date, expected_message', (
('2020-02-02', (
'1 returned letter latest report today'
)),
('2020-02-01', (
'1 returned letter latest report yesterday'
)),
('2020-01-31', (
'1 returned letter latest report 2 days ago'
)),
('2020-01-26', (
'1 returned letter latest report 7 days ago'
)),
('2020-01-25', (
'0 returned letters latest report 8 days ago'
)),
('2020-01-01', (
'0 returned letters latest report 1 month ago'
)),
('2019-09-09', (
'0 returned letters latest report 4 months ago'
)),
('2010-10-10', (
'0 returned letters latest report 9 years ago'
)),
))
@freeze_time('2020-02-02')
def test_returned_letters_only_counts_recently_returned_letters(
client_request,
mocker,
service_one,
mock_get_service_templates_when_no_templates_exist,
mock_get_jobs,
mock_get_service_statistics,
mock_get_template_statistics,
mock_get_usage,
mock_get_free_sms_fragment_limit,
mock_get_inbound_sms_summary_with_no_messages,
reporting_date,
expected_message,
):
mocker.patch(
'app.service_api_client.get_returned_letter_summary',
return_value=[
{
'returned_letter_count': 1, 'reported_at': reporting_date
},
],
)
page = client_request.get(
'main.service_dashboard',
service_id=SERVICE_ONE_ID,
)
banner = page.select_one('#total-returned-letters')
assert normalize_spaces(banner.text) == expected_message
assert banner['href'] == url_for(
'main.returned_letter_summary', service_id=SERVICE_ONE_ID
)
def test_should_show_recent_templates_on_dashboard(
client_request,
mocker,
@@ -480,7 +609,8 @@ def test_should_show_recent_templates_on_dashboard(
mock_get_service_statistics,
mock_get_usage,
mock_get_free_sms_fragment_limit,
mock_get_inbound_sms_summary
mock_get_inbound_sms_summary,
mock_get_returned_letter_summary_with_no_returned_letters,
):
mock_template_stats = mocker.patch('app.template_statistics_client.get_template_statistics_for_service',
return_value=copy.deepcopy(stub_template_stats))
@@ -534,6 +664,7 @@ def test_should_not_show_recent_templates_on_dashboard_if_only_one_template_used
mock_get_usage,
mock_get_free_sms_fragment_limit,
mock_get_inbound_sms_summary,
mock_get_returned_letter_summary_with_no_returned_letters,
stats,
):
mock_template_stats = mocker.patch(
@@ -687,7 +818,8 @@ def test_should_show_upcoming_jobs_on_dashboard(
mock_get_jobs,
mock_get_usage,
mock_get_free_sms_fragment_limit,
mock_get_inbound_sms_summary
mock_get_inbound_sms_summary,
mock_get_returned_letter_summary_with_no_returned_letters,
):
page = client_request.get(
'main.service_dashboard',
@@ -738,6 +870,7 @@ def test_correct_font_size_for_big_numbers(
mock_get_jobs,
mock_get_usage,
mock_get_free_sms_fragment_limit,
mock_get_returned_letter_summary_with_no_returned_letters,
service_one,
permissions,
totals,
@@ -773,7 +906,8 @@ def test_should_show_recent_jobs_on_dashboard(
mock_get_jobs,
mock_get_usage,
mock_get_free_sms_fragment_limit,
mock_get_inbound_sms_summary
mock_get_inbound_sms_summary,
mock_get_returned_letter_summary_with_no_returned_letters,
):
page = client_request.get(
'main.service_dashboard',
@@ -981,6 +1115,7 @@ def test_menu_send_messages(
mock_get_usage,
mock_get_inbound_sms_summary,
mock_get_free_sms_fragment_limit,
mock_get_returned_letter_summary_with_no_returned_letters,
):
service_one['permissions'] = ['email', 'sms', 'letter', 'upload_letters']
@@ -1039,6 +1174,7 @@ def test_menu_manage_service(
mock_get_service_statistics,
mock_get_usage,
mock_get_inbound_sms_summary,
mock_get_returned_letter_summary_with_no_returned_letters,
mock_get_free_sms_fragment_limit,
):
with app_.test_request_context():
@@ -1070,6 +1206,7 @@ def test_menu_manage_api_keys(
mock_get_service_statistics,
mock_get_usage,
mock_get_inbound_sms_summary,
mock_get_returned_letter_summary_with_no_returned_letters,
mock_get_free_sms_fragment_limit,
):
with app_.test_request_context():
@@ -1099,6 +1236,7 @@ def test_menu_all_services_for_platform_admin_user(
mock_get_service_statistics,
mock_get_usage,
mock_get_inbound_sms_summary,
mock_get_returned_letter_summary_with_no_returned_letters,
mock_get_free_sms_fragment_limit,
):
with app_.test_request_context():
@@ -1130,7 +1268,8 @@ def test_route_for_service_permissions(
mock_get_service_statistics,
mock_get_usage,
mock_get_free_sms_fragment_limit,
mock_get_inbound_sms_summary
mock_get_inbound_sms_summary,
mock_get_returned_letter_summary_with_no_returned_letters,
):
with app_.test_request_context():
validate_route_permission(
@@ -1183,7 +1322,8 @@ def test_service_dashboard_updates_gets_dashboard_totals(
mock_get_jobs,
mock_get_usage,
mock_get_free_sms_fragment_limit,
mock_get_inbound_sms_summary
mock_get_inbound_sms_summary,
mock_get_returned_letter_summary_with_no_returned_letters,
):
mocker.patch('app.main.views.dashboard.get_dashboard_totals', return_value={
'email': {'requested': 123, 'delivered': 0, 'failed': 0},
@@ -1368,6 +1508,7 @@ def test_should_show_all_jobs_with_valid_statuses(
mock_get_jobs,
mock_get_usage,
mock_get_inbound_sms_summary,
mock_get_returned_letter_summary_with_no_returned_letters,
mock_get_free_sms_fragment_limit,
):
logged_in_client.get(url_for('main.service_dashboard', service_id=SERVICE_ONE_ID))
@@ -1397,6 +1538,7 @@ def test_org_breadcrumbs_do_not_show_if_service_has_no_org(
mock_get_jobs,
mock_get_usage,
mock_get_free_sms_fragment_limit,
mock_get_returned_letter_summary_with_no_returned_letters,
):
page = client_request.get('main.service_dashboard', service_id=SERVICE_ONE_ID)
@@ -1411,6 +1553,7 @@ def test_org_breadcrumbs_do_not_show_if_user_is_not_an_org_member(
active_caseworking_user,
client_request,
mock_get_template_folders,
mock_get_returned_letter_summary_with_no_returned_letters,
):
# active_caseworking_user is not an org member
@@ -1433,6 +1576,7 @@ def test_org_breadcrumbs_show_if_user_is_a_member_of_the_services_org(
mock_get_jobs,
mock_get_usage,
mock_get_free_sms_fragment_limit,
mock_get_returned_letter_summary_with_no_returned_letters,
active_user_with_permissions,
client_request,
):
@@ -1460,6 +1604,7 @@ def test_org_breadcrumbs_do_not_show_if_user_is_a_member_of_the_services_org_but
mock_get_jobs,
mock_get_usage,
mock_get_free_sms_fragment_limit,
mock_get_returned_letter_summary_with_no_returned_letters,
active_user_with_permissions,
client_request,
):
@@ -1484,6 +1629,7 @@ def test_org_breadcrumbs_show_if_user_is_platform_admin(
mock_get_jobs,
mock_get_usage,
mock_get_free_sms_fragment_limit,
mock_get_returned_letter_summary_with_no_returned_letters,
platform_admin_user,
platform_admin_client,
):
@@ -1515,6 +1661,7 @@ def test_should_show_usage_on_dashboard(
mock_get_jobs,
mock_get_usage,
mock_get_free_sms_fragment_limit,
mock_get_returned_letter_summary_with_no_returned_letters,
permissions,
):
service_one['permissions'] = permissions

View File

@@ -5,7 +5,7 @@ from bs4 import BeautifulSoup
from flask import url_for
from app.main.forms import FieldWithNoneOption
from tests.conftest import normalize_spaces, sample_uuid
from tests.conftest import SERVICE_ONE_ID, normalize_spaces, sample_uuid
def test_non_logged_in_user_can_see_homepage(
@@ -109,6 +109,34 @@ def test_static_pages(
request()
def test_guidance_pages_link_to_service_pages_when_signed_in(
client_request,
):
request = partial(client_request.get, 'main.edit_and_format_messages')
selector = '.list-number li a'
# Check the page loads when user is signed in
page = request()
assert page.select_one(selector)['href'] == url_for(
'main.choose_template',
service_id=SERVICE_ONE_ID,
)
# Check it still works when they dont have a recent service
with client_request.session_transaction() as session:
session['service_id'] = None
page = request()
assert not page.select_one(selector)
# Check it still works when they sign out
client_request.logout()
with client_request.session_transaction() as session:
session['service_id'] = None
session['user_id'] = None
page = request()
assert not page.select_one(selector)
@pytest.mark.parametrize('view, expected_view', [
('information_risk_management', 'security'),
('old_integration_testing', 'integration_testing'),

View File

@@ -152,22 +152,43 @@ def test_notification_status_shows_expected_back_link(
assert back_link is None
@freeze_time("2012-01-01 01:01")
@pytest.mark.parametrize('time_of_viewing_page, expected_message', (
('2012-01-01 01:01', (
"sample template was sent by Test User today at 1:01am"
)),
('2012-01-02 01:01', (
"sample template was sent by Test User yesterday at 1:01am"
)),
('2012-01-03 01:01', (
"sample template was sent by Test User on 1 January at 1:01am"
)),
('2013-01-03 01:01', (
"sample template was sent by Test User on 1 January 2012 at 1:01am"
)),
))
def test_notification_page_doesnt_link_to_template_in_tour(
mocker,
client_request,
fake_uuid,
mock_get_notification,
time_of_viewing_page,
expected_message,
):
page = client_request.get(
'main.view_notification',
service_id=SERVICE_ONE_ID,
notification_id=fake_uuid,
help=3,
)
with freeze_time('2012-01-01 01:01'):
notification = create_notification()
mocker.patch('app.notification_api_client.get_notification', return_value=notification)
with freeze_time(time_of_viewing_page):
page = client_request.get(
'main.view_notification',
service_id=SERVICE_ONE_ID,
notification_id=fake_uuid,
help=3,
)
assert normalize_spaces(page.select('main p:nth-of-type(1)')[0].text) == (
"sample template was sent by Test User on 1 January at 1:01am"
expected_message
)
assert len(page.select('main p:nth-of-type(1) a')) == 0
@@ -196,13 +217,13 @@ def test_notification_page_shows_page_for_letter_notification(
)
assert normalize_spaces(page.select('main p:nth-of-type(1)')[0].text) == (
"sample template was sent by Test User on 1 January at 1:01am"
"sample template was sent by Test User today at 1:01am"
)
assert normalize_spaces(page.select('main p:nth-of-type(2)')[0].text) == (
'Printing starts today at 5:30pm'
)
assert normalize_spaces(page.select('main p:nth-of-type(3)')[0].text) == (
'Estimated delivery date: 6 January'
'Estimated delivery date: Wednesday 6 January'
)
assert len(page.select('.letter-postage')) == 1
assert normalize_spaces(page.select_one('.letter-postage').text) == (
@@ -226,17 +247,62 @@ def test_notification_page_shows_page_for_letter_notification(
assert mock_page_count.call_args_list[0][1]['values'] == {'name': 'Jo'}
@freeze_time("2020-01-01 00:00")
def test_notification_page_shows_uploaded_letter(
client_request,
mocker,
fake_uuid,
):
mocker.patch(
'app.main.views.notifications.view_letter_notification_as_preview',
return_value=(b'foo', {
'message': '',
'invalid_pages': '[]',
'page_count': '1'
})
)
mocker.patch(
'app.main.views.notifications.pdf_page_count',
return_value=1
)
mocker.patch(
'app.main.views.notifications.get_page_count_for_letter',
return_value=1,
)
notification = create_notification(
notification_status='created',
template_type='letter',
is_precompiled_letter=True,
sent_one_off=True,
)
mocker.patch('app.notification_api_client.get_notification', return_value=notification)
page = client_request.get(
'main.view_notification',
service_id=SERVICE_ONE_ID,
notification_id=fake_uuid,
)
assert normalize_spaces(page.select('main p:nth-of-type(1)')[0].text) == (
'Uploaded by Test User yesterday at midnight'
)
assert normalize_spaces(page.select('main p:nth-of-type(2)')[0].text) == (
'Printing starts today at 5:30pm'
)
@freeze_time("2016-01-01 01:01")
@pytest.mark.parametrize('is_precompiled_letter, expected_p1, expected_p2, expected_postage', (
(
True,
'Provided as PDF on 1 January at 1:01am',
'Provided as PDF today at 1:01am',
'This letter passed our checks, but we will not print it because you used a test key.',
'Postage: second class'
),
(
False,
'sample template was sent on 1 January at 1:01am',
'sample template was sent today at 1:01am',
'We will not print this letter because you used a test key.',
'Postage: second class',
),
@@ -377,7 +443,7 @@ def test_notification_page_shows_cancelled_or_failed_letter(
)
assert normalize_spaces(page.select('main p')[0].text) == (
"sample template was sent by Test User on 1 January at 1:01am"
"sample template was sent by Test User today at 1:01am"
)
assert normalize_spaces(page.select('main p')[1].text) == (
expected_message
@@ -473,7 +539,9 @@ def test_notification_page_shows_page_for_first_class_letter_notification(
)
assert normalize_spaces(page.select('main p:nth-of-type(2)')[0].text) == 'Printing starts tomorrow at 5:30pm'
assert normalize_spaces(page.select('main p:nth-of-type(3)')[0].text) == 'Estimated delivery date: 5 January'
assert normalize_spaces(page.select('main p:nth-of-type(3)')[0].text) == (
'Estimated delivery date: Tuesday 5 January'
)
assert normalize_spaces(page.select_one('.letter-postage').text) == (
'Postage: first class'
)

View File

@@ -88,12 +88,12 @@ def test_returned_letters_page(
assert [
'Template name Originally sent',
'Example template Reference ABC123 Originally sent 24 December 2019',
'Example template Sent from Example spreadsheet.xlsx Originally sent 24 December 2019',
'Example template No reference provided Originally sent 24 December 2019',
'Example precompiled.pdf Reference DEF456 Originally sent 24 December 2019',
'Example one-off.pdf No reference provided Originally sent 24 December 2019',
'Provided as PDF Reference XYZ999 Originally sent 24 December 2019',
'Example template Reference ABC123 Sent 24 December 2019',
'Example template Sent from Example spreadsheet.xlsx Sent 24 December 2019',
'Example template No reference provided Sent 24 December 2019',
'Example precompiled.pdf Reference DEF456 Sent 24 December 2019',
'Example one-off.pdf No reference provided Sent 24 December 2019',
'Provided as PDF Reference XYZ999 Sent 24 December 2019',
] == [
normalize_spaces(row.text) for row in page.select('tr')
]

View File

@@ -31,6 +31,7 @@ def test_sign_out_user(
mock_get_usage,
mock_get_free_sms_fragment_limit,
mock_get_inbound_sms_summary,
mock_get_returned_letter_summary_with_no_returned_letters,
):
with client_request.session_transaction() as session:
assert session.get('user_id') is not None

View File

@@ -504,6 +504,7 @@ def test_uploaded_letter_preview_image_400s_for_bad_page_type(
file_id=fake_uuid,
service_id=SERVICE_ONE_ID,
page='foo',
_test_page_title=False,
_expected_status=400,
)