fix service settings letter branding tests

some tests are now expanded to handle the fact that letter branding
can be null
This commit is contained in:
Leo Hemsted
2019-02-07 11:38:20 +00:00
parent 3be82bafd5
commit 5405c2e1be
5 changed files with 144 additions and 62 deletions
+1 -1
View File
@@ -167,8 +167,8 @@ def service_json(
'email_branding': email_branding, 'email_branding': email_branding,
'branding': branding, 'branding': branding,
'created_at': created_at or str(datetime.utcnow()), 'created_at': created_at or str(datetime.utcnow()),
'letter_branding': None,
'letter_contact_block': letter_contact_block, 'letter_contact_block': letter_contact_block,
'dvla_organisation': '001',
'permissions': permissions, 'permissions': permissions,
'inbound_api': inbound_api, 'inbound_api': inbound_api,
'service_callback_api': service_callback_api, 'service_callback_api': service_callback_api,
@@ -10,7 +10,7 @@ def get_service_settings_page(
platform_admin_user, platform_admin_user,
service_one, service_one,
mock_get_inbound_number_for_service, mock_get_inbound_number_for_service,
mock_get_letter_branding, mock_get_all_letter_branding,
mock_get_service_organisation, mock_get_service_organisation,
mock_get_free_sms_fragment_limit, mock_get_free_sms_fragment_limit,
no_reply_to_email_addresses, no_reply_to_email_addresses,
@@ -94,7 +94,7 @@ def test_normal_user_doesnt_see_any_toggle_buttons(
no_letter_contact_blocks, no_letter_contact_blocks,
mock_get_service_organisation, mock_get_service_organisation,
single_sms_sender, single_sms_sender,
mock_get_letter_branding, mock_get_all_letter_branding,
mock_get_inbound_number_for_service, mock_get_inbound_number_for_service,
mock_get_free_sms_fragment_limit, mock_get_free_sms_fragment_limit,
mock_get_service_data_retention mock_get_service_data_retention
+72 -47
View File
@@ -1,8 +1,7 @@
import uuid
from functools import partial from functools import partial
from unittest.mock import ANY, PropertyMock, call from unittest.mock import ANY, PropertyMock, call
from urllib.parse import parse_qs, urlparse from urllib.parse import parse_qs, urlparse
from uuid import uuid4 from uuid import UUID, uuid4
import pytest import pytest
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
@@ -38,7 +37,7 @@ from tests.conftest import (
@pytest.fixture @pytest.fixture
def mock_get_service_settings_page_common( def mock_get_service_settings_page_common(
mock_get_letter_branding, mock_get_all_letter_branding,
mock_get_inbound_number_for_service, mock_get_inbound_number_for_service,
mock_get_free_sms_fragment_limit, mock_get_free_sms_fragment_limit,
mock_get_service_data_retention, mock_get_service_data_retention,
@@ -95,7 +94,7 @@ def mock_get_service_settings_page_common(
'Organisation type Central Change', 'Organisation type Central Change',
'Free text message allowance 250,000 Change', 'Free text message allowance 250,000 Change',
'Email branding GOV.UK Change', 'Email branding GOV.UK Change',
'Letter branding HM Government Change', 'Letter branding Change',
'Data retention email Change' 'Data retention email Change'
]), ]),
@@ -187,7 +186,7 @@ def test_should_show_overview(
'Label Value Action', 'Label Value Action',
'Send letters On Change', 'Send letters On Change',
'Sender addresses 1 Example Street Manage', 'Sender addresses 1 Example Street Manage',
'Letter branding HM Government Change', 'Letter branding None Change',
]), ]),
]) ])
@@ -1173,7 +1172,7 @@ def test_route_for_platform_admin_update_service(
client, client,
platform_admin_user, platform_admin_user,
service_one, service_one,
mock_get_letter_branding, mock_get_all_letter_branding,
route, route,
): ):
mocker.patch('app.service_api_client.archive_service') mocker.patch('app.service_api_client.archive_service')
@@ -2033,7 +2032,7 @@ def test_set_letter_contact_block_redirects_to_template(
mock_update_service, mock_update_service,
): ):
service_one['permissions'] = ['letter'] service_one['permissions'] = ['letter']
fake_template_id = uuid.uuid4() fake_template_id = uuid4()
response = logged_in_client.post( response = logged_in_client.post(
url_for( url_for(
'main.service_set_letter_contact_block', 'main.service_set_letter_contact_block',
@@ -2069,15 +2068,14 @@ def test_set_letter_contact_block_has_max_10_lines(
def test_request_letter_branding( def test_request_letter_branding(
client_request, client_request,
mock_get_letter_branding, mock_get_letter_branding_by_id,
service_one
): ):
request_page = client_request.get( request_page = client_request.get(
'main.request_letter_branding', 'main.request_letter_branding',
service_id=SERVICE_ONE_ID, service_id=SERVICE_ONE_ID,
) )
assert request_page.select_one('main p').text.strip() == ( assert request_page.select_one('main p').text.strip() == 'Your letters have no logo.'
'Your letters have the HM Government logo.'
)
link_href = request_page.select_one('main a')['href'] link_href = request_page.select_one('main a')['href']
feedback_page = client_request.get_url(link_href) feedback_page = client_request.get_url(link_href)
assert feedback_page.select_one('textarea').text.strip() == ( assert feedback_page.select_one('textarea').text.strip() == (
@@ -2085,70 +2083,97 @@ def test_request_letter_branding(
) )
def test_set_letter_branding_platform_admin_only( def test_request_letter_branding_if_already_have_branding(
client_request,
mock_get_letter_branding_by_id,
service_one,
):
service_one['letter_branding'] = uuid4()
request_page = client_request.get(
'main.request_letter_branding',
service_id=SERVICE_ONE_ID,
)
mock_get_letter_branding_by_id.assert_called_once_with(service_one['letter_branding'])
assert request_page.select_one('main p').text.strip() == 'Your letters have the HM Government logo.'
def test_service_set_letter_branding_platform_admin_only(
logged_in_client, logged_in_client,
service_one, service_one,
): ):
response = logged_in_client.get(url_for('main.set_letter_branding', service_id=service_one['id'])) response = logged_in_client.get(url_for('main.service_set_letter_branding', service_id=service_one['id']))
assert response.status_code == 403 assert response.status_code == 403
@pytest.mark.parametrize('current_dvla_org_id, expected_selected, expected_items', [ @pytest.mark.parametrize('letter_branding, expected_selected, expected_items', [
(None, '001', ( # expected order: currently selected, then default, then rest alphabetically
('001', 'HM Government'), (None, '__NONE__', (
('999', 'Animal and Plant Health Agency'), ('__NONE__', 'None'),
('500', 'Land Registry'), (str(UUID(int=2)), 'Animal and Plant Health Agency'),
(str(UUID(int=0)), 'HM Government'),
(str(UUID(int=1)), 'Land Registry'),
)), )),
('500', '500', ( (str(UUID(int=1)), str(UUID(int=1)), (
('500', 'Land Registry'), (str(UUID(int=1)), 'Land Registry'),
('001', 'HM Government'), ('__NONE__', 'None'),
('999', 'Animal and Plant Health Agency'), (str(UUID(int=2)), 'Animal and Plant Health Agency'),
(str(UUID(int=0)), 'HM Government'),
)), )),
('999', '999', ( (str(UUID(int=2)), str(UUID(int=2)), (
('999', 'Animal and Plant Health Agency'), (str(UUID(int=2)), 'Animal and Plant Health Agency'),
('001', 'HM Government'), ('__NONE__', 'None'),
('500', 'Land Registry'), (str(UUID(int=0)), 'HM Government'),
(str(UUID(int=1)), 'Land Registry'),
)), )),
]) ])
def test_set_letter_branding_prepopulates( def test_service_set_letter_branding_prepopulates(
logged_in_platform_admin_client, logged_in_platform_admin_client,
service_one, service_one,
mock_get_letter_branding, mock_get_all_letter_branding,
current_dvla_org_id, letter_branding,
expected_selected, expected_selected,
expected_items, expected_items,
): ):
if current_dvla_org_id: service_one['letter_branding'] = letter_branding
service_one['dvla_organisation'] = current_dvla_org_id response = logged_in_platform_admin_client.get(
response = logged_in_platform_admin_client.get(url_for('main.set_letter_branding', service_id=service_one['id'])) url_for('main.service_set_letter_branding', service_id=service_one['id'])
)
assert response.status_code == 200 assert response.status_code == 200
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
for element in {'label[for^=dvla_org_id]', 'input[type=radio]'}:
assert len(page.select(element)) == len(expected_items)
for index, expected_item in enumerate(expected_items):
expected_value, expected_label = expected_item
assert normalize_spaces(page.select('label[for^=dvla_org_id]')[index].text) == expected_label
assert page.select('input[type=radio]')[index]['value'] == expected_value
assert len(page.select('input[checked]')) == 1 assert len(page.select('input[checked]')) == 1
assert page.select('input[checked]')[0]['value'] == expected_selected assert page.select('input[checked]')[0]['value'] == expected_selected
for element in {'label[for^=branding_style]', 'input[type=radio]'}:
assert len(page.select(element)) == len(expected_items)
def test_set_letter_branding_saves( for index, expected_item in enumerate(expected_items):
expected_value, expected_label = expected_item
assert normalize_spaces(page.select('label[for^=branding_style]')[index].text) == expected_label
assert page.select('input[type=radio]')[index]['value'] == expected_value
@pytest.mark.parametrize('selected_letter_branding, expected_post_data', [
(str(UUID(int=1)), str(UUID(int=1))),
('__NONE__', None),
])
def test_service_set_letter_branding_saves(
logged_in_platform_admin_client, logged_in_platform_admin_client,
service_one, service_one,
mock_update_service, mock_update_service,
mock_get_letter_branding, mock_get_all_letter_branding,
selected_letter_branding,
expected_post_data
): ):
response = logged_in_platform_admin_client.post( response = logged_in_platform_admin_client.post(
url_for('main.set_letter_branding', service_id=service_one['id']), url_for('main.service_set_letter_branding', service_id=service_one['id']),
data={'dvla_org_id': '500'} data={'branding_style': selected_letter_branding}
) )
assert response.status_code == 302 assert response.status_code == 302
assert response.location == url_for('main.service_settings', service_id=service_one['id'], _external=True) assert response.location == url_for('main.service_settings', service_id=service_one['id'], _external=True)
mock_update_service.assert_called_once_with(service_one['id'], dvla_organisation='500') mock_update_service.assert_called_once_with(service_one['id'], letter_branding=expected_post_data)
@pytest.mark.parametrize('current_branding, expected_values, expected_labels', [ @pytest.mark.parametrize('current_branding, expected_values, expected_labels', [
@@ -3063,7 +3088,7 @@ def test_service_settings_when_inbound_number_is_not_set(
mock_get_service_organisation, mock_get_service_organisation,
single_sms_sender, single_sms_sender,
mocker, mocker,
mock_get_letter_branding, mock_get_all_letter_branding,
mock_get_free_sms_fragment_limit, mock_get_free_sms_fragment_limit,
mock_get_service_data_retention, mock_get_service_data_retention,
): ):
@@ -3081,7 +3106,7 @@ def test_set_inbound_sms_when_inbound_number_is_not_set(
single_reply_to_email_address, single_reply_to_email_address,
single_letter_contact_block, single_letter_contact_block,
mocker, mocker,
mock_get_letter_branding, mock_get_all_letter_branding,
): ):
mocker.patch('app.inbound_number_client.get_inbound_sms_number_for_service', mocker.patch('app.inbound_number_client.get_inbound_sms_number_for_service',
return_value={'data': {}}) return_value={'data': {}})
@@ -1,11 +1,38 @@
from app.notify_client.letter_branding_client import LetterBrandingClient from app.notify_client.letter_branding_client import LetterBrandingClient
def test_get_letter_branding(mocker): def test_get_letter_branding(mocker, fake_uuid):
mock_get = mocker.patch('app.notify_client.letter_branding_client.LetterBrandingClient.get') mock_get = mocker.patch(
LetterBrandingClient().get_letter_branding() 'app.notify_client.letter_branding_client.LetterBrandingClient.get',
mock_get.assert_called_once_with( return_value={'foo': 'bar'}
url='/dvla_organisations' )
mock_redis_get = mocker.patch('app.notify_client.RedisClient.get', return_value=None)
mock_redis_set = mocker.patch('app.notify_client.RedisClient.set')
LetterBrandingClient().get_letter_branding(fake_uuid)
mock_get.assert_called_once_with(url='/letter-branding/{}'.format(fake_uuid))
mock_redis_get.assert_called_once_with('letter_branding-{}'.format(fake_uuid))
mock_redis_set.assert_called_once_with(
'letter_branding-{}'.format(fake_uuid),
'{"foo": "bar"}',
ex=604800,
)
def test_get_all_letter_branding(mocker):
mock_get = mocker.patch('app.notify_client.letter_branding_client.LetterBrandingClient.get', return_value=[1, 2, 3])
mock_redis_get = mocker.patch('app.notify_client.RedisClient.get', return_value=None)
mock_redis_set = mocker.patch('app.notify_client.RedisClient.set')
LetterBrandingClient().get_all_letter_branding()
mock_get.assert_called_once_with(url='/letter-branding')
mock_redis_get.assert_called_once_with('letter_branding')
mock_redis_set.assert_called_once_with(
'letter_branding',
'[1, 2, 3]',
ex=604800,
) )
+37 -7
View File
@@ -3,6 +3,7 @@ import os
from contextlib import contextmanager from contextlib import contextmanager
from datetime import date, datetime, timedelta from datetime import date, datetime, timedelta
from unittest.mock import Mock from unittest.mock import Mock
from uuid import UUID
import pytest import pytest
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
@@ -2548,16 +2549,45 @@ def mock_get_email_branding_that_can_fit_onscreen(mocker):
@pytest.fixture(scope='function') @pytest.fixture(scope='function')
def mock_get_letter_branding(mocker): def mock_get_all_letter_branding(mocker):
def _get_letter_branding(): def _get_letter_branding():
return { return [
'001': 'HM Government', {
'500': 'Land Registry', 'id': str(UUID(int=0)),
'999': 'Animal and Plant Health Agency', 'name': 'HM Government',
} 'filename': 'hm-government',
'domain': None,
},
{
'id': str(UUID(int=1)),
'name': 'Land Registry',
'filename': 'land-registry',
'domain': None,
},
{
'id': str(UUID(int=2)),
'name': 'Animal and Plant Health Agency',
'filename': 'animal',
'domain': None,
}
]
return mocker.patch( return mocker.patch(
'app.letter_branding_client.get_letter_branding', side_effect=_get_letter_branding 'app.letter_branding_client.get_all_letter_branding', side_effect=_get_letter_branding
)
@pytest.fixture
def mock_get_letter_branding_by_id(mocker):
def _get_branding_by_id(_id):
return {
'id': _id,
'name': 'HM Government',
'filename': 'hm-government',
'domain': None,
}
return mocker.patch(
'app.letter_branding_client.get_letter_branding', side_effect=_get_branding_by_id
) )