2019-10-31 09:43:16 +00:00
|
|
|
|
from functools import partial
|
2019-10-31 10:53:45 +00:00
|
|
|
|
|
2016-04-19 13:51:16 +01:00
|
|
|
|
import pytest
|
2017-11-14 17:25:32 +00:00
|
|
|
|
from bs4 import BeautifulSoup
|
2016-04-26 10:32:26 +01:00
|
|
|
|
from flask import url_for
|
2020-05-26 17:39:25 +01:00
|
|
|
|
from freezegun import freeze_time
|
2018-04-25 14:12:58 +01:00
|
|
|
|
|
2020-02-20 15:11:10 +00:00
|
|
|
|
from tests.conftest import SERVICE_ONE_ID, normalize_spaces, sample_uuid
|
2016-01-22 17:24:14 +00:00
|
|
|
|
|
|
|
|
|
|
|
2017-11-14 17:25:32 +00:00
|
|
|
|
def test_non_logged_in_user_can_see_homepage(
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request,
|
2019-04-10 17:20:51 +01:00
|
|
|
|
mock_get_service_and_organisation_counts,
|
2017-11-14 17:25:32 +00:00
|
|
|
|
):
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request.logout()
|
|
|
|
|
|
page = client_request.get('main.index', _test_page_title=False)
|
2017-11-14 17:25:32 +00:00
|
|
|
|
|
2018-01-18 16:38:15 +00:00
|
|
|
|
assert page.h1.text.strip() == (
|
2023-05-08 10:49:30 -04:00
|
|
|
|
'Send text messages to your users'
|
2018-01-18 16:38:15 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
2023-06-06 15:28:24 -04:00
|
|
|
|
assert page.select_one('a.usa-button.usa-button--big')['href'] == url_for(
|
2020-01-07 17:47:17 +00:00
|
|
|
|
'main.register'
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2018-01-18 16:38:15 +00:00
|
|
|
|
assert page.select_one('meta[name=description]')['content'].strip() == (
|
2023-05-08 10:49:30 -04:00
|
|
|
|
'U.S. Notify lets you send text messages '
|
|
|
|
|
|
'to your users. Try it now if you work in federal, state, or local government.'
|
2017-11-14 17:25:32 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
2023-06-06 15:28:24 -04:00
|
|
|
|
assert normalize_spaces(page.select_one('#whos-using-notify').text) == (
|
2023-06-08 13:12:00 -04:00
|
|
|
|
'Who’s using U.S. Notify ' # Hiding this next area for the pilot
|
|
|
|
|
|
# Hiding this next area for the pilot
|
|
|
|
|
|
# 'See the list of services and organizations. '
|
2023-06-06 15:28:24 -04:00
|
|
|
|
'There are 111 Organizations and 9,999 Services using Notify.'
|
|
|
|
|
|
)
|
2023-06-01 12:46:19 -04:00
|
|
|
|
|
2023-06-08 13:12:00 -04:00
|
|
|
|
assert page.select_one('#whos-using-notify a') is None
|
2019-04-10 17:20:51 +01:00
|
|
|
|
|
2017-11-14 17:25:32 +00:00
|
|
|
|
|
2018-03-08 16:51:53 +00:00
|
|
|
|
def test_logged_in_user_redirects_to_choose_account(
|
2019-03-26 12:35:32 +00:00
|
|
|
|
client_request,
|
2017-02-03 10:42:01 +00:00
|
|
|
|
api_user_active,
|
|
|
|
|
|
mock_get_user,
|
|
|
|
|
|
mock_get_user_by_email,
|
|
|
|
|
|
mock_login,
|
|
|
|
|
|
):
|
2019-03-26 12:35:32 +00:00
|
|
|
|
client_request.get(
|
|
|
|
|
|
'main.index',
|
|
|
|
|
|
_expected_status=302,
|
|
|
|
|
|
)
|
|
|
|
|
|
client_request.get(
|
|
|
|
|
|
'main.sign_in',
|
|
|
|
|
|
_expected_status=302,
|
2022-05-27 14:46:35 +01:00
|
|
|
|
_expected_redirect=url_for('main.show_accounts_or_dashboard')
|
2019-03-26 12:35:32 +00:00
|
|
|
|
)
|
2016-09-07 10:49:57 +01:00
|
|
|
|
|
|
|
|
|
|
|
2020-05-26 17:47:43 +01:00
|
|
|
|
def test_robots(client_request):
|
|
|
|
|
|
client_request.get_url('/robots.txt', _expected_status=404)
|
2018-08-29 15:41:53 +01:00
|
|
|
|
|
|
|
|
|
|
|
2020-05-26 17:39:25 +01:00
|
|
|
|
@pytest.mark.parametrize('endpoint, kwargs', (
|
|
|
|
|
|
('sign_in', {}),
|
|
|
|
|
|
('support', {}),
|
|
|
|
|
|
('support_public', {}),
|
|
|
|
|
|
('triage', {}),
|
|
|
|
|
|
('feedback', {'ticket_type': 'ask-question-give-feedback'}),
|
|
|
|
|
|
('feedback', {'ticket_type': 'general'}),
|
|
|
|
|
|
('feedback', {'ticket_type': 'report-problem'}),
|
|
|
|
|
|
('bat_phone', {}),
|
|
|
|
|
|
('thanks', {}),
|
|
|
|
|
|
('register', {}),
|
2020-05-26 17:45:55 +01:00
|
|
|
|
('features_email', {}),
|
2020-05-26 17:39:25 +01:00
|
|
|
|
pytest.param('index', {}, marks=pytest.mark.xfail(raises=AssertionError)),
|
|
|
|
|
|
))
|
|
|
|
|
|
@freeze_time('2012-12-12 12:12') # So we don’t go out of business hours
|
2020-05-27 09:03:14 +01:00
|
|
|
|
def test_hiding_pages_from_search_engines(
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request,
|
2020-05-27 09:03:14 +01:00
|
|
|
|
mock_get_service_and_organisation_counts,
|
|
|
|
|
|
endpoint,
|
|
|
|
|
|
kwargs,
|
|
|
|
|
|
):
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request.logout()
|
|
|
|
|
|
response = client_request.get_response(f'main.{endpoint}', **kwargs)
|
2020-05-27 09:03:14 +01:00
|
|
|
|
assert 'X-Robots-Tag' in response.headers
|
|
|
|
|
|
assert response.headers['X-Robots-Tag'] == 'noindex'
|
2022-01-04 15:40:42 +00:00
|
|
|
|
|
2020-05-27 09:03:14 +01:00
|
|
|
|
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
|
2020-05-26 17:39:25 +01:00
|
|
|
|
assert page.select_one('meta[name=robots]')['content'] == 'noindex'
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-09-07 10:49:57 +01:00
|
|
|
|
@pytest.mark.parametrize('view', [
|
2023-05-03 15:33:27 -04:00
|
|
|
|
'privacy', 'pricing', 'terms', 'roadmap',
|
2019-09-05 16:24:40 +01:00
|
|
|
|
'features', 'documentation', 'security',
|
2019-04-18 13:06:39 +01:00
|
|
|
|
'message_status', 'features_email', 'features_sms',
|
2022-12-05 15:33:44 -05:00
|
|
|
|
'how_to_pay', 'get_started',
|
2020-01-24 15:57:29 +00:00
|
|
|
|
'guidance_index', 'branding_and_customisation',
|
|
|
|
|
|
'create_and_send_messages', 'edit_and_format_messages',
|
2022-12-05 15:33:44 -05:00
|
|
|
|
'send_files_by_email',
|
2021-08-27 11:44:19 +01:00
|
|
|
|
'billing_details',
|
2016-09-07 10:49:57 +01:00
|
|
|
|
])
|
2017-02-03 12:07:21 +00:00
|
|
|
|
def test_static_pages(
|
2017-12-01 09:46:46 +00:00
|
|
|
|
client_request,
|
2019-04-04 11:12:53 +01:00
|
|
|
|
mock_get_organisation_by_domain,
|
2017-02-03 12:07:21 +00:00
|
|
|
|
view,
|
|
|
|
|
|
):
|
2019-10-31 09:43:16 +00:00
|
|
|
|
request = partial(client_request.get, 'main.{}'.format(view))
|
|
|
|
|
|
|
|
|
|
|
|
# Check the page loads when user is signed in
|
|
|
|
|
|
page = request()
|
2017-11-14 17:25:32 +00:00
|
|
|
|
assert not page.select_one('meta[name=description]')
|
|
|
|
|
|
|
2019-10-31 09:43:16 +00:00
|
|
|
|
# Check it still works when they don’t have a recent service
|
|
|
|
|
|
with client_request.session_transaction() as session:
|
|
|
|
|
|
session['service_id'] = None
|
|
|
|
|
|
request()
|
|
|
|
|
|
|
|
|
|
|
|
# Check it still works when they sign out
|
2019-10-17 16:15:28 +01:00
|
|
|
|
client_request.logout()
|
|
|
|
|
|
with client_request.session_transaction() as session:
|
|
|
|
|
|
session['service_id'] = None
|
|
|
|
|
|
session['user_id'] = None
|
2019-10-31 09:43:16 +00:00
|
|
|
|
request()
|
2019-10-17 16:15:28 +01:00
|
|
|
|
|
2017-08-30 15:22:26 +01:00
|
|
|
|
|
2020-02-20 15:11:10 +00:00
|
|
|
|
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 don’t 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)
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-11-28 11:56:30 +00:00
|
|
|
|
@pytest.mark.parametrize('view, expected_view', [
|
|
|
|
|
|
('information_risk_management', 'security'),
|
|
|
|
|
|
('old_integration_testing', 'integration_testing'),
|
|
|
|
|
|
('old_roadmap', 'roadmap'),
|
2017-11-28 12:00:12 +00:00
|
|
|
|
('information_risk_management', 'security'),
|
|
|
|
|
|
('old_terms', 'terms'),
|
|
|
|
|
|
('information_security', 'using_notify'),
|
|
|
|
|
|
('old_using_notify', 'using_notify'),
|
2019-04-11 12:00:37 +01:00
|
|
|
|
('delivery_and_failure', 'message_status'),
|
2019-09-05 16:24:40 +01:00
|
|
|
|
('callbacks', 'documentation'),
|
2017-11-28 11:56:30 +00:00
|
|
|
|
])
|
|
|
|
|
|
def test_old_static_pages_redirect(
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request,
|
2017-11-28 11:56:30 +00:00
|
|
|
|
view,
|
|
|
|
|
|
expected_view
|
|
|
|
|
|
):
|
2022-01-04 15:40:42 +00:00
|
|
|
|
client_request.logout()
|
|
|
|
|
|
client_request.get(
|
|
|
|
|
|
'main.{}'.format(view),
|
|
|
|
|
|
_expected_status=301,
|
|
|
|
|
|
_expected_redirect=url_for(
|
|
|
|
|
|
'main.{}'.format(expected_view),
|
|
|
|
|
|
),
|
2017-11-28 11:56:30 +00:00
|
|
|
|
)
|
2018-03-08 12:12:18 +00:00
|
|
|
|
|
|
|
|
|
|
|
2019-05-09 16:31:01 +01:00
|
|
|
|
def test_message_status_page_contains_message_status_ids(client_request):
|
|
|
|
|
|
# The 'email-statuses' and 'sms-statuses' id are linked to when we display a message status,
|
|
|
|
|
|
# so this test ensures we don't accidentally remove them
|
|
|
|
|
|
page = client_request.get('main.message_status')
|
|
|
|
|
|
|
2022-11-28 12:21:44 -05:00
|
|
|
|
# email-statuses is commented out in view
|
|
|
|
|
|
# assert page.find(id='email-statuses')
|
2022-01-20 15:08:02 +00:00
|
|
|
|
assert page.find(id='text-message-statuses')
|
2019-05-09 16:31:01 +01:00
|
|
|
|
|
|
|
|
|
|
|
2021-10-20 11:39:05 +01:00
|
|
|
|
def test_message_status_page_contains_link_to_support(client_request):
|
|
|
|
|
|
page = client_request.get('main.message_status')
|
2022-01-20 15:08:02 +00:00
|
|
|
|
sms_status_table = page.find(id='text-message-statuses').findNext('tbody')
|
2021-10-20 11:39:05 +01:00
|
|
|
|
|
|
|
|
|
|
temp_fail_details_cell = sms_status_table.select_one('tr:nth-child(4) > td:nth-child(2)')
|
|
|
|
|
|
assert temp_fail_details_cell.find('a').attrs['href'] == url_for('main.support')
|
|
|
|
|
|
|
|
|
|
|
|
|
2019-04-11 12:00:37 +01:00
|
|
|
|
def test_old_using_notify_page(client_request):
|
|
|
|
|
|
client_request.get('main.using_notify', _expected_status=410)
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-06-06 15:28:24 -04:00
|
|
|
|
# def test_old_integration_testing_page(
|
|
|
|
|
|
# client_request,
|
|
|
|
|
|
# ):
|
|
|
|
|
|
# page = client_request.get(
|
|
|
|
|
|
# 'main.integration_testing',
|
|
|
|
|
|
# _expected_status=410,
|
|
|
|
|
|
# )
|
|
|
|
|
|
# assert normalize_spaces(page.select_one('.grid-row').text) == (
|
|
|
|
|
|
# 'Integration testing '
|
|
|
|
|
|
# 'This information has moved. '
|
|
|
|
|
|
# 'Refer to the documentation for the client library you are using.'
|
|
|
|
|
|
# )
|
|
|
|
|
|
# assert page.select_one('.grid-row a')['href'] == url_for(
|
|
|
|
|
|
# 'main.documentation'
|
|
|
|
|
|
# )
|
2018-11-06 17:24:30 +00:00
|
|
|
|
|
|
|
|
|
|
|
2019-07-12 09:03:35 +01:00
|
|
|
|
def test_terms_page_has_correct_content(client_request):
|
2018-03-16 11:03:30 +00:00
|
|
|
|
terms_page = client_request.get('main.terms')
|
2019-07-12 09:03:35 +01:00
|
|
|
|
assert normalize_spaces(terms_page.select('main p')[0].text) == (
|
2022-12-06 11:03:47 -05:00
|
|
|
|
'These terms apply to your service’s use of U.S. Notify. '
|
2019-07-12 09:03:35 +01:00
|
|
|
|
'You must be the service manager to accept them.'
|
|
|
|
|
|
)
|
2018-11-29 13:06:10 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_css_is_served_from_correct_path(client_request):
|
|
|
|
|
|
|
2019-04-04 11:12:53 +01:00
|
|
|
|
page = client_request.get('main.documentation') # easy static page
|
2018-11-29 13:06:10 +00:00
|
|
|
|
|
|
|
|
|
|
for index, link in enumerate(
|
|
|
|
|
|
page.select('link[rel=stylesheet]')
|
|
|
|
|
|
):
|
|
|
|
|
|
assert link['href'].startswith([
|
|
|
|
|
|
'https://static.example.com/stylesheets/main.css?',
|
2019-10-22 20:01:30 +01:00
|
|
|
|
'https://static.example.com/stylesheets/print.css?',
|
2023-06-06 15:28:24 -04:00
|
|
|
|
'https://static.example.com/css/styles.css?',
|
2018-11-29 13:06:10 +00:00
|
|
|
|
][index])
|
2018-12-05 10:30:44 +00:00
|
|
|
|
|
|
|
|
|
|
|
2020-01-06 11:40:12 +00:00
|
|
|
|
def test_resources_that_use_asset_path_variable_have_correct_path(client_request):
|
|
|
|
|
|
|
|
|
|
|
|
page = client_request.get('main.documentation') # easy static page
|
|
|
|
|
|
|
2023-06-06 15:28:24 -04:00
|
|
|
|
logo_svg_fallback = page.select_one('.usa-flag-logo')
|
2020-01-06 11:40:12 +00:00
|
|
|
|
|
2023-06-06 15:28:24 -04:00
|
|
|
|
assert logo_svg_fallback['src'].startswith('https://static.example.com/images/us-notify-color.png')
|
2020-01-06 11:40:12 +00:00
|
|
|
|
|
|
|
|
|
|
|
2018-12-05 10:30:44 +00:00
|
|
|
|
@pytest.mark.parametrize('extra_args, email_branding_retrieved', (
|
|
|
|
|
|
(
|
|
|
|
|
|
{},
|
|
|
|
|
|
False,
|
|
|
|
|
|
),
|
|
|
|
|
|
(
|
|
|
|
|
|
{'branding_style': '__NONE__'},
|
|
|
|
|
|
False,
|
|
|
|
|
|
),
|
|
|
|
|
|
(
|
|
|
|
|
|
{'branding_style': sample_uuid()},
|
|
|
|
|
|
True,
|
|
|
|
|
|
),
|
|
|
|
|
|
))
|
|
|
|
|
|
def test_email_branding_preview(
|
|
|
|
|
|
client_request,
|
|
|
|
|
|
mock_get_email_branding,
|
|
|
|
|
|
extra_args,
|
|
|
|
|
|
email_branding_retrieved,
|
|
|
|
|
|
):
|
2020-09-30 11:29:13 +01:00
|
|
|
|
page = client_request.get(
|
2018-12-05 10:30:44 +00:00
|
|
|
|
'main.email_template',
|
|
|
|
|
|
_test_page_title=False,
|
|
|
|
|
|
**extra_args
|
|
|
|
|
|
)
|
2020-09-30 11:29:13 +01:00
|
|
|
|
assert page.title.text == 'Email branding preview'
|
2018-12-05 10:30:44 +00:00
|
|
|
|
assert mock_get_email_branding.called is email_branding_retrieved
|
2019-02-15 14:47:39 +00:00
|
|
|
|
|
|
|
|
|
|
|
2020-12-29 13:38:27 +00:00
|
|
|
|
def test_font_preload(
|
|
|
|
|
|
client_request,
|
|
|
|
|
|
mock_get_service_and_organisation_counts,
|
|
|
|
|
|
):
|
|
|
|
|
|
client_request.logout()
|
|
|
|
|
|
page = client_request.get('main.index', _test_page_title=False)
|
|
|
|
|
|
|
|
|
|
|
|
preload_tags = page.select('link[rel=preload][as=font][type="font/woff2"][crossorigin]')
|
|
|
|
|
|
|
2021-02-04 15:21:29 +00:00
|
|
|
|
assert len(preload_tags) == 4, 'Run `npm run build` to copy fonts into app/static/fonts/'
|
2020-12-29 13:38:27 +00:00
|
|
|
|
|
|
|
|
|
|
for element in preload_tags:
|
|
|
|
|
|
assert element['href'].startswith('https://static.example.com/fonts/')
|
|
|
|
|
|
assert element['href'].endswith('.woff2')
|
2022-04-28 10:48:44 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize('current_date, expected_rate', (
|
|
|
|
|
|
('2022-05-01', '1.72'),
|
|
|
|
|
|
))
|
2022-10-18 15:27:13 +00:00
|
|
|
|
@pytest.mark.skip(reason="Currently hidden for TTS")
|
2022-04-28 10:48:44 +01:00
|
|
|
|
def test_sms_price(
|
|
|
|
|
|
client_request,
|
|
|
|
|
|
mock_get_service_and_organisation_counts,
|
|
|
|
|
|
current_date,
|
|
|
|
|
|
expected_rate,
|
|
|
|
|
|
):
|
|
|
|
|
|
client_request.logout()
|
|
|
|
|
|
|
|
|
|
|
|
with freeze_time(current_date):
|
|
|
|
|
|
home_page = client_request.get('main.index', _test_page_title=False)
|
|
|
|
|
|
pricing_page = client_request.get('main.pricing')
|
|
|
|
|
|
|
|
|
|
|
|
assert normalize_spaces(
|
|
|
|
|
|
home_page.select('.product-page-section')[5].select('.govuk-grid-column-one-half')[1].text
|
|
|
|
|
|
) == (
|
|
|
|
|
|
f'Text messages '
|
|
|
|
|
|
f'Up to 40,000 free text messages a year, '
|
|
|
|
|
|
f'then {expected_rate} pence per message'
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
assert normalize_spaces(
|
|
|
|
|
|
pricing_page.select_one('#text-messages + p + p').text
|
|
|
|
|
|
) == (
|
|
|
|
|
|
f'When a service has used its annual allowance, it costs '
|
|
|
|
|
|
f'{expected_rate} pence (plus VAT) for each text message you '
|
|
|
|
|
|
f'send.'
|
|
|
|
|
|
)
|