Split out email and letter branding request tests

In response to: [^1].

I've named the file to distinguish it from the admin endpoints to
set branding.

[^1]: https://github.com/alphagov/notifications-admin/pull/4196#discussion_r838734482
This commit is contained in:
Ben Thorner
2022-03-30 17:38:45 +01:00
parent a27b5eb12b
commit c7951f8667
3 changed files with 771 additions and 754 deletions

View File

@@ -0,0 +1,528 @@
from unittest.mock import ANY, PropertyMock
import pytest
from flask import url_for
from notifications_utils.clients.zendesk.zendesk_client import (
NotifySupportTicket,
)
from app.utils.branding import NHS_EMAIL_BRANDING_ID
from tests import sample_uuid
from tests.conftest import ORGANISATION_ID, SERVICE_ONE_ID, normalize_spaces
@pytest.mark.parametrize('organisation_type, expected_options', (
('nhs_central', [
('nhs', 'NHS'),
('something_else', 'Something else'),
]),
('other', [
('something_else', 'Something else'),
])
))
def test_email_branding_request_page_when_no_branding_is_set(
service_one,
client_request,
mocker,
mock_get_email_branding,
mock_get_letter_branding_by_id,
organisation_type,
expected_options,
):
service_one['email_branding'] = None
service_one['organisation_type'] = organisation_type
mocker.patch(
'app.models.service.Service.email_branding_id',
new_callable=PropertyMock,
return_value=None,
)
page = client_request.get(
'.email_branding_request', service_id=SERVICE_ONE_ID
)
assert mock_get_email_branding.called is False
assert page.find('iframe')['src'] == url_for('main.email_template', branding_style='__NONE__')
assert mock_get_letter_branding_by_id.called is False
button_text = normalize_spaces(page.select_one('.page-footer button').text)
assert [
(
radio['value'],
page.select_one('label[for={}]'.format(radio['id'])).text.strip()
)
for radio in page.select('input[type=radio]')
] == expected_options
assert button_text == 'Continue'
def test_email_branding_request_page_shows_branding_if_set(
mocker,
service_one,
client_request,
mock_get_email_branding,
mock_get_service_organisation,
):
mocker.patch(
'app.models.service.Service.email_branding_id',
new_callable=PropertyMock,
return_value='some-random-branding',
)
page = client_request.get(
'.email_branding_request', service_id=SERVICE_ONE_ID
)
assert page.find('iframe')['src'] == url_for('main.email_template', branding_style='some-random-branding')
def test_email_branding_request_page_back_link(
client_request,
):
page = client_request.get(
'.email_branding_request', service_id=SERVICE_ONE_ID
)
back_link = page.select('a[class=govuk-back-link]')
assert back_link[0].attrs['href'] == url_for('.service_settings', service_id=SERVICE_ONE_ID)
@pytest.mark.parametrize('data, org_type, endpoint', (
(
{
'options': 'govuk',
},
'central',
'main.email_branding_govuk',
),
(
{
'options': 'govuk_and_org',
},
'central',
'main.email_branding_govuk_and_org',
),
(
{
'options': 'organisation',
},
'central',
'main.email_branding_organisation',
),
(
{
'options': 'something_else',
},
'central',
'main.email_branding_something_else',
),
(
{
'options': 'nhs',
},
'nhs_local',
'main.email_branding_nhs',
),
))
def test_email_branding_request_submit(
client_request,
service_one,
mocker,
mock_get_email_branding,
organisation_one,
data,
org_type,
endpoint,
):
organisation_one['organisation_type'] = org_type
service_one['email_branding'] = sample_uuid()
service_one['organisation'] = organisation_one
mocker.patch(
'app.organisations_client.get_organisation',
return_value=organisation_one,
)
client_request.post(
'.email_branding_request',
service_id=SERVICE_ONE_ID,
_data=data,
_expected_status=302,
_expected_redirect=url_for(
endpoint,
service_id=SERVICE_ONE_ID,
_external=True,
)
)
def test_email_branding_request_submit_when_no_radio_button_is_selected(
client_request,
service_one,
mock_get_email_branding,
):
service_one['email_branding'] = sample_uuid()
page = client_request.post(
'.email_branding_request', service_id=SERVICE_ONE_ID,
_data={'options': ''},
_follow_redirects=True,
)
assert page.h1.text == 'Change email branding'
assert normalize_spaces(page.select_one('.error-message').text) == 'Select an option'
@pytest.mark.parametrize('endpoint, expected_heading', [
('main.email_branding_govuk_and_org', 'Before you request new branding'),
('main.email_branding_organisation', 'When you request new branding'),
])
def test_email_branding_description_pages_for_org_branding(
client_request,
mocker,
service_one,
organisation_one,
mock_get_email_branding,
endpoint,
expected_heading,
):
service_one['email_branding'] = sample_uuid()
service_one['organisation'] = organisation_one
mocker.patch(
'app.organisations_client.get_organisation',
return_value=organisation_one,
)
page = client_request.get(
endpoint,
service_id=SERVICE_ONE_ID,
)
assert page.h1.text == expected_heading
assert normalize_spaces(page.select_one('.page-footer button').text) == 'Request new branding'
@pytest.mark.parametrize('endpoint, service_org_type, branding_preview_id', [
('main.email_branding_govuk', 'central', '__NONE__'),
('main.email_branding_nhs', 'nhs_local', NHS_EMAIL_BRANDING_ID),
])
def test_email_branding_govuk_and_nhs_pages(
client_request,
mocker,
service_one,
organisation_one,
mock_get_email_branding,
endpoint,
service_org_type,
branding_preview_id,
):
organisation_one['organisation_type'] = service_org_type
service_one['email_branding'] = sample_uuid()
service_one['organisation'] = organisation_one
mocker.patch(
'app.organisations_client.get_organisation',
return_value=organisation_one,
)
page = client_request.get(
endpoint,
service_id=SERVICE_ONE_ID,
)
assert page.h1.text == 'Check your new branding'
assert 'Emails from service one will look like this' in normalize_spaces(page.text)
assert page.find('iframe')['src'] == url_for('main.email_template', branding_style=branding_preview_id)
assert normalize_spaces(page.select_one('.page-footer button').text) == 'Use this branding'
def test_email_branding_something_else_page(client_request, service_one):
# expect to have a "NHS" option as well as the
# fallback, so back button goes to choices page
service_one['organisation_type'] = 'nhs_central'
page = client_request.get(
'main.email_branding_something_else',
service_id=SERVICE_ONE_ID,
)
assert normalize_spaces(page.h1.text) == 'Describe the branding you want'
assert page.select_one('textarea')['name'] == ('something_else')
assert normalize_spaces(page.select_one('.page-footer button').text) == 'Request new branding'
assert page.select_one('.govuk-back-link')['href'] == url_for(
'main.email_branding_request', service_id=SERVICE_ONE_ID,
)
def test_get_email_branding_something_else_page_is_only_option(client_request, service_one):
# should only have a "something else" option
# so back button goes back to settings page
service_one['organisation_type'] = 'other'
page = client_request.get(
'main.email_branding_something_else',
service_id=SERVICE_ONE_ID,
)
assert page.select_one('.govuk-back-link')['href'] == url_for(
'main.service_settings', service_id=SERVICE_ONE_ID,
)
@pytest.mark.parametrize('endpoint', [
('main.email_branding_govuk'),
('main.email_branding_govuk_and_org'),
('main.email_branding_nhs'),
('main.email_branding_organisation'),
])
def test_email_branding_pages_give_404_if_selected_branding_not_allowed(
client_request,
endpoint,
):
# The only email branding allowed is 'something_else', so trying to visit any of the other
# endpoints gives a 404 status code.
client_request.get(
endpoint,
service_id=SERVICE_ONE_ID,
_expected_status=404
)
def test_email_branding_govuk_submit(
mocker,
client_request,
service_one,
organisation_one,
no_reply_to_email_addresses,
mock_get_email_branding,
single_sms_sender,
mock_update_service,
):
mocker.patch(
'app.organisations_client.get_organisation',
return_value=organisation_one,
)
mocker.patch(
'app.models.service.Service.organisation_id',
new_callable=PropertyMock,
return_value=ORGANISATION_ID,
)
service_one['email_branding'] = sample_uuid()
page = client_request.post(
'.email_branding_govuk',
service_id=SERVICE_ONE_ID,
_follow_redirects=True,
)
mock_update_service.assert_called_once_with(
SERVICE_ONE_ID,
email_branding=None,
)
assert page.h1.text == 'Settings'
assert normalize_spaces(page.select_one('.banner-default').text) == 'Youve updated your email branding'
def test_email_branding_govuk_and_org_submit(
mocker,
client_request,
service_one,
organisation_one,
no_reply_to_email_addresses,
mock_get_email_branding,
single_sms_sender,
):
mocker.patch(
'app.organisations_client.get_organisation',
return_value=organisation_one,
)
mocker.patch(
'app.models.service.Service.organisation_id',
new_callable=PropertyMock,
return_value=ORGANISATION_ID,
)
service_one['email_branding'] = sample_uuid()
mock_create_ticket = mocker.spy(NotifySupportTicket, '__init__')
mock_send_ticket_to_zendesk = mocker.patch(
'app.main.views.service_settings.zendesk_client.send_ticket_to_zendesk',
autospec=True,
)
page = client_request.post(
'.email_branding_govuk_and_org',
service_id=SERVICE_ONE_ID,
_follow_redirects=True,
)
mock_create_ticket.assert_called_once_with(
ANY,
message='\n'.join([
'Organisation: organisation one',
'Service: service one',
'http://localhost/services/596364a0-858e-42c8-9062-a8fe822260eb',
'',
'---',
'Current branding: Organisation name',
'Branding requested: GOV.UK and organisation one\n',
]),
subject='Email branding request - service one',
ticket_type='question',
user_name='Test User',
user_email='test@user.gov.uk',
org_id=ORGANISATION_ID,
org_type='central',
service_id=SERVICE_ONE_ID
)
mock_send_ticket_to_zendesk.assert_called_once()
assert normalize_spaces(page.select_one('.banner-default').text) == (
'Thanks for your branding request. Well get back to you '
'within one working day.'
)
def test_email_branding_nhs_submit(
mocker,
client_request,
service_one,
organisation_one,
no_reply_to_email_addresses,
mock_get_email_branding,
single_sms_sender,
mock_update_service,
):
service_one['email_branding'] = sample_uuid()
service_one['organisation_type'] = 'nhs_local'
page = client_request.post(
'.email_branding_nhs',
service_id=SERVICE_ONE_ID,
_follow_redirects=True,
)
mock_update_service.assert_called_once_with(
SERVICE_ONE_ID,
email_branding=NHS_EMAIL_BRANDING_ID,
)
assert page.h1.text == 'Settings'
assert normalize_spaces(page.select_one('.banner-default').text) == 'Youve updated your email branding'
def test_email_branding_organisation_submit(
mocker,
client_request,
service_one,
organisation_one,
no_reply_to_email_addresses,
mock_get_email_branding,
single_sms_sender,
):
mocker.patch(
'app.organisations_client.get_organisation',
return_value=organisation_one,
)
mocker.patch(
'app.models.service.Service.organisation_id',
new_callable=PropertyMock,
return_value=ORGANISATION_ID,
)
service_one['email_branding'] = sample_uuid()
mock_create_ticket = mocker.spy(NotifySupportTicket, '__init__')
mock_send_ticket_to_zendesk = mocker.patch(
'app.main.views.service_settings.zendesk_client.send_ticket_to_zendesk',
autospec=True,
)
page = client_request.post(
'.email_branding_organisation',
service_id=SERVICE_ONE_ID,
_follow_redirects=True,
)
mock_create_ticket.assert_called_once_with(
ANY,
message='\n'.join([
'Organisation: organisation one',
'Service: service one',
'http://localhost/services/596364a0-858e-42c8-9062-a8fe822260eb',
'',
'---',
'Current branding: Organisation name',
'Branding requested: organisation one\n',
]),
subject='Email branding request - service one',
ticket_type='question',
user_name='Test User',
user_email='test@user.gov.uk',
org_id=ORGANISATION_ID,
org_type='central',
service_id=SERVICE_ONE_ID
)
mock_send_ticket_to_zendesk.assert_called_once()
assert normalize_spaces(page.select_one('.banner-default').text) == (
'Thanks for your branding request. Well get back to you '
'within one working day.'
)
def test_email_branding_something_else_submit(
client_request,
mocker,
service_one,
no_reply_to_email_addresses,
mock_get_email_branding,
single_sms_sender,
):
service_one['email_branding'] = sample_uuid()
service_one['organisation_type'] = 'nhs_local'
mock_create_ticket = mocker.spy(NotifySupportTicket, '__init__')
mock_send_ticket_to_zendesk = mocker.patch(
'app.main.views.service_settings.zendesk_client.send_ticket_to_zendesk',
autospec=True,
)
page = client_request.post(
'.email_branding_something_else',
service_id=SERVICE_ONE_ID,
_data={'something_else': 'Homer Simpson'},
_follow_redirects=True,
)
mock_create_ticket.assert_called_once_with(
ANY,
message='\n'.join([
'Organisation: Cant tell (domain is user.gov.uk)',
'Service: service one',
'http://localhost/services/596364a0-858e-42c8-9062-a8fe822260eb',
'',
'---',
'Current branding: Organisation name',
'Branding requested: Something else\n',
'Homer Simpson\n'
]),
subject='Email branding request - service one',
ticket_type='question',
user_name='Test User',
user_email='test@user.gov.uk',
org_id=None,
org_type='nhs_local',
service_id=SERVICE_ONE_ID
)
mock_send_ticket_to_zendesk.assert_called_once()
assert normalize_spaces(page.select_one('.banner-default').text) == (
'Thanks for your branding request. Well get back to you '
'within one working day.'
)
def test_email_branding_something_else_submit_shows_error_if_textbox_is_empty(
client_request,
):
page = client_request.post(
'.email_branding_something_else',
service_id=SERVICE_ONE_ID,
_data={'something_else': ''},
_follow_redirects=True,
)
assert normalize_spaces(page.h1.text) == 'Describe the branding you want'
assert normalize_spaces(page.select_one('.govuk-error-message').text) == 'Error: Cannot be empty'

View File

@@ -0,0 +1,243 @@
from unittest.mock import ANY, PropertyMock
import pytest
from flask import url_for
from notifications_utils.clients.zendesk.zendesk_client import (
NotifySupportTicket,
)
from tests import organisation_json, sample_uuid
from tests.conftest import (
ORGANISATION_ID,
SERVICE_ONE_ID,
TEMPLATE_ONE_ID,
normalize_spaces,
)
@pytest.mark.parametrize('organisation_type, expected_options', (
('nhs_central', [
('nhs', 'NHS'),
('something_else', 'Something else'),
]),
('other', None),
))
def test_letter_branding_request_page_when_no_branding_is_set(
service_one,
client_request,
mock_get_email_branding,
mock_get_letter_branding_by_id,
organisation_type,
expected_options,
):
service_one['letter_branding'] = None
service_one['organisation_type'] = organisation_type
page = client_request.get(
'.letter_branding_request', service_id=SERVICE_ONE_ID
)
assert mock_get_email_branding.called is False
assert mock_get_letter_branding_by_id.called is False
button_text = normalize_spaces(page.select_one('.page-footer button').text)
assert button_text == 'Request new branding'
if expected_options:
assert [
(
radio['value'],
page.select_one('label[for={}]'.format(radio['id'])).text.strip()
)
for radio in page.select('input[type=radio]')
] == expected_options
assert page.select_one(
'.conditional-radios-panel#panel-something-else textarea'
)['name'] == (
'something_else'
)
else:
assert page.select_one(
'textarea'
)['name'] == (
'something_else'
)
assert not page.select('.conditional-radios-panel')
@pytest.mark.parametrize('from_template,back_link_url', [
(None, '/services/{}/service-settings'.format(SERVICE_ONE_ID),),
(TEMPLATE_ONE_ID, '/services/{}/templates/{}'.format(SERVICE_ONE_ID, TEMPLATE_ONE_ID),)
])
def test_letter_branding_request_page_back_link(
client_request,
from_template,
back_link_url,
):
if from_template:
page = client_request.get(
'.letter_branding_request', service_id=SERVICE_ONE_ID, from_template=from_template
)
else:
page = client_request.get(
'.letter_branding_request', service_id=SERVICE_ONE_ID
)
back_link = page.select('a[class=govuk-back-link]')
assert back_link[0].attrs['href'] == back_link_url
@pytest.mark.parametrize('org_name, expected_organisation', (
(None, 'Cant tell (domain is user.gov.uk)'),
('Test Organisation', 'Test Organisation'),
))
def test_letter_branding_request_submit(
client_request,
service_one,
mocker,
mock_get_letter_branding_by_id,
no_reply_to_email_addresses,
no_letter_contact_blocks,
single_sms_sender,
org_name,
expected_organisation,
):
service_one['letter_branding'] = sample_uuid()
organisation_id = ORGANISATION_ID if org_name else None
mocker.patch(
'app.models.service.Service.organisation_id',
new_callable=PropertyMock,
return_value=organisation_id,
)
mocker.patch(
'app.organisations_client.get_organisation',
return_value=organisation_json(name=org_name),
)
mock_create_ticket = mocker.spy(NotifySupportTicket, '__init__')
mock_send_ticket_to_zendesk = mocker.patch(
'app.main.views.service_settings.zendesk_client.send_ticket_to_zendesk',
autospec=True,
)
page = client_request.post(
'.letter_branding_request', service_id=SERVICE_ONE_ID,
_data={
'options': 'something_else',
'something_else': 'Homer Simpson',
},
_follow_redirects=True,
)
mock_create_ticket.assert_called_once_with(
ANY,
message='\n'.join([
'Organisation: {}',
'Service: service one',
'http://localhost/services/596364a0-858e-42c8-9062-a8fe822260eb',
'',
'---',
'Current branding: HM Government',
'Branding requested: Something else\n\nHomer Simpson\n',
]).format(expected_organisation),
subject='Letter branding request - service one',
ticket_type='question',
user_name='Test User',
user_email='test@user.gov.uk',
org_id=organisation_id,
org_type='central',
service_id=SERVICE_ONE_ID
)
mock_send_ticket_to_zendesk.assert_called_once()
assert normalize_spaces(page.select_one('.banner-default').text) == (
'Thanks for your branding request. Well get back to you '
'within one working day.'
)
@pytest.mark.parametrize('data, error_message', (
({'options': 'something_else'}, 'Cannot be empty'), # no data in 'something_else' textbox
({'options': ''}, 'Select an option'), # no radio button selected
))
def test_letter_branding_request_submit_when_form_has_missing_data(
client_request,
mocker,
service_one,
organisation_one,
data,
error_message,
mock_get_letter_branding_by_id,
):
mocker.patch(
'app.organisations_client.get_organisation',
return_value=organisation_one,
)
service_one['letter_branding'] = sample_uuid()
service_one['organisation'] = organisation_one
page = client_request.post(
'.letter_branding_request', service_id=SERVICE_ONE_ID,
_data=data,
_follow_redirects=True,
)
assert page.h1.text == 'Change letter branding'
assert normalize_spaces(page.select_one('.error-message').text) == error_message
@pytest.mark.parametrize('from_template', [
None,
TEMPLATE_ONE_ID
])
def test_letter_branding_request_submit_redirects_if_from_template_is_set(
client_request,
service_one,
mocker,
from_template,
):
mocker.patch('app.main.views.service_settings.zendesk_client.send_ticket_to_zendesk', autospec=True)
data = {'options': 'something_else', 'something_else': 'Homer Simpson'}
if from_template:
client_request.post(
'.letter_branding_request', service_id=SERVICE_ONE_ID, from_template=from_template,
_data=data,
_expected_redirect=url_for(
'main.view_template', service_id=SERVICE_ONE_ID, template_id=from_template, _external=True
)
)
else:
client_request.post(
'.letter_branding_request', service_id=SERVICE_ONE_ID,
_data=data,
_expected_redirect=url_for('main.service_settings', service_id=SERVICE_ONE_ID, _external=True)
)
def test_letter_branding_submit_when_something_else_is_only_option(
client_request,
service_one,
mocker,
mock_get_letter_branding_by_id,
):
mock_create_ticket = mocker.spy(NotifySupportTicket, '__init__')
mocker.patch(
'app.main.views.service_settings.zendesk_client.send_ticket_to_zendesk',
autospec=True,
)
client_request.post(
'.letter_branding_request',
service_id=SERVICE_ONE_ID,
_data={
'something_else': 'Homer Simpson',
},
)
assert (
'Current branding: no\n'
'Branding requested: Something else\n'
'\n'
'Homer Simpson'
) in mock_create_ticket.call_args_list[0][1]['message']

View File

@@ -14,7 +14,6 @@ from notifications_utils.clients.zendesk.zendesk_client import (
)
import app
from app.utils.branding import NHS_EMAIL_BRANDING_ID
from tests import (
find_element_by_tag_and_partial_text,
invite_json,
@@ -4779,759 +4778,6 @@ def test_service_settings_links_to_branding_request_page_for_emails(
assert len(page.find_all('a', attrs={'href': expected_href})) == 1
@pytest.mark.parametrize('organisation_type, expected_options', (
('nhs_central', [
('nhs', 'NHS'),
('something_else', 'Something else'),
]),
('other', [
('something_else', 'Something else'),
])
))
def test_email_branding_request_page_when_no_branding_is_set(
service_one,
client_request,
mocker,
mock_get_email_branding,
mock_get_letter_branding_by_id,
organisation_type,
expected_options,
):
service_one['email_branding'] = None
service_one['organisation_type'] = organisation_type
mocker.patch(
'app.models.service.Service.email_branding_id',
new_callable=PropertyMock,
return_value=None,
)
page = client_request.get(
'.email_branding_request', service_id=SERVICE_ONE_ID
)
assert mock_get_email_branding.called is False
assert page.find('iframe')['src'] == url_for('main.email_template', branding_style='__NONE__')
assert mock_get_letter_branding_by_id.called is False
button_text = normalize_spaces(page.select_one('.page-footer button').text)
assert [
(
radio['value'],
page.select_one('label[for={}]'.format(radio['id'])).text.strip()
)
for radio in page.select('input[type=radio]')
] == expected_options
assert button_text == 'Continue'
def test_email_branding_request_page_shows_branding_if_set(
mocker,
service_one,
client_request,
mock_get_email_branding,
mock_get_service_organisation,
):
mocker.patch(
'app.models.service.Service.email_branding_id',
new_callable=PropertyMock,
return_value='some-random-branding',
)
page = client_request.get(
'.email_branding_request', service_id=SERVICE_ONE_ID
)
assert page.find('iframe')['src'] == url_for('main.email_template', branding_style='some-random-branding')
def test_email_branding_request_page_back_link(
client_request,
):
page = client_request.get(
'.email_branding_request', service_id=SERVICE_ONE_ID
)
back_link = page.select('a[class=govuk-back-link]')
assert back_link[0].attrs['href'] == url_for('.service_settings', service_id=SERVICE_ONE_ID)
@pytest.mark.parametrize('data, org_type, endpoint', (
(
{
'options': 'govuk',
},
'central',
'main.email_branding_govuk',
),
(
{
'options': 'govuk_and_org',
},
'central',
'main.email_branding_govuk_and_org',
),
(
{
'options': 'organisation',
},
'central',
'main.email_branding_organisation',
),
(
{
'options': 'something_else',
},
'central',
'main.email_branding_something_else',
),
(
{
'options': 'nhs',
},
'nhs_local',
'main.email_branding_nhs',
),
))
def test_email_branding_request_submit(
client_request,
service_one,
mocker,
mock_get_email_branding,
organisation_one,
data,
org_type,
endpoint,
):
organisation_one['organisation_type'] = org_type
service_one['email_branding'] = sample_uuid()
service_one['organisation'] = organisation_one
mocker.patch(
'app.organisations_client.get_organisation',
return_value=organisation_one,
)
client_request.post(
'.email_branding_request',
service_id=SERVICE_ONE_ID,
_data=data,
_expected_status=302,
_expected_redirect=url_for(
endpoint,
service_id=SERVICE_ONE_ID,
_external=True,
)
)
def test_email_branding_request_submit_when_no_radio_button_is_selected(
client_request,
service_one,
mock_get_email_branding,
):
service_one['email_branding'] = sample_uuid()
page = client_request.post(
'.email_branding_request', service_id=SERVICE_ONE_ID,
_data={'options': ''},
_follow_redirects=True,
)
assert page.h1.text == 'Change email branding'
assert normalize_spaces(page.select_one('.error-message').text) == 'Select an option'
@pytest.mark.parametrize('endpoint, expected_heading', [
('main.email_branding_govuk_and_org', 'Before you request new branding'),
('main.email_branding_organisation', 'When you request new branding'),
])
def test_email_branding_description_pages_for_org_branding(
client_request,
mocker,
service_one,
organisation_one,
mock_get_email_branding,
endpoint,
expected_heading,
):
service_one['email_branding'] = sample_uuid()
service_one['organisation'] = organisation_one
mocker.patch(
'app.organisations_client.get_organisation',
return_value=organisation_one,
)
page = client_request.get(
endpoint,
service_id=SERVICE_ONE_ID,
)
assert page.h1.text == expected_heading
assert normalize_spaces(page.select_one('.page-footer button').text) == 'Request new branding'
@pytest.mark.parametrize('endpoint, service_org_type, branding_preview_id', [
('main.email_branding_govuk', 'central', '__NONE__'),
('main.email_branding_nhs', 'nhs_local', NHS_EMAIL_BRANDING_ID),
])
def test_email_branding_govuk_and_nhs_pages(
client_request,
mocker,
service_one,
organisation_one,
mock_get_email_branding,
endpoint,
service_org_type,
branding_preview_id,
):
organisation_one['organisation_type'] = service_org_type
service_one['email_branding'] = sample_uuid()
service_one['organisation'] = organisation_one
mocker.patch(
'app.organisations_client.get_organisation',
return_value=organisation_one,
)
page = client_request.get(
endpoint,
service_id=SERVICE_ONE_ID,
)
assert page.h1.text == 'Check your new branding'
assert 'Emails from service one will look like this' in normalize_spaces(page.text)
assert page.find('iframe')['src'] == url_for('main.email_template', branding_style=branding_preview_id)
assert normalize_spaces(page.select_one('.page-footer button').text) == 'Use this branding'
def test_email_branding_something_else_page(client_request, service_one):
# expect to have a "NHS" option as well as the
# fallback, so back button goes to choices page
service_one['organisation_type'] = 'nhs_central'
page = client_request.get(
'main.email_branding_something_else',
service_id=SERVICE_ONE_ID,
)
assert normalize_spaces(page.h1.text) == 'Describe the branding you want'
assert page.select_one('textarea')['name'] == ('something_else')
assert normalize_spaces(page.select_one('.page-footer button').text) == 'Request new branding'
assert page.select_one('.govuk-back-link')['href'] == url_for(
'main.email_branding_request', service_id=SERVICE_ONE_ID,
)
def test_get_email_branding_something_else_page_is_only_option(client_request, service_one):
# should only have a "something else" option
# so back button goes back to settings page
service_one['organisation_type'] = 'other'
page = client_request.get(
'main.email_branding_something_else',
service_id=SERVICE_ONE_ID,
)
assert page.select_one('.govuk-back-link')['href'] == url_for(
'main.service_settings', service_id=SERVICE_ONE_ID,
)
@pytest.mark.parametrize('endpoint', [
('main.email_branding_govuk'),
('main.email_branding_govuk_and_org'),
('main.email_branding_nhs'),
('main.email_branding_organisation'),
])
def test_email_branding_pages_give_404_if_selected_branding_not_allowed(
client_request,
endpoint,
):
# The only email branding allowed is 'something_else', so trying to visit any of the other
# endpoints gives a 404 status code.
client_request.get(
endpoint,
service_id=SERVICE_ONE_ID,
_expected_status=404
)
def test_email_branding_govuk_submit(
mocker,
client_request,
service_one,
organisation_one,
mock_get_service_settings_page_common,
no_reply_to_email_addresses,
mock_get_email_branding,
single_sms_sender,
mock_update_service,
):
mocker.patch(
'app.organisations_client.get_organisation',
return_value=organisation_one,
)
mocker.patch(
'app.models.service.Service.organisation_id',
new_callable=PropertyMock,
return_value=ORGANISATION_ID,
)
service_one['email_branding'] = sample_uuid()
page = client_request.post(
'.email_branding_govuk',
service_id=SERVICE_ONE_ID,
_follow_redirects=True,
)
mock_update_service.assert_called_once_with(
SERVICE_ONE_ID,
email_branding=None,
)
assert page.h1.text == 'Settings'
assert normalize_spaces(page.select_one('.banner-default').text) == 'Youve updated your email branding'
def test_email_branding_govuk_and_org_submit(
mocker,
client_request,
service_one,
organisation_one,
mock_get_service_settings_page_common,
no_reply_to_email_addresses,
mock_get_email_branding,
single_sms_sender,
):
mocker.patch(
'app.organisations_client.get_organisation',
return_value=organisation_one,
)
mocker.patch(
'app.models.service.Service.organisation_id',
new_callable=PropertyMock,
return_value=ORGANISATION_ID,
)
service_one['email_branding'] = sample_uuid()
mock_create_ticket = mocker.spy(NotifySupportTicket, '__init__')
mock_send_ticket_to_zendesk = mocker.patch(
'app.main.views.service_settings.zendesk_client.send_ticket_to_zendesk',
autospec=True,
)
page = client_request.post(
'.email_branding_govuk_and_org',
service_id=SERVICE_ONE_ID,
_follow_redirects=True,
)
mock_create_ticket.assert_called_once_with(
ANY,
message='\n'.join([
'Organisation: organisation one',
'Service: service one',
'http://localhost/services/596364a0-858e-42c8-9062-a8fe822260eb',
'',
'---',
'Current branding: Organisation name',
'Branding requested: GOV.UK and organisation one\n',
]),
subject='Email branding request - service one',
ticket_type='question',
user_name='Test User',
user_email='test@user.gov.uk',
org_id=ORGANISATION_ID,
org_type='central',
service_id=SERVICE_ONE_ID
)
mock_send_ticket_to_zendesk.assert_called_once()
assert normalize_spaces(page.select_one('.banner-default').text) == (
'Thanks for your branding request. Well get back to you '
'within one working day.'
)
def test_email_branding_nhs_submit(
mocker,
client_request,
service_one,
organisation_one,
mock_get_service_settings_page_common,
no_reply_to_email_addresses,
mock_get_email_branding,
single_sms_sender,
mock_update_service,
):
service_one['email_branding'] = sample_uuid()
service_one['organisation_type'] = 'nhs_local'
page = client_request.post(
'.email_branding_nhs',
service_id=SERVICE_ONE_ID,
_follow_redirects=True,
)
mock_update_service.assert_called_once_with(
SERVICE_ONE_ID,
email_branding=NHS_EMAIL_BRANDING_ID,
)
assert page.h1.text == 'Settings'
assert normalize_spaces(page.select_one('.banner-default').text) == 'Youve updated your email branding'
def test_email_branding_organisation_submit(
mocker,
client_request,
service_one,
organisation_one,
mock_get_service_settings_page_common,
no_reply_to_email_addresses,
mock_get_email_branding,
single_sms_sender,
):
mocker.patch(
'app.organisations_client.get_organisation',
return_value=organisation_one,
)
mocker.patch(
'app.models.service.Service.organisation_id',
new_callable=PropertyMock,
return_value=ORGANISATION_ID,
)
service_one['email_branding'] = sample_uuid()
mock_create_ticket = mocker.spy(NotifySupportTicket, '__init__')
mock_send_ticket_to_zendesk = mocker.patch(
'app.main.views.service_settings.zendesk_client.send_ticket_to_zendesk',
autospec=True,
)
page = client_request.post(
'.email_branding_organisation',
service_id=SERVICE_ONE_ID,
_follow_redirects=True,
)
mock_create_ticket.assert_called_once_with(
ANY,
message='\n'.join([
'Organisation: organisation one',
'Service: service one',
'http://localhost/services/596364a0-858e-42c8-9062-a8fe822260eb',
'',
'---',
'Current branding: Organisation name',
'Branding requested: organisation one\n',
]),
subject='Email branding request - service one',
ticket_type='question',
user_name='Test User',
user_email='test@user.gov.uk',
org_id=ORGANISATION_ID,
org_type='central',
service_id=SERVICE_ONE_ID
)
mock_send_ticket_to_zendesk.assert_called_once()
assert normalize_spaces(page.select_one('.banner-default').text) == (
'Thanks for your branding request. Well get back to you '
'within one working day.'
)
def test_email_branding_something_else_submit(
client_request,
mocker,
service_one,
mock_get_service_settings_page_common,
no_reply_to_email_addresses,
mock_get_email_branding,
single_sms_sender,
):
service_one['email_branding'] = sample_uuid()
service_one['organisation_type'] = 'nhs_local'
mock_create_ticket = mocker.spy(NotifySupportTicket, '__init__')
mock_send_ticket_to_zendesk = mocker.patch(
'app.main.views.service_settings.zendesk_client.send_ticket_to_zendesk',
autospec=True,
)
page = client_request.post(
'.email_branding_something_else',
service_id=SERVICE_ONE_ID,
_data={'something_else': 'Homer Simpson'},
_follow_redirects=True,
)
mock_create_ticket.assert_called_once_with(
ANY,
message='\n'.join([
'Organisation: Cant tell (domain is user.gov.uk)',
'Service: service one',
'http://localhost/services/596364a0-858e-42c8-9062-a8fe822260eb',
'',
'---',
'Current branding: Organisation name',
'Branding requested: Something else\n',
'Homer Simpson\n'
]),
subject='Email branding request - service one',
ticket_type='question',
user_name='Test User',
user_email='test@user.gov.uk',
org_id=None,
org_type='nhs_local',
service_id=SERVICE_ONE_ID
)
mock_send_ticket_to_zendesk.assert_called_once()
assert normalize_spaces(page.select_one('.banner-default').text) == (
'Thanks for your branding request. Well get back to you '
'within one working day.'
)
def test_email_branding_something_else_submit_shows_error_if_textbox_is_empty(
client_request,
):
page = client_request.post(
'.email_branding_something_else',
service_id=SERVICE_ONE_ID,
_data={'something_else': ''},
_follow_redirects=True,
)
assert normalize_spaces(page.h1.text) == 'Describe the branding you want'
assert normalize_spaces(page.select_one('.govuk-error-message').text) == 'Error: Cannot be empty'
@pytest.mark.parametrize('organisation_type, expected_options', (
('nhs_central', [
('nhs', 'NHS'),
('something_else', 'Something else'),
]),
('other', None),
))
def test_letter_branding_request_page_when_no_branding_is_set(
service_one,
client_request,
mock_get_email_branding,
mock_get_letter_branding_by_id,
organisation_type,
expected_options,
):
service_one['letter_branding'] = None
service_one['organisation_type'] = organisation_type
page = client_request.get(
'.letter_branding_request', service_id=SERVICE_ONE_ID
)
assert mock_get_email_branding.called is False
assert mock_get_letter_branding_by_id.called is False
button_text = normalize_spaces(page.select_one('.page-footer button').text)
assert button_text == 'Request new branding'
if expected_options:
assert [
(
radio['value'],
page.select_one('label[for={}]'.format(radio['id'])).text.strip()
)
for radio in page.select('input[type=radio]')
] == expected_options
assert page.select_one(
'.conditional-radios-panel#panel-something-else textarea'
)['name'] == (
'something_else'
)
else:
assert page.select_one(
'textarea'
)['name'] == (
'something_else'
)
assert not page.select('.conditional-radios-panel')
@pytest.mark.parametrize('from_template,back_link_url', [
(None, '/services/{}/service-settings'.format(SERVICE_ONE_ID),),
(TEMPLATE_ONE_ID, '/services/{}/templates/{}'.format(SERVICE_ONE_ID, TEMPLATE_ONE_ID),)
])
def test_letter_branding_request_page_back_link(
client_request,
from_template,
back_link_url,
):
if from_template:
page = client_request.get(
'.letter_branding_request', service_id=SERVICE_ONE_ID, from_template=from_template
)
else:
page = client_request.get(
'.letter_branding_request', service_id=SERVICE_ONE_ID
)
back_link = page.select('a[class=govuk-back-link]')
assert back_link[0].attrs['href'] == back_link_url
@pytest.mark.parametrize('org_name, expected_organisation', (
(None, 'Cant tell (domain is user.gov.uk)'),
('Test Organisation', 'Test Organisation'),
))
def test_letter_branding_request_submit(
client_request,
service_one,
mocker,
mock_get_service_settings_page_common,
mock_get_letter_branding_by_id,
no_reply_to_email_addresses,
no_letter_contact_blocks,
single_sms_sender,
org_name,
expected_organisation,
):
service_one['letter_branding'] = sample_uuid()
organisation_id = ORGANISATION_ID if org_name else None
mocker.patch(
'app.models.service.Service.organisation_id',
new_callable=PropertyMock,
return_value=organisation_id,
)
mocker.patch(
'app.organisations_client.get_organisation',
return_value=organisation_json(name=org_name),
)
mock_create_ticket = mocker.spy(NotifySupportTicket, '__init__')
mock_send_ticket_to_zendesk = mocker.patch(
'app.main.views.service_settings.zendesk_client.send_ticket_to_zendesk',
autospec=True,
)
page = client_request.post(
'.letter_branding_request', service_id=SERVICE_ONE_ID,
_data={
'options': 'something_else',
'something_else': 'Homer Simpson',
},
_follow_redirects=True,
)
mock_create_ticket.assert_called_once_with(
ANY,
message='\n'.join([
'Organisation: {}',
'Service: service one',
'http://localhost/services/596364a0-858e-42c8-9062-a8fe822260eb',
'',
'---',
'Current branding: HM Government',
'Branding requested: Something else\n\nHomer Simpson\n',
]).format(expected_organisation),
subject='Letter branding request - service one',
ticket_type='question',
user_name='Test User',
user_email='test@user.gov.uk',
org_id=organisation_id,
org_type='central',
service_id=SERVICE_ONE_ID
)
mock_send_ticket_to_zendesk.assert_called_once()
assert normalize_spaces(page.select_one('.banner-default').text) == (
'Thanks for your branding request. Well get back to you '
'within one working day.'
)
@pytest.mark.parametrize('data, error_message', (
({'options': 'something_else'}, 'Cannot be empty'), # no data in 'something_else' textbox
({'options': ''}, 'Select an option'), # no radio button selected
))
def test_letter_branding_request_submit_when_form_has_missing_data(
client_request,
mocker,
service_one,
organisation_one,
data,
error_message,
mock_get_letter_branding_by_id,
):
mocker.patch(
'app.organisations_client.get_organisation',
return_value=organisation_one,
)
service_one['letter_branding'] = sample_uuid()
service_one['organisation'] = organisation_one
page = client_request.post(
'.letter_branding_request', service_id=SERVICE_ONE_ID,
_data=data,
_follow_redirects=True,
)
assert page.h1.text == 'Change letter branding'
assert normalize_spaces(page.select_one('.error-message').text) == error_message
@pytest.mark.parametrize('from_template', [
None,
TEMPLATE_ONE_ID
])
def test_letter_branding_request_submit_redirects_if_from_template_is_set(
client_request,
service_one,
mocker,
mock_get_service_settings_page_common,
from_template,
):
mocker.patch('app.main.views.service_settings.zendesk_client.send_ticket_to_zendesk', autospec=True)
data = {'options': 'something_else', 'something_else': 'Homer Simpson'}
if from_template:
client_request.post(
'.letter_branding_request', service_id=SERVICE_ONE_ID, from_template=from_template,
_data=data,
_expected_redirect=url_for(
'main.view_template', service_id=SERVICE_ONE_ID, template_id=from_template, _external=True
)
)
else:
client_request.post(
'.letter_branding_request', service_id=SERVICE_ONE_ID,
_data=data,
_expected_redirect=url_for('main.service_settings', service_id=SERVICE_ONE_ID, _external=True)
)
def test_letter_branding_submit_when_something_else_is_only_option(
client_request,
service_one,
mocker,
mock_get_service_settings_page_common,
mock_get_letter_branding_by_id,
):
mock_create_ticket = mocker.spy(NotifySupportTicket, '__init__')
mocker.patch(
'app.main.views.service_settings.zendesk_client.send_ticket_to_zendesk',
autospec=True,
)
client_request.post(
'.letter_branding_request',
service_id=SERVICE_ONE_ID,
_data={
'something_else': 'Homer Simpson',
},
)
assert (
'Current branding: no\n'
'Branding requested: Something else\n'
'\n'
'Homer Simpson'
) in mock_create_ticket.call_args_list[0][1]['message']
def test_service_settings_links_to_branding_request_page_for_letters(
mocker,
service_one,