From 0ec086cd244e5676c124acc5fa3b8a7a7aab0f1f Mon Sep 17 00:00:00 2001 From: Katie Smith Date: Wed, 8 Jan 2020 09:10:04 +0000 Subject: [PATCH] Use fixtures for templates in a Pytest 5 compatible way --- tests/app/main/views/test_jobs.py | 8 +- tests/app/main/views/test_send.py | 250 ++++++++++++++----------- tests/app/main/views/test_templates.py | 57 +++--- tests/conftest.py | 41 +++- 4 files changed, 219 insertions(+), 137 deletions(-) diff --git a/tests/app/main/views/test_jobs.py b/tests/app/main/views/test_jobs.py index d1cb3fa5f..94c261aea 100644 --- a/tests/app/main/views/test_jobs.py +++ b/tests/app/main/views/test_jobs.py @@ -12,7 +12,7 @@ from tests.conftest import ( create_active_caseworking_user, create_active_user_with_permissions, create_notifications, - mock_get_service_letter_template, + create_template, normalize_spaces, ) @@ -768,8 +768,10 @@ def test_should_show_letter_job_with_first_class_if_no_notifications( mock_get_service_data_retention, mocker ): - - mock_get_service_letter_template(mocker, postage="first") + mocker.patch( + 'app.service_api_client.get_service_template', + return_value={'data': create_template(template_type='letter', postage='first')} + ) page = client_request.get( 'main.view_job', diff --git a/tests/app/main/views/test_send.py b/tests/app/main/views/test_send.py index bfc1a1a0f..45e7217c7 100644 --- a/tests/app/main/views/test_send.py +++ b/tests/app/main/views/test_send.py @@ -34,14 +34,12 @@ from tests.conftest import ( SERVICE_ONE_ID, create_active_caseworking_user, create_active_user_with_permissions, + create_multiple_email_reply_to_addresses, + create_multiple_sms_senders, + create_template, mock_get_service_email_template, mock_get_service_letter_template, mock_get_service_template, - mock_get_service_template_with_placeholders, - multiple_reply_to_email_addresses, - multiple_sms_senders, - multiple_sms_senders_no_inbound, - multiple_sms_senders_with_diff_default, normalize_spaces, ) @@ -54,72 +52,85 @@ test_spreadsheet_files = glob(path.join('tests', 'spreadsheet_files', '*')) test_non_spreadsheet_files = glob(path.join('tests', 'non_spreadsheet_files', '*')) -@pytest.mark.parametrize('template_mock, sender_data, expected_title, expected_description', [ - ( - mock_get_service_email_template, - multiple_reply_to_email_addresses, - 'Where should replies come back to?', - 'Where should replies come back to?', - ), - ( - mock_get_service_template, - multiple_sms_senders, - 'Who should the message come from?', - 'Who should the message come from?', - ) -]) -def test_show_correct_title_and_description_for_sender_type( +def test_show_correct_title_and_description_for_email_sender_type( client_request, - service_one, fake_uuid, - template_mock, - sender_data, - expected_title, - expected_description, - mocker + mock_get_service_email_template, + multiple_reply_to_email_addresses, ): - template_mock(mocker) - sender_data(mocker) - page = client_request.get( '.set_sender', - service_id=service_one['id'], + service_id=SERVICE_ONE_ID, template_id=fake_uuid ) - assert page.select_one('h1').text == expected_title + assert page.select_one('h1').text == 'Where should replies come back to?' for element in ('legend', 'legend .govuk-visually-hidden'): - assert normalize_spaces(page.select_one(element).text) == expected_description + assert normalize_spaces(page.select_one(element).text) == 'Where should replies come back to?' -@pytest.mark.parametrize('template_mock, sender_data', [ - ( - mock_get_service_email_template, - multiple_reply_to_email_addresses, - ), - ( - mock_get_service_template, - multiple_sms_senders_with_diff_default - ), - ( - mock_get_service_template, - multiple_sms_senders_no_inbound - ) -]) -def test_default_sender_is_checked_and_has_hint( +def test_show_correct_title_and_description_for_sms_sender_type( client_request, - service_one, fake_uuid, - template_mock, - sender_data, - mocker + mock_get_service_template, + multiple_sms_senders, ): - template_mock(mocker) - sender_data(mocker) page = client_request.get( '.set_sender', - service_id=service_one['id'], + service_id=SERVICE_ONE_ID, + template_id=fake_uuid + ) + + assert page.select_one('h1').text == 'Who should the message come from?' + + for element in ('legend', 'legend .govuk-visually-hidden'): + assert normalize_spaces(page.select_one(element).text) == 'Who should the message come from?' + + +def test_default_email_sender_is_checked_and_has_hint( + client_request, + fake_uuid, + mock_get_service_email_template, + multiple_reply_to_email_addresses, +): + page = client_request.get( + '.set_sender', + service_id=SERVICE_ONE_ID, + template_id=fake_uuid + ) + + assert page.select('.multiple-choice input')[0].has_attr('checked') + assert normalize_spaces(page.select_one('.multiple-choice label .block-label-hint').text) == "(Default)" + assert not page.select('.multiple-choice input')[1].has_attr('checked') + + +def test_default_sms_sender_is_checked_and_has_hint( + client_request, + fake_uuid, + mock_get_service_template, + multiple_sms_senders_with_diff_default, +): + page = client_request.get( + '.set_sender', + service_id=SERVICE_ONE_ID, + template_id=fake_uuid + ) + + assert page.select('.multiple-choice input')[0].has_attr('checked') + assert normalize_spaces(page.select_one('.multiple-choice label .block-label-hint').text) == "(Default)" + assert not page.select('.multiple-choice input')[1].has_attr('checked') + + +def test_default_sms_sender_is_checked_and_has_hint_when_there_are_no_inbound_numbers( + client_request, + fake_uuid, + mock_get_service_template, + multiple_sms_senders_no_inbound, +): + page = client_request.get( + '.set_sender', + service_id=SERVICE_ONE_ID, template_id=fake_uuid ) @@ -168,26 +179,32 @@ def test_sms_sender_has_receives_replies_hint( assert not page.select('.multiple-choice input')[2].has_attr('checked') -@pytest.mark.parametrize('template_mock, sender_data', [ +@pytest.mark.parametrize('template_type, sender_data', [ ( - mock_get_service_email_template, - multiple_reply_to_email_addresses, + 'email', + create_multiple_email_reply_to_addresses(), ), ( - mock_get_service_template, - multiple_sms_senders + 'sms', + create_multiple_sms_senders() ) ]) def test_sender_session_is_present_after_selected( client_request, service_one, fake_uuid, - template_mock, + template_type, sender_data, mocker ): - template_mock(mocker) - sender_data(mocker) + template_data = create_template(template_type=template_type) + mocker.patch('app.service_api_client.get_service_template', return_value={'data': template_data}) + + if template_type == 'email': + mocker.patch('app.service_api_client.get_reply_to_email_addresses', return_value=sender_data) + else: + mocker.patch('app.service_api_client.get_sms_senders', return_value=sender_data) + client_request.post( '.set_sender', service_id=service_one['id'], @@ -989,47 +1006,54 @@ def test_send_test_doesnt_show_file_contents( assert page.select_one('button[type=submit]').text.strip() == 'Send 1 text message' -@pytest.mark.parametrize('user, endpoint, template_mock, expected_recipient', [ +@pytest.mark.parametrize('user, endpoint, template_type, content_has_placeholders, expected_recipient', [ ( create_active_user_with_permissions(), 'main.send_test_step', - mock_get_service_template_with_placeholders, + 'sms', + True, '07700 900762' ), ( create_active_user_with_permissions(), 'main.send_test_step', - mock_get_service_email_template, + 'email', + False, 'test@user.gov.uk' ), ( create_active_caseworking_user(), 'main.send_test_step', - mock_get_service_email_template, + 'email', + False, 'caseworker@example.gov.uk' ), ( create_active_user_with_permissions(), 'main.send_test_step', - mock_get_service_letter_template, + 'letter', + False, None ), ( create_active_user_with_permissions(), 'main.send_one_off_step', - mock_get_service_template, + 'sms', + False, None ), ( create_active_user_with_permissions(), 'main.send_one_off_step', - mock_get_service_email_template, + 'email', + False, None ), ( create_active_user_with_permissions(), 'main.send_one_off_step', - mock_get_service_letter_template, + 'letter', + False, None ), ]) @@ -1040,13 +1064,18 @@ def test_send_test_step_redirects_if_session_not_setup( mock_get_users_by_service, mock_has_no_jobs, fake_uuid, - endpoint, - template_mock, - expected_recipient, user, + endpoint, + template_type, + content_has_placeholders, + expected_recipient, ): mocker.patch('app.user_api_client.get_user', return_value=user) - template_mock(mocker) + + template_content = 'Hi ((name))' if content_has_placeholders else 'Hi there' + template_data = create_template(template_type=template_type, content=template_content) + mocker.patch('app.service_api_client.get_service_template', return_value={'data': template_data}) + mocker.patch('app.main.views.send.get_page_count_for_letter', return_value=9) with client_request.session_transaction() as session: @@ -1094,51 +1123,51 @@ def test_send_one_off_does_not_send_without_the_correct_permissions( create_active_user_with_permissions(), create_active_caseworking_user(), )) -@pytest.mark.parametrize('template_mock, partial_url, expected_h1, tour_shown', [ +@pytest.mark.parametrize('template_type, partial_url, expected_h1, tour_shown', [ ( - mock_get_service_template_with_placeholders, + 'sms', partial(url_for, 'main.send_test'), 'Personalise this message', False, ), ( - mock_get_service_template_with_placeholders, + 'sms', partial(url_for, 'main.send_one_off'), 'Send ‘Two week reminder’', False, ), ( - mock_get_service_template_with_placeholders, + 'sms', partial(url_for, 'main.send_test', help=1), 'Example text message', True, ), ( - mock_get_service_email_template, + 'email', partial(url_for, 'main.send_test', help=1), 'Example text message', True, ), ( - mock_get_service_email_template, + 'email', partial(url_for, 'main.send_test'), 'Personalise this message', False, ), ( - mock_get_service_email_template, + 'email', partial(url_for, 'main.send_one_off'), 'Send ‘Two week reminder’', False, ), ( - mock_get_service_letter_template, + 'letter', partial(url_for, 'main.send_test'), 'Send ‘Two week reminder’', False, ), ( - mock_get_service_letter_template, + 'letter', partial(url_for, 'main.send_one_off'), 'Send ‘Two week reminder’', False, @@ -1150,14 +1179,15 @@ def test_send_one_off_or_test_has_correct_page_titles( mock_has_no_jobs, fake_uuid, mocker, - template_mock, + template_type, partial_url, expected_h1, tour_shown, user, ): mocker.patch('app.user_api_client.get_user', return_value=user) - template_mock(mocker) + template_data = create_template(template_type=template_type, name='Two week reminder', content='Hi there ((name))') + mocker.patch('app.service_api_client.get_service_template', return_value={'data': template_data}) mocker.patch('app.main.views.send.get_page_count_for_letter', return_value=9) response = logged_in_client.get( @@ -1229,27 +1259,27 @@ def test_send_one_off_or_test_shows_placeholders_in_correct_order( assert normalize_spaces(page.select_one('label').text) == expected_field_label -@pytest.mark.parametrize('user, template_mock, expected_link_text, expected_link_url', [ +@pytest.mark.parametrize('user, template_type, expected_link_text, expected_link_url', [ ( create_active_user_with_permissions(), - mock_get_service_template, + 'sms', 'Use my phone number', partial(url_for, 'main.send_test') ), ( create_active_user_with_permissions(), - mock_get_service_email_template, + 'email', 'Use my email address', partial(url_for, 'main.send_test') ), ( create_active_user_with_permissions(), - mock_get_service_letter_template, + 'letter', None, None ), ( create_active_caseworking_user(), - mock_get_service_template, + 'sms', None, None ), ]) @@ -1260,13 +1290,14 @@ def test_send_one_off_has_skip_link( mock_get_service_email_template, mock_has_no_jobs, mocker, - template_mock, + template_type, expected_link_text, expected_link_url, user, ): mocker.patch('app.user_api_client.get_user', return_value=user) - template_mock(mocker) + template_data = create_template(template_id=fake_uuid, template_type=template_type) + mocker.patch('app.service_api_client.get_service_template', return_value={'data': template_data}) mocker.patch('app.main.views.send.get_page_count_for_letter', return_value=9) page = client_request.get( @@ -1289,20 +1320,21 @@ def test_send_one_off_has_skip_link( assert not skip_links -@pytest.mark.parametrize('template_mock, expected_sticky', [ - (mock_get_service_template, False), - (mock_get_service_email_template, True), - (mock_get_service_letter_template, True), +@pytest.mark.parametrize('template_type, expected_sticky', [ + ('sms', False), + ('email', True), + ('letter', True), ]) def test_send_one_off_has_sticky_header_for_email_and_letter( mocker, client_request, fake_uuid, mock_has_no_jobs, - template_mock, + template_type, expected_sticky, ): - template_mock(mocker) + template_data = create_template(template_type=template_type) + mocker.patch('app.service_api_client.get_service_template', return_value={'data': template_data}) mocker.patch('app.main.views.send.get_page_count_for_letter', return_value=9) page = client_request.get( @@ -2534,25 +2566,29 @@ def test_route_permissions_sending( @pytest.mark.parametrize( - 'template_mock, extra_args, expected_url', + 'template_type, has_placeholders, extra_args, expected_url', [ ( - mock_get_service_template, + 'sms', + False, dict(), partial(url_for, '.send_messages') ), ( - mock_get_service_template_with_placeholders, + 'sms', + True, dict(), partial(url_for, '.send_messages') ), ( - mock_get_service_letter_template, # No placeholders + 'letter', + False, dict(from_test=True), partial(url_for, '.send_test') ), ( - mock_get_service_template_with_placeholders, + 'sms', + True, dict(from_test=True), partial(url_for, '.send_test') ) @@ -2570,12 +2606,14 @@ def test_check_messages_back_link( mock_s3_set_metadata, fake_uuid, mocker, - template_mock, + template_type, + has_placeholders, extra_args, expected_url ): - - template_mock(mocker) + content = 'Hi there ((name))' if has_placeholders else 'Hi there' + template_data = create_template(template_id=fake_uuid, template_type=template_type, content=content) + mocker.patch('app.service_api_client.get_service_template', return_value={'data': template_data}) mocker.patch( 'app.main.views.send.get_page_count_for_letter', diff --git a/tests/app/main/views/test_templates.py b/tests/app/main/views/test_templates.py index fd6f2cfd2..fde9b8f0b 100644 --- a/tests/app/main/views/test_templates.py +++ b/tests/app/main/views/test_templates.py @@ -29,9 +29,7 @@ from tests.conftest import ( create_active_caseworking_user, create_active_user_view_permissions, create_letter_contact_block, - mock_get_service_email_template, - mock_get_service_letter_template, - mock_get_service_template, + create_template, normalize_spaces, ) @@ -495,7 +493,11 @@ def test_view_letter_template_displays_postage( ): mocker.patch('app.main.views.templates.get_page_count_for_letter', return_value=1) client_request.login(active_user_with_permissions) - mock_get_service_letter_template(mocker, postage=template_postage) + mocker.patch( + 'app.service_api_client.get_service_template', + return_value={'data': create_template(template_type='letter', postage=template_postage)} + ) + page = client_request.get( 'main.view_template', service_id=SERVICE_ONE_ID, @@ -534,7 +536,11 @@ def test_view_letter_template_does_not_display_send_button_if_template_over_10_p ): mocker.patch('app.main.views.templates.get_page_count_for_letter', return_value=11) client_request.login(active_user_with_permissions) - mock_get_service_letter_template(mocker, postage="second") + mocker.patch( + 'app.service_api_client.get_service_template', + return_value={'data': create_template(template_type='letter', postage='second')} + ) + page = client_request.get( 'main.view_template', service_id=SERVICE_ONE_ID, @@ -1300,10 +1306,10 @@ def test_should_not_allow_creation_of_a_template_without_correct_permission( ) -@pytest.mark.parametrize('fixture, expected_status_code', [ - (mock_get_service_email_template, 200), - (mock_get_service_template, 200), - (mock_get_service_letter_template, 302), +@pytest.mark.parametrize('template_type, expected_status_code', [ + ('email', 200), + ('sms', 200), + ('letter', 302), ]) def test_should_redirect_to_one_off_if_template_type_is_letter( client_request, @@ -1311,10 +1317,13 @@ def test_should_redirect_to_one_off_if_template_type_is_letter( multiple_sms_senders, fake_uuid, mocker, - fixture, + template_type, expected_status_code ): - fixture(mocker) + mocker.patch( + 'app.service_api_client.get_service_template', + return_value={'data': create_template(template_type=template_type)} + ) client_request.get( '.set_sender', service_id=SERVICE_ONE_ID, @@ -1506,11 +1515,14 @@ def test_should_show_interstitial_when_making_breaking_change( old_content, expected_paragraphs, ): - mock_get_service_email_template( - mocker, + email_template = create_template( + template_id=fake_uuid, + template_type='email', subject="Your ((thing)) is due soon", - content=old_content, + content=old_content ) + mocker.patch('app.service_api_client.get_service_template', return_value={'data': email_template}) + data = { 'id': fake_uuid, 'name': "new name", @@ -2048,18 +2060,17 @@ def test_should_show_template_as_first_page_of_tour( ) -@pytest.mark.parametrize('template_mock', [ - mock_get_service_email_template, - mock_get_service_letter_template, -]) +@pytest.mark.parametrize('template_type', ['email', 'letter']) def test_cant_see_email_template_in_tour( client_request, fake_uuid, mocker, - template_mock, + template_type, ): - - template_mock(mocker) + mocker.patch( + 'app.service_api_client.get_service_template', + return_value={'data': create_template(template_type=template_type)} + ) client_request.get( 'main.start_tour', @@ -2124,8 +2135,8 @@ def test_should_show_hint_once_template_redacted( mock_get_template_folders, fake_uuid, ): - - mock_get_service_email_template(mocker, redact_personalisation=True) + template = create_template(template_type='email', content='hi ((name))', redact_personalisation=True) + mocker.patch('app.service_api_client.get_service_template', return_value={'data': template}) page = client_request.get( 'main.view_template', diff --git a/tests/conftest.py b/tests/conftest.py index 5a78cf586..3305e2dcb 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -866,11 +866,20 @@ def mock_get_service_email_template(mocker, content=None, subject=None, redact_p @pytest.fixture(scope='function') def mock_get_service_email_template_without_placeholders(mocker): - return mock_get_service_email_template( - mocker, - content="Your vehicle tax expires soon", - subject="Your thing is due soon", - ) + def _get(service_id, template_id, version=None): + template = template_json( + service_id, + template_id, + "Two week reminder", + "email", + "Your vehicle tax expires soon", + "Your thing is due soon", + redact_personalisation=False, + ) + return {'data': template} + + return mocker.patch( + 'app.service_api_client.get_service_template', side_effect=_get) @pytest.fixture(scope='function') @@ -3966,3 +3975,25 @@ def create_notifications( created_by_name='Firstname Lastname', postage=postage ) + + +def create_template( + service_id=SERVICE_ONE_ID, + template_id=None, + template_type='sms', + name='sample template', + content='Template content', + subject='Template subject', + redact_personalisation=False, + postage=None +): + return template_json( + service_id=service_id, + id_=template_id or str(generate_uuid()), + name=name, + type_=template_type, + content=content, + subject=subject, + redact_personalisation=redact_personalisation, + postage=postage, + )