2018-03-27 11:13:09 +01:00
|
|
|
|
from functools import partial
|
|
|
|
|
|
|
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
|
2018-04-25 14:12:58 +01:00
|
|
|
|
|
2019-02-15 14:47:39 +00:00
|
|
|
|
from app.main.forms import FieldWithNoneOption
|
2018-12-05 10:30:44 +00:00
|
|
|
|
from tests.conftest import (
|
2019-04-04 11:12:53 +01:00
|
|
|
|
mock_get_organisation_by_domain,
|
2018-12-05 10:30:44 +00:00
|
|
|
|
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(
|
|
|
|
|
|
client,
|
2019-04-10 17:20:51 +01:00
|
|
|
|
mock_get_service_and_organisation_counts,
|
2017-11-14 17:25:32 +00:00
|
|
|
|
):
|
|
|
|
|
|
response = client.get(url_for('main.index'))
|
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
|
|
|
|
|
|
|
|
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
|
|
|
|
|
|
|
2018-01-18 16:38:15 +00:00
|
|
|
|
assert page.h1.text.strip() == (
|
|
|
|
|
|
'Send emails, text messages and letters to your users'
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
assert page.select_one('meta[name=description]')['content'].strip() == (
|
|
|
|
|
|
'GOV.UK Notify lets you send emails, text messages and letters '
|
|
|
|
|
|
'to your users. Try it now if you work in central government, a '
|
|
|
|
|
|
'local authority, or the NHS.'
|
2017-11-14 17:25:32 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
2019-04-10 17:20:51 +01:00
|
|
|
|
assert normalize_spaces(page.select_one('#whos-using-notify').text) == (
|
|
|
|
|
|
'Who’s using GOV.UK Notify '
|
|
|
|
|
|
'Services '
|
2019-07-08 12:00:40 +01:00
|
|
|
|
'9,999 services '
|
2019-04-10 17:20:51 +01:00
|
|
|
|
'Organisations '
|
|
|
|
|
|
'111 organisations '
|
|
|
|
|
|
'See the list of services and organisations.'
|
|
|
|
|
|
)
|
|
|
|
|
|
assert page.select_one('#whos-using-notify a')['href'] == (
|
|
|
|
|
|
'https://www.gov.uk/performance/govuk-notify/government-services'
|
|
|
|
|
|
)
|
|
|
|
|
|
|
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,
|
|
|
|
|
|
_expected_redirect=url_for('main.show_accounts_or_dashboard', _external=True)
|
|
|
|
|
|
)
|
2016-09-07 10:49:57 +01:00
|
|
|
|
|
|
|
|
|
|
|
2018-08-29 15:41:53 +01:00
|
|
|
|
def test_robots(client):
|
|
|
|
|
|
assert url_for('main.robots') == '/robots.txt'
|
|
|
|
|
|
response = client.get(url_for('main.robots'))
|
|
|
|
|
|
assert response.headers['Content-Type'] == 'text/plain'
|
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
|
|
assert response.get_data(as_text=True) == (
|
|
|
|
|
|
'User-agent: *\n'
|
|
|
|
|
|
'Disallow: /sign-in\n'
|
|
|
|
|
|
'Disallow: /support\n'
|
|
|
|
|
|
'Disallow: /support/\n'
|
|
|
|
|
|
'Disallow: /register\n'
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-09-07 10:49:57 +01:00
|
|
|
|
@pytest.mark.parametrize('view', [
|
2019-04-11 12:00:37 +01:00
|
|
|
|
'cookies', 'privacy', 'pricing', 'terms', 'roadmap',
|
2019-04-18 13:06:39 +01:00
|
|
|
|
'features', 'callbacks', 'documentation', 'security',
|
|
|
|
|
|
'message_status', 'features_email', 'features_sms',
|
2019-06-04 10:43:15 +01:00
|
|
|
|
'features_letters', 'how_to_pay',
|
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,
|
|
|
|
|
|
):
|
2017-12-01 09:46:46 +00:00
|
|
|
|
page = client_request.get('main.{}'.format(view))
|
2017-11-14 17:25:32 +00:00
|
|
|
|
assert not page.select_one('meta[name=description]')
|
|
|
|
|
|
|
2017-08-30 15:22:26 +01:00
|
|
|
|
|
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'),
|
2017-11-28 11:56:30 +00:00
|
|
|
|
])
|
|
|
|
|
|
def test_old_static_pages_redirect(
|
|
|
|
|
|
client,
|
|
|
|
|
|
view,
|
|
|
|
|
|
expected_view
|
|
|
|
|
|
):
|
|
|
|
|
|
response = client.get(url_for('main.{}'.format(view)))
|
|
|
|
|
|
assert response.status_code == 301
|
|
|
|
|
|
assert response.location == url_for(
|
|
|
|
|
|
'main.{}'.format(expected_view),
|
|
|
|
|
|
_external=True
|
|
|
|
|
|
)
|
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')
|
|
|
|
|
|
|
|
|
|
|
|
assert page.find(id='email-statuses')
|
|
|
|
|
|
assert page.find(id='sms-statuses')
|
|
|
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
|
|
|
|
2018-11-06 17:24:30 +00: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-03-08 12:12:18 +00:00
|
|
|
|
def test_terms_is_generic_if_user_is_not_logged_in(
|
|
|
|
|
|
client
|
|
|
|
|
|
):
|
|
|
|
|
|
response = client.get(url_for('main.terms'))
|
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
|
|
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
|
|
|
|
|
|
|
2018-03-12 15:13:52 +00:00
|
|
|
|
assert normalize_spaces(page.select('main p')[1].text) == (
|
|
|
|
|
|
'Your organisation must also accept our data sharing and '
|
2018-05-08 14:28:08 +01:00
|
|
|
|
'financial agreement. Sign in to download a copy or find out '
|
|
|
|
|
|
'if one is already in place.'
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
2018-03-27 11:13:09 +01:00
|
|
|
|
@pytest.mark.parametrize((
|
2019-04-04 11:12:53 +01:00
|
|
|
|
'name,'
|
|
|
|
|
|
'agreement_signed,'
|
2018-03-27 11:13:09 +01:00
|
|
|
|
'expected_terms_paragraph,'
|
|
|
|
|
|
'expected_terms_link,'
|
|
|
|
|
|
), [
|
2018-03-08 12:12:18 +00:00
|
|
|
|
(
|
2019-04-04 11:12:53 +01:00
|
|
|
|
'Cabinet Office',
|
|
|
|
|
|
True,
|
2018-03-08 12:12:18 +00:00
|
|
|
|
(
|
|
|
|
|
|
'Your organisation (Cabinet Office) has already accepted '
|
|
|
|
|
|
'the GOV.UK Notify data sharing and financial agreement.'
|
|
|
|
|
|
),
|
2018-03-27 11:13:09 +01:00
|
|
|
|
None,
|
2018-03-08 12:12:18 +00:00
|
|
|
|
),
|
2018-03-12 15:13:52 +00:00
|
|
|
|
(
|
2019-04-04 11:12:53 +01:00
|
|
|
|
'Aylesbury Town Council',
|
|
|
|
|
|
False,
|
2018-03-12 15:13:52 +00:00
|
|
|
|
(
|
|
|
|
|
|
'Your organisation (Aylesbury Town Council) must also '
|
2018-03-27 11:13:09 +01:00
|
|
|
|
'accept our data sharing and financial agreement. Download '
|
|
|
|
|
|
'a copy.'
|
|
|
|
|
|
),
|
|
|
|
|
|
partial(
|
|
|
|
|
|
url_for,
|
|
|
|
|
|
'main.agreement',
|
2018-03-12 15:13:52 +00:00
|
|
|
|
),
|
|
|
|
|
|
),
|
2018-03-08 12:12:18 +00:00
|
|
|
|
(
|
2019-04-04 11:12:53 +01:00
|
|
|
|
None,
|
|
|
|
|
|
None,
|
2018-03-08 12:12:18 +00:00
|
|
|
|
(
|
2018-03-12 15:13:52 +00:00
|
|
|
|
'Your organisation must also accept our data sharing and '
|
2018-05-08 14:28:08 +01:00
|
|
|
|
'financial agreement. Download the agreement or contact us '
|
|
|
|
|
|
'to find out if we already have one in place with your '
|
|
|
|
|
|
'organisation.'
|
2018-03-08 12:12:18 +00:00
|
|
|
|
),
|
2018-03-27 11:13:09 +01:00
|
|
|
|
partial(
|
|
|
|
|
|
url_for,
|
2018-05-08 14:28:08 +01:00
|
|
|
|
'main.agreement',
|
2018-03-27 11:13:09 +01:00
|
|
|
|
),
|
2018-03-08 12:12:18 +00:00
|
|
|
|
),
|
2018-03-28 12:30:16 +01:00
|
|
|
|
(
|
2019-04-04 11:12:53 +01:00
|
|
|
|
'Met Office',
|
|
|
|
|
|
False,
|
2018-03-28 12:30:16 +01:00
|
|
|
|
(
|
|
|
|
|
|
'Your organisation (Met Office) must also accept our data '
|
2018-03-28 13:52:41 +01:00
|
|
|
|
'sharing and financial agreement. Download a copy.'
|
2018-03-28 12:30:16 +01:00
|
|
|
|
),
|
|
|
|
|
|
partial(
|
|
|
|
|
|
url_for,
|
2018-03-28 13:52:41 +01:00
|
|
|
|
'main.agreement',
|
2018-03-28 12:30:16 +01:00
|
|
|
|
),
|
|
|
|
|
|
),
|
2018-03-08 12:12:18 +00:00
|
|
|
|
])
|
|
|
|
|
|
def test_terms_tells_logged_in_users_what_we_know_about_their_agreement(
|
|
|
|
|
|
mocker,
|
|
|
|
|
|
fake_uuid,
|
|
|
|
|
|
client_request,
|
2019-04-04 11:12:53 +01:00
|
|
|
|
name,
|
|
|
|
|
|
agreement_signed,
|
2018-03-16 11:03:30 +00:00
|
|
|
|
expected_terms_paragraph,
|
2018-03-27 11:13:09 +01:00
|
|
|
|
expected_terms_link,
|
2018-03-08 12:12:18 +00:00
|
|
|
|
):
|
2019-04-04 11:12:53 +01:00
|
|
|
|
mock_get_organisation_by_domain(
|
|
|
|
|
|
mocker,
|
|
|
|
|
|
name=name,
|
|
|
|
|
|
agreement_signed=agreement_signed,
|
|
|
|
|
|
)
|
2018-03-16 11:03:30 +00:00
|
|
|
|
terms_page = client_request.get('main.terms')
|
2019-04-11 12:00:37 +01:00
|
|
|
|
|
2018-03-16 11:03:30 +00:00
|
|
|
|
assert normalize_spaces(terms_page.select('main p')[1].text) == expected_terms_paragraph
|
2018-03-27 11:13:09 +01:00
|
|
|
|
if expected_terms_link:
|
|
|
|
|
|
assert terms_page.select_one('main p a')['href'] == expected_terms_link()
|
|
|
|
|
|
else:
|
|
|
|
|
|
assert not terms_page.select_one('main p').select('a')
|
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/govuk-template.css?',
|
|
|
|
|
|
'https://static.example.com/stylesheets/govuk-template-print.css?',
|
|
|
|
|
|
'https://static.example.com/stylesheets/fonts.css?',
|
|
|
|
|
|
'https://static.example.com/stylesheets/main.css?',
|
|
|
|
|
|
][index])
|
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,
|
|
|
|
|
|
):
|
|
|
|
|
|
client_request.get(
|
|
|
|
|
|
'main.email_template',
|
|
|
|
|
|
_test_page_title=False,
|
|
|
|
|
|
**extra_args
|
|
|
|
|
|
)
|
|
|
|
|
|
assert mock_get_email_branding.called is email_branding_retrieved
|
2019-02-15 14:47:39 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize('branding_style, filename', [
|
|
|
|
|
|
('hm-government', 'hm-government'),
|
|
|
|
|
|
(None, 'no-branding'),
|
|
|
|
|
|
(FieldWithNoneOption.NONE_OPTION_VALUE, 'no-branding')
|
|
|
|
|
|
])
|
|
|
|
|
|
def test_letter_template_preview_links_to_the_correct_image(
|
|
|
|
|
|
client_request,
|
|
|
|
|
|
mocker,
|
|
|
|
|
|
mock_get_letter_branding_by_id,
|
|
|
|
|
|
branding_style,
|
|
|
|
|
|
filename,
|
|
|
|
|
|
):
|
|
|
|
|
|
page = client_request.get(
|
|
|
|
|
|
'main.letter_template',
|
|
|
|
|
|
_test_page_title=False,
|
|
|
|
|
|
branding_style=branding_style
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
image_link = page.find('img')['src']
|
|
|
|
|
|
|
|
|
|
|
|
assert image_link == url_for(
|
|
|
|
|
|
'main.letter_branding_preview_image',
|
|
|
|
|
|
filename=filename,
|
|
|
|
|
|
page=1
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_letter_template_preview_headers(
|
|
|
|
|
|
client,
|
|
|
|
|
|
mock_get_letter_branding_by_id,
|
|
|
|
|
|
):
|
|
|
|
|
|
response = client.get(
|
|
|
|
|
|
url_for('main.letter_template', branding_style='hm-government')
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
assert response.headers.get('X-Frame-Options') == 'SAMEORIGIN'
|