diff --git a/app/templates/views/service-settings/set-auth-type.html b/app/templates/views/service-settings/set-auth-type.html index 338c027e2..ef163ab5e 100644 --- a/app/templates/views/service-settings/set-auth-type.html +++ b/app/templates/views/service-settings/set-auth-type.html @@ -3,7 +3,7 @@ {% from "components/page-footer.html" import page_footer %} {% block service_page_title %} - Text message sender + Sign-in method {% endblock %} {% block maincolumn_content %} diff --git a/app/templates/views/templates/action_blocked.html b/app/templates/views/templates/action_blocked.html index a9b52d72d..2e6e641bc 100644 --- a/app/templates/views/templates/action_blocked.html +++ b/app/templates/views/templates/action_blocked.html @@ -3,7 +3,7 @@ {% from "components/page-footer.html" import page_footer %} {% block service_page_title %} - Emails + {{ notification_type.capitalize() }} are disabled {% endblock %} {% block maincolumn_content %} diff --git a/tests/app/main/views/organisations/test_organisation_invites.py b/tests/app/main/views/organisations/test_organisation_invites.py index 145b8868c..bff550321 100644 --- a/tests/app/main/views/organisations/test_organisation_invites.py +++ b/tests/app/main/views/organisations/test_organisation_invites.py @@ -50,7 +50,7 @@ def test_organisation_page_shows_all_organisations( def test_view_organisation_shows_the_correct_organisation( - logged_in_client, + client_request, mocker ): org = {'id': ORGANISATION_ID, 'name': 'Test 1', 'active': True} @@ -61,13 +61,11 @@ def test_view_organisation_shows_the_correct_organisation( 'app.organisations_client.get_organisation_services', return_value=[] ) - response = logged_in_client.get( - url_for('.organisation_dashboard', org_id=ORGANISATION_ID) + page = client_request.get( + '.organisation_dashboard', + org_id=ORGANISATION_ID, ) - assert response.status_code == 200 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') - assert normalize_spaces(page.select_one('.heading-large').text) == 'Services' @@ -92,19 +90,17 @@ def test_create_new_organisation( def test_organisation_services_show( - logged_in_client, + client_request, mock_get_organisation, mock_get_organisation_services, mocker, fake_uuid, ): - response = logged_in_client.get( - url_for('.organisation_dashboard', org_id=ORGANISATION_ID), + page = client_request.get( + '.organisation_dashboard', + org_id=ORGANISATION_ID, ) - assert response.status_code == 200 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') - assert len(page.select('.browse-list-item')) == 3 for i in range(0, 2): @@ -121,20 +117,18 @@ def test_organisation_services_show( def test_view_team_members( - logged_in_client, + client_request, mocker, mock_get_organisation, mock_get_users_for_organisation, mock_get_invited_users_for_organisation, fake_uuid ): - response = logged_in_client.get( - url_for('.manage_org_users', org_id=ORGANISATION_ID), + page = client_request.get( + '.manage_org_users', + org_id=ORGANISATION_ID, ) - assert response.status_code == 200 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') - for i in range(0, 2): assert normalize_spaces( page.select('.user-list-item .heading-small')[i].text @@ -146,7 +140,7 @@ def test_view_team_members( def test_invite_org_user( - logged_in_client, + client_request, mocker, mock_get_organisation, sample_org_invite, @@ -157,9 +151,10 @@ def test_invite_org_user( return_value=InvitedOrgUser(**sample_org_invite) ) - logged_in_client.post( - url_for('.invite_org_user', org_id=ORGANISATION_ID), - data={'email_address': 'test@example.gov.uk'} + client_request.post( + '.invite_org_user', + org_id=ORGANISATION_ID, + _data={'email_address': 'test@example.gov.uk'} ) mock_invite_org_user.assert_called_once_with( @@ -196,18 +191,18 @@ def test_invite_org_user_errors_when_same_email_as_inviter( def test_accepted_invite_when_user_already_logged_in( - logged_in_client, + client_request, mock_check_org_invite_token ): - response = logged_in_client.get( - url_for('main.accept_org_invite', token='thisisnotarealtoken'), - follow_redirects=True + page = client_request.get( + 'main.accept_org_invite', + token='thisisnotarealtoken', + follow_redirects=True, + _expected_status=403, + ) + assert 'This invite is for another email address.' in normalize_spaces( + page.select_one('.banner-dangerous').text ) - - assert response.status_code == 403 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') - - assert 'This invite is for another email address.' in normalize_spaces(page.select_one('.banner-dangerous').text) def test_cancelled_invite_opened_by_user( diff --git a/tests/app/main/views/service_settings/test_inbound_sms_setting.py b/tests/app/main/views/service_settings/test_inbound_sms_setting.py index 8114c4faf..c4ac86de5 100644 --- a/tests/app/main/views/service_settings/test_inbound_sms_setting.py +++ b/tests/app/main/views/service_settings/test_inbound_sms_setting.py @@ -1,13 +1,10 @@ -from flask import url_for - -from tests.conftest import normalize_spaces +from tests.conftest import SERVICE_ONE_ID, normalize_spaces def test_set_inbound_sms_sets_a_number_for_service( - logged_in_client, + client_request, mock_add_sms_sender, multiple_available_inbound_numbers, - service_one, fake_uuid, mock_no_inbound_number_for_service, mocker @@ -17,14 +14,15 @@ def test_set_inbound_sms_sets_a_number_for_service( "inbound_number": "781d9c60-7a7e-46b7-9896-7b045b992fa5", } - response = logged_in_client.post( - url_for('main.service_set_inbound_number', service_id=service_one['id']), - data=data + client_request.post( + 'main.service_set_inbound_number', + service_id=SERVICE_ONE_ID, + _data=data, + _expected_status=302, ) - assert response.status_code == 302 mock_add_sms_sender.assert_called_once_with( - service_one['id'], + SERVICE_ONE_ID, sms_sender="781d9c60-7a7e-46b7-9896-7b045b992fa5", is_default=True, inbound_number_id="781d9c60-7a7e-46b7-9896-7b045b992fa5" diff --git a/tests/app/main/views/test_accept_invite.py b/tests/app/main/views/test_accept_invite.py index d9825a3bd..6f654f57e 100644 --- a/tests/app/main/views/test_accept_invite.py +++ b/tests/app/main/views/test_accept_invite.py @@ -396,7 +396,7 @@ def test_new_user_accept_invite_completes_new_registration_redirects_to_verify( def test_signed_in_existing_user_cannot_use_anothers_invite( - logged_in_client, + client_request, mocker, api_user_active, sample_invite, @@ -408,9 +408,12 @@ def test_signed_in_existing_user_cannot_use_anothers_invite( mocker.patch('app.invite_api_client.check_token', return_value=invite) mocker.patch('app.user_api_client.get_users_for_service', return_value=[api_user_active]) - response = logged_in_client.get(url_for('main.accept_invite', token='thisisnotarealtoken'), follow_redirects=True) - assert response.status_code == 403 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + page = client_request.get( + 'main.accept_invite', + token='thisisnotarealtoken', + _follow_redirects=True, + _expected_status=403, + ) assert page.h1.string.strip() == '403' flash_banners = page.find_all('div', class_='banner-dangerous') assert len(flash_banners) == 1 @@ -422,11 +425,10 @@ def test_signed_in_existing_user_cannot_use_anothers_invite( def test_accept_invite_does_not_treat_email_addresses_as_case_sensitive( - logged_in_client, + client_request, mocker, api_user_active, sample_invite, - service_one, mock_accept_invite, mock_get_user_by_email ): @@ -436,10 +438,16 @@ def test_accept_invite_does_not_treat_email_addresses_as_case_sensitive( mocker.patch('app.invite_api_client.check_token', return_value=invite) mocker.patch('app.user_api_client.get_users_for_service', return_value=[api_user_active]) - response = logged_in_client.get(url_for('main.accept_invite', token='thisisnotarealtoken')) - - assert response.status_code == 302 - assert response.location == url_for('main.service_dashboard', service_id=service_one['id'], _external=True) + client_request.get( + 'main.accept_invite', + token='thisisnotarealtoken', + _expected_status=302, + _expected_redirect=url_for( + 'main.service_dashboard', + service_id=SERVICE_ONE_ID, + _external=True, + ) + ) def test_new_invited_user_verifies_and_added_to_service( diff --git a/tests/app/main/views/test_activity.py b/tests/app/main/views/test_activity.py index ff0f8de0f..84106ff66 100644 --- a/tests/app/main/views/test_activity.py +++ b/tests/app/main/views/test_activity.py @@ -4,7 +4,6 @@ from functools import partial from urllib.parse import parse_qs, quote, urlparse import pytest -from bs4 import BeautifulSoup from flask import url_for from freezegun import freeze_time @@ -113,7 +112,7 @@ def test_can_show_notifications( if expected_to_argument: page = client_request.post( 'main.view_notifications', - service_id=service_one['id'], + service_id=SERVICE_ONE_ID, status=status_argument, page=page_argument, _data={ @@ -125,7 +124,7 @@ def test_can_show_notifications( else: page = client_request.get( 'main.view_notifications', - service_id=service_one['id'], + service_id=SERVICE_ONE_ID, status=status_argument, page=page_argument, **extra_args @@ -143,7 +142,7 @@ def test_can_show_notifications( url = urlparse(path_to_json) assert url.path == '/services/{}/notifications{}'.format( - service_one['id'], + SERVICE_ONE_ID, expected_update_endpoint, ) query_dict = parse_qs(url.query) @@ -156,7 +155,7 @@ def test_can_show_notifications( mock_get_notifications.assert_called_with( limit_days=expected_limit_days, page=expected_page_argument, - service_id=service_one['id'], + service_id=SERVICE_ONE_ID, status=expected_api_call, template_type=list(extra_args.values()), to=expected_to_argument, @@ -266,7 +265,7 @@ def test_download_not_available_to_users_without_dashboard( def test_letters_with_status_virus_scan_failed_shows_a_failure_description( mocker, active_user_with_permissions, - logged_in_client, + client_request, service_one, mock_get_service_statistics, mock_get_service_data_retention, @@ -277,15 +276,13 @@ def test_letters_with_status_virus_scan_failed_shows_a_failure_description( is_precompiled_letter=True, noti_status='virus-scan-failed' ) - response = logged_in_client.get(url_for( + page = client_request.get( 'main.view_notifications', service_id=service_one['id'], message_type='letter', status='', - )) + ) - assert response.status_code == 200 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') error_description = page.find('div', attrs={'class': 'table-field-status-error'}).text.strip() assert 'Virus detected\n' in error_description @@ -296,7 +293,7 @@ def test_letters_with_status_virus_scan_failed_shows_a_failure_description( def test_should_not_show_preview_link_for_precompiled_letters_in_virus_states( mocker, active_user_with_permissions, - logged_in_client, + client_request, service_one, mock_get_service_statistics, mock_get_service_data_retention, @@ -308,13 +305,12 @@ def test_should_not_show_preview_link_for_precompiled_letters_in_virus_states( is_precompiled_letter=True, noti_status=letter_status ) - response = logged_in_client.get(url_for( + page = client_request.get( 'main.view_notifications', service_id=service_one['id'], message_type='letter', status='', - )) - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + ) assert not page.find('a', attrs={'class': 'file-list-filename'}) @@ -381,7 +377,7 @@ def test_shows_message_when_no_notifications( ), ]) def test_search_recipient_form( - logged_in_client, + client_request, mock_get_notifications, mock_get_service_statistics, mock_get_service_data_retention, @@ -390,16 +386,13 @@ def test_search_recipient_form( expected_search_box_label, expected_search_box_contents, ): - response = logged_in_client.post( - url_for( - 'main.view_notifications', - service_id=SERVICE_ONE_ID, - **initial_query_arguments - ), - data=form_post_data + page = client_request.post( + 'main.view_notifications', + service_id=SERVICE_ONE_ID, + _data=form_post_data, + _expected_status=200, + **initial_query_arguments ) - assert response.status_code == 200 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') assert page.find("form")['method'] == 'post' action_url = page.find("form")['action'] @@ -421,7 +414,7 @@ def test_search_recipient_form( def test_should_show_notifications_for_a_service_with_next_previous( - logged_in_client, + client_request, service_one, active_user_with_permissions, mock_get_notifications_with_previous_next, @@ -429,14 +422,13 @@ def test_should_show_notifications_for_a_service_with_next_previous( mock_get_service_data_retention, mocker, ): - response = logged_in_client.get(url_for( + page = client_request.get( 'main.view_notifications', service_id=service_one['id'], message_type='sms', page=2 - )) - assert response.status_code == 200 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + ) + next_page_link = page.find('a', {'rel': 'next'}) prev_page_link = page.find('a', {'rel': 'previous'}) assert ( @@ -502,7 +494,7 @@ def test_get_status_filters_constructs_links(client): def test_html_contains_notification_id( - logged_in_client, + client_request, service_one, active_user_with_permissions, mock_get_notifications, @@ -510,14 +502,13 @@ def test_html_contains_notification_id( mock_get_service_data_retention, mocker, ): - response = logged_in_client.get(url_for( + page = client_request.get( 'main.view_notifications', service_id=service_one['id'], message_type='sms', - status='') + status='', ) - assert response.status_code == 200 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + notifications = page.tbody.find_all('tr') for tr in notifications: assert uuid.UUID(tr.attrs['id']) @@ -654,7 +645,7 @@ def test_sending_status_hint_displays_correctly_on_notifications_page( (False, "template subject") ]) def test_should_expected_hint_for_letters( - logged_in_client, + client_request, service_one, active_user_with_permissions, mock_get_service_statistics, @@ -667,10 +658,10 @@ def test_should_expected_hint_for_letters( mock_get_notifications( mocker, active_user_with_permissions, is_precompiled_letter=is_precompiled_letter) - response = logged_in_client.get(url_for( + page = client_request.get( 'main.view_notifications', service_id=SERVICE_ONE_ID, - message_type='letter' - )) - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + message_type='letter', + ) + assert page.find('p', {'class': 'file-list-hint'}).text.strip() == expected_hint diff --git a/tests/app/main/views/test_add_service.py b/tests/app/main/views/test_add_service.py index 708aeb388..5395366e7 100644 --- a/tests/app/main/views/test_add_service.py +++ b/tests/app/main/views/test_add_service.py @@ -18,16 +18,15 @@ def test_non_gov_user_cannot_see_add_service_button( def test_get_should_render_add_service_template( - logged_in_client + client_request ): - response = logged_in_client.get(url_for('main.add_service')) - assert response.status_code == 200 - assert 'About your service' in response.get_data(as_text=True) + page = client_request.get('main.add_service') + assert 'About your service' in page.text def test_should_add_service_and_redirect_to_tour_when_no_services( app_, - logged_in_client, + client_request, mock_create_service, mock_create_service_template, mock_get_services_with_no_services, @@ -35,12 +34,19 @@ def test_should_add_service_and_redirect_to_tour_when_no_services( mock_create_or_update_free_sms_fragment_limit, mock_get_all_email_branding, ): - response = logged_in_client.post( - url_for('main.add_service'), - data={ + client_request.post( + 'main.add_service', + _data={ 'name': 'testing the post', 'organisation_type': 'local', - } + }, + _expected_status=302, + _expected_redirect=url_for( + 'main.start_tour', + service_id=101, + template_id="Example%20text%20message%20template", + _external=True, + ), ) assert mock_get_services_with_no_services.called mock_create_service.assert_called_once_with( @@ -62,13 +68,6 @@ def test_should_add_service_and_redirect_to_tour_when_no_services( 101, ) assert session['service_id'] == 101 - assert response.status_code == 302 - assert response.location == url_for( - 'main.start_tour', - service_id=101, - template_id="Example%20text%20message%20template", - _external=True - ) mock_create_or_update_free_sms_fragment_limit.assert_called_once_with(101, 25000) @@ -79,7 +78,7 @@ def test_should_add_service_and_redirect_to_tour_when_no_services( ]) def test_should_add_service_and_redirect_to_dashboard_when_existing_service( app_, - logged_in_client, + client_request, mock_create_service, mock_create_service_template, mock_get_services, @@ -91,12 +90,18 @@ def test_should_add_service_and_redirect_to_dashboard_when_existing_service( mock_create_or_update_free_sms_fragment_limit, mock_get_all_email_branding, ): - response = logged_in_client.post( - url_for('main.add_service'), - data={ + client_request.post( + 'main.add_service', + _data={ 'name': 'testing the post', 'organisation_type': organisation_type, - } + }, + _expected_status=302, + _expected_redirect=url_for( + 'main.service_dashboard', + service_id=101, + _external=True, + ) ) assert mock_get_services.called mock_create_service.assert_called_once_with( @@ -111,8 +116,6 @@ def test_should_add_service_and_redirect_to_dashboard_when_existing_service( mock_create_or_update_free_sms_fragment_limit.assert_called_once_with(101, free_allowance) assert len(mock_create_service_template.call_args_list) == 0 assert session['service_id'] == 101 - assert response.status_code == 302 - assert response.location == url_for('main.service_dashboard', service_id=101, _external=True) @pytest.mark.parametrize('organisation_type, email_address, expected_branding', [ @@ -159,45 +162,54 @@ def test_should_lookup_branding_for_known_domain( def test_should_return_form_errors_when_service_name_is_empty( - logged_in_client + client_request ): - response = logged_in_client.post(url_for('main.add_service'), data={}) - assert response.status_code == 200 - assert 'Can’t be empty' in response.get_data(as_text=True) + page = client_request.post( + 'main.add_service', + data={}, + _expected_status=200, + ) + assert 'Can’t be empty' in page.text def test_should_return_form_errors_with_duplicate_service_name_regardless_of_case( - logged_in_client, + client_request, mock_create_duplicate_service, mock_get_all_email_branding, ): - response = logged_in_client.post( - url_for('main.add_service'), - data={ + page = client_request.post( + 'main.add_service', + _data={ 'name': 'SERVICE ONE', 'organisation_type': 'central', }, + _expected_status=200, + ) + assert page.select_one('.error-message').text.strip() == ( + 'This service name is already in use' ) - - assert response.status_code == 200 - assert 'This service name is already in use' in response.get_data(as_text=True) def test_non_whitelist_user_cannot_access_create_service_page( - logged_in_client, + client_request, mock_get_non_govuser, api_nongov_user_active, ): assert not is_gov_user(api_nongov_user_active.email_address) - response = logged_in_client.get(url_for('main.add_service')) - assert response.status_code == 403 + client_request.get( + 'main.add_service', + _expected_status=403, + ) def test_non_whitelist_user_cannot_create_service( - logged_in_client, + client_request, mock_get_non_govuser, api_nongov_user_active, ): assert not is_gov_user(api_nongov_user_active.email_address) - response = logged_in_client.post(url_for('main.add_service'), data={'name': 'SERVICE TWO'}) - assert response.status_code == 403 + client_request.post( + 'main.add_service', + _data={'name': 'SERVICE TWO'}, + _expected_status=403, + ) diff --git a/tests/app/main/views/test_api_integration.py b/tests/app/main/views/test_api_integration.py index 5d8d32208..c1530c0e4 100644 --- a/tests/app/main/views/test_api_integration.py +++ b/tests/app/main/views/test_api_integration.py @@ -4,7 +4,6 @@ from unittest.mock import call from uuid import uuid4 import pytest -from bs4 import BeautifulSoup from flask import url_for from tests import sample_uuid, validate_route_permission @@ -23,16 +22,17 @@ from tests.conftest import ( def test_should_show_api_page( - logged_in_client, + client_request, mock_login, api_user_active, mock_get_service, mock_has_permissions, mock_get_notifications ): - response = logged_in_client.get(url_for('main.api_integration', service_id=str(uuid.uuid4()))) - assert response.status_code == 200 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + page = client_request.get( + 'main.api_integration', + service_id=SERVICE_ONE_ID, + ) assert page.h1.string.strip() == 'API integration' rows = page.find_all('details') assert len(rows) == 5 @@ -41,15 +41,17 @@ def test_should_show_api_page( def test_should_show_api_page_with_lots_of_notifications( - logged_in_client, + client_request, mock_login, api_user_active, mock_get_service, mock_has_permissions, mock_get_notifications_with_previous_next ): - response = logged_in_client.get(url_for('main.api_integration', service_id=str(uuid.uuid4()))) - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + page = client_request.get( + 'main.api_integration', + service_id=SERVICE_ONE_ID, + ) rows = page.find_all('div', {'class': 'api-notifications-item'}) assert ' '.join(rows[len(rows) - 1].text.split()) == ( 'Only showing the first 50 messages. Notify deletes messages after 7 days.' @@ -57,15 +59,17 @@ def test_should_show_api_page_with_lots_of_notifications( def test_should_show_api_page_with_no_notifications( - logged_in_client, + client_request, mock_login, api_user_active, mock_get_service, mock_has_permissions, mock_get_notifications_with_no_notifications ): - response = logged_in_client.get(url_for('main.api_integration', service_id=str(uuid.uuid4()))) - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + page = client_request.get( + 'main.api_integration', + service_id=SERVICE_ONE_ID, + ) rows = page.find_all('div', {'class': 'api-notifications-item'}) assert 'When you send messages via the API they’ll appear here.' in rows[len(rows) - 1].text.strip() @@ -157,17 +161,20 @@ def test_should_show_api_page_for_live_service( def test_api_documentation_page_should_redirect( - logged_in_client, + client_request, mock_login, api_user_active, mock_get_service, mock_has_permissions ): - response = logged_in_client.get(url_for('main.api_documentation', service_id=str(uuid.uuid4()))) - assert response.status_code == 301 - assert response.location == url_for( - 'main.documentation', - _external=True + client_request.get( + 'main.api_documentation', + service_id=SERVICE_ONE_ID, + _expected_status=301, + _expected_redirect=url_for( + 'main.documentation', + _external=True, + ), ) @@ -276,7 +283,7 @@ def test_should_create_api_key_with_type_normal( def test_cant_create_normal_api_key_in_trial_mode( - logged_in_client, + client_request, api_user_active, mock_login, mock_get_api_keys, @@ -287,14 +294,15 @@ def test_cant_create_normal_api_key_in_trial_mode( ): mock_post = mocker.patch('app.notify_client.api_key_api_client.ApiKeyApiClient.post') - response = logged_in_client.post( - url_for('main.create_api_key', service_id=uuid.uuid4()), - data={ + client_request.post( + 'main.create_api_key', + service_id=SERVICE_ONE_ID, + _data={ 'key_name': 'some default key name', 'key_type': 'normal' - } + }, + _expected_status=400, ) - assert response.status_code == 400 mock_post.assert_not_called() @@ -330,7 +338,7 @@ def test_should_404_for_api_key_that_doesnt_exist( def test_should_redirect_after_revoking_api_key( - logged_in_client, + client_request, api_user_active, mock_login, mock_revoke_api_key, @@ -339,10 +347,17 @@ def test_should_redirect_after_revoking_api_key( mock_has_permissions, fake_uuid, ): - response = logged_in_client.post(url_for('main.revoke_api_key', service_id=SERVICE_ONE_ID, key_id=fake_uuid)) - - assert response.status_code == 302 - assert response.location == url_for('.api_keys', service_id=SERVICE_ONE_ID, _external=True) + client_request.post( + 'main.revoke_api_key', + service_id=SERVICE_ONE_ID, + key_id=fake_uuid, + _expected_status=302, + _expected_redirect=url_for( + '.api_keys', + service_id=SERVICE_ONE_ID, + _external=True, + ), + ) mock_revoke_api_key.assert_called_once_with(service_id=SERVICE_ONE_ID, key_id=fake_uuid) mock_get_api_keys.assert_called_once_with(SERVICE_ONE_ID,) @@ -400,15 +415,17 @@ def test_route_invalid_permissions( def test_should_show_whitelist_page( - logged_in_client, + client_request, mock_login, api_user_active, mock_get_service, mock_has_permissions, mock_get_whitelist, ): - response = logged_in_client.get(url_for('main.whitelist', service_id=str(uuid.uuid4()))) - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + page = client_request.get( + 'main.whitelist', + service_id=SERVICE_ONE_ID, + ) textboxes = page.find_all('input', {'type': 'text'}) for index, value in enumerate( ['test@example.com'] + [''] * 4 + ['07900900000'] + [''] * 4 @@ -417,14 +434,9 @@ def test_should_show_whitelist_page( def test_should_update_whitelist( - logged_in_client, - mock_login, - api_user_active, - mock_get_service, - mock_has_permissions, - mock_update_whitelist + client_request, + mock_update_whitelist, ): - service_id = str(uuid.uuid4()) data = OrderedDict([ ('email_addresses-1', 'test@example.com'), ('email_addresses-3', 'test@example.com'), @@ -432,34 +444,32 @@ def test_should_update_whitelist( ('phone_numbers-2', '+1800-555-555'), ]) - logged_in_client.post( - url_for('main.whitelist', service_id=service_id), - data=data + client_request.post( + 'main.whitelist', + service_id=SERVICE_ONE_ID, + _data=data, ) - mock_update_whitelist.assert_called_once_with(service_id, { + mock_update_whitelist.assert_called_once_with(SERVICE_ONE_ID, { 'email_addresses': ['test@example.com', 'test@example.com'], 'phone_numbers': ['07900900000', '+1800-555-555']}) def test_should_validate_whitelist_items( - logged_in_client, - mock_login, - api_user_active, - mock_get_service, - mock_has_permissions, - mock_update_whitelist + client_request, + mock_update_whitelist, ): - response = logged_in_client.post( - url_for('main.whitelist', service_id=str(uuid.uuid4())), - data=OrderedDict([ + page = client_request.post( + 'main.whitelist', + service_id=SERVICE_ONE_ID, + _data=OrderedDict([ ('email_addresses-1', 'abc'), ('phone_numbers-0', '123') - ]) + ]), + _expected_status=200, ) - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') assert page.h1.string.strip() == 'There was a problem with your whitelist' jump_links = page.select('.banner-dangerous a') @@ -469,7 +479,7 @@ def test_should_validate_whitelist_items( assert jump_links[1].string.strip() == 'Enter valid phone numbers' assert jump_links[1]['href'] == '#phone_numbers' - mock_update_whitelist.assert_not_called() + assert mock_update_whitelist.called is False @pytest.mark.parametrize('endpoint', [ diff --git a/tests/app/main/views/test_dashboard.py b/tests/app/main/views/test_dashboard.py index 07e555585..46418d742 100644 --- a/tests/app/main/views/test_dashboard.py +++ b/tests/app/main/views/test_dashboard.py @@ -1,11 +1,9 @@ import copy import json from datetime import datetime -from functools import partial from unittest.mock import call import pytest -from bs4 import BeautifulSoup from flask import url_for from freezegun import freeze_time @@ -138,7 +136,7 @@ def test_redirect_caseworkers_to_templates( def test_get_started( - logged_in_client, + client_request, mocker, mock_get_service_templates_when_no_templates_exist, mock_get_jobs, @@ -151,15 +149,17 @@ def test_get_started( return_value=copy.deepcopy(stub_template_stats) ) - response = logged_in_client.get(url_for('main.service_dashboard', service_id=SERVICE_ONE_ID)) + page = client_request.get( + 'main.service_dashboard', + service_id=SERVICE_ONE_ID, + ) - # mock_get_service_templates_when_no_templates_exist.assert_called_once_with(SERVICE_ONE_ID) - assert response.status_code == 200 - assert 'Get started' in response.get_data(as_text=True) + mock_get_service_templates_when_no_templates_exist.assert_called_once_with(SERVICE_ONE_ID) + assert 'Get started' in page.text def test_get_started_is_hidden_once_templates_exist( - logged_in_client, + client_request, mocker, mock_get_service_templates, mock_get_jobs, @@ -171,15 +171,17 @@ def test_get_started_is_hidden_once_templates_exist( 'app.template_statistics_client.get_template_statistics_for_service', return_value=copy.deepcopy(stub_template_stats) ) - response = logged_in_client.get(url_for('main.service_dashboard', service_id=SERVICE_ONE_ID)) + page = client_request.get( + 'main.service_dashboard', + service_id=SERVICE_ONE_ID, + ) - # mock_get_service_templates.assert_called_once_with(SERVICE_ONE_ID) - assert response.status_code == 200 - assert 'Get started' not in response.get_data(as_text=True) + mock_get_service_templates.assert_called_once_with(SERVICE_ONE_ID) + assert 'Get started' not in page.text def test_inbound_messages_not_visible_to_service_without_permissions( - logged_in_client, + client_request, service_one, mock_get_service_templates_when_no_templates_exist, mock_get_jobs, @@ -191,10 +193,11 @@ def test_inbound_messages_not_visible_to_service_without_permissions( service_one['permissions'] = [] - response = logged_in_client.get(url_for('main.service_dashboard', service_id=SERVICE_ONE_ID)) - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + page = client_request.get( + 'main.service_dashboard', + service_id=SERVICE_ONE_ID, + ) - assert response.status_code == 200 assert not page.select('.big-number-meta-wrapper') assert mock_get_inbound_sms_summary.called is False @@ -204,7 +207,7 @@ def test_inbound_messages_not_visible_to_service_without_permissions( (mock_get_inbound_sms_summary, '99 text messages received latest message just now'), ]) def test_inbound_messages_shows_count_of_messages( - logged_in_client, + client_request, mocker, service_one, mock_get_service_templates_when_no_templates_exist, @@ -219,10 +222,11 @@ def test_inbound_messages_shows_count_of_messages( service_one['permissions'] = ['inbound_sms'] inbound_summary_mock(mocker) - response = logged_in_client.get(url_for('main.service_dashboard', service_id=SERVICE_ONE_ID)) - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + page = client_request.get( + 'main.service_dashboard', + service_id=SERVICE_ONE_ID, + ) - assert response.status_code == 200 assert normalize_spaces(page.select('.big-number-meta-wrapper')[0].text) == expected_text assert page.select('.big-number-meta-wrapper a')[0]['href'] == url_for( 'main.inbox', service_id=SERVICE_ONE_ID @@ -240,7 +244,7 @@ def test_inbound_messages_shows_count_of_messages( '07900 900008 message-8 9 hours ago', ])) def test_inbox_showing_inbound_messages( - logged_in_client, + client_request, service_one, mock_get_service_templates_when_no_templates_exist, mock_get_jobs, @@ -254,10 +258,11 @@ def test_inbox_showing_inbound_messages( service_one['permissions'] = ['inbound_sms'] - response = logged_in_client.get(url_for('main.inbox', service_id=SERVICE_ONE_ID)) - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + page = client_request.get( + 'main.inbox', + service_id=SERVICE_ONE_ID, + ) - assert response.status_code == 200 rows = page.select('tbody tr') assert len(rows) == 8 assert normalize_spaces(rows[index].text) == expected_row @@ -268,7 +273,7 @@ def test_inbox_showing_inbound_messages( def test_get_inbound_sms_shows_page_links( - logged_in_client, + client_request, service_one, mock_get_service_templates_when_no_templates_exist, mock_get_jobs, @@ -280,16 +285,18 @@ def test_get_inbound_sms_shows_page_links( ): service_one['permissions'] = ['inbound_sms'] - response = logged_in_client.get(url_for('main.inbox', service_id=SERVICE_ONE_ID, page=2)) + page = client_request.get( + 'main.inbox', + service_id=SERVICE_ONE_ID, + page=2, + ) - assert response.status_code == 200 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') assert 'Next page' in page.find('li', {'class': 'next-page'}).text assert 'Previous page' in page.find('li', {'class': 'previous-page'}).text def test_empty_inbox( - logged_in_client, + client_request, service_one, mock_get_service_templates_when_no_templates_exist, mock_get_jobs, @@ -302,10 +309,11 @@ def test_empty_inbox( service_one['permissions'] = ['inbound_sms'] - response = logged_in_client.get(url_for('main.inbox', service_id=SERVICE_ONE_ID)) - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + page = client_request.get( + 'main.inbox', + service_id=SERVICE_ONE_ID, + ) - assert response.status_code == 200 assert normalize_spaces(page.select('tbody tr')) == ( 'When users text your service’s phone number (0781239871) you’ll see the messages here' ) @@ -319,14 +327,16 @@ def test_empty_inbox( 'main.inbox_updates', ]) def test_inbox_not_accessible_to_service_without_permissions( - logged_in_client, + client_request, service_one, endpoint, ): service_one['permissions'] = [] - response = logged_in_client.get(url_for(endpoint, service_id=SERVICE_ONE_ID)) - - assert response.status_code == 403 + client_request.get( + endpoint, + service_id=SERVICE_ONE_ID, + _expected_status=403, + ) def test_anyone_can_see_inbox( @@ -441,7 +451,7 @@ def test_download_inbox_strips_formulae( def test_should_show_recent_templates_on_dashboard( - logged_in_client, + client_request, mocker, mock_get_service_templates, mock_get_jobs, @@ -452,13 +462,13 @@ def test_should_show_recent_templates_on_dashboard( mock_template_stats = mocker.patch('app.template_statistics_client.get_template_statistics_for_service', return_value=copy.deepcopy(stub_template_stats)) - response = logged_in_client.get(url_for('main.service_dashboard', service_id=SERVICE_ONE_ID)) + page = client_request.get( + 'main.service_dashboard', + service_id=SERVICE_ONE_ID, + ) - assert response.status_code == 200 - response.get_data(as_text=True) mock_template_stats.assert_called_once_with(SERVICE_ONE_ID, limit_days=7) - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') headers = [header.text.strip() for header in page.find_all('h2') + page.find_all('h1')] assert 'In the last 7 days' in headers @@ -484,39 +494,40 @@ def test_should_show_recent_templates_on_dashboard( @freeze_time("2016-07-01 12:00") # 4 months into 2016 financial year -@pytest.mark.parametrize('partial_url', [ - partial(url_for), - partial(url_for, year='2016'), +@pytest.mark.parametrize('extra_args', [ + {}, + {'year': '2016'}, ]) def test_should_show_redirect_from_template_history( - logged_in_client, - partial_url, + client_request, + extra_args, ): - response = logged_in_client.get( - partial_url('main.template_history', service_id=SERVICE_ONE_ID, _external=True) + client_request.get( + 'main.template_history', + service_id=SERVICE_ONE_ID, + _expected_status=301, + **extra_args, ) - assert response.status_code == 301 - @freeze_time("2016-07-01 12:00") # 4 months into 2016 financial year -@pytest.mark.parametrize('partial_url', [ - partial(url_for), - partial(url_for, year='2016'), +@pytest.mark.parametrize('extra_args', [ + {}, + {'year': '2016'}, ]) def test_should_show_monthly_breakdown_of_template_usage( - logged_in_client, + client_request, mock_get_monthly_template_usage, - partial_url, + extra_args, ): - response = logged_in_client.get( - partial_url('main.template_usage', service_id=SERVICE_ONE_ID, _external=True) + page = client_request.get( + 'main.template_usage', + service_id=SERVICE_ONE_ID, + **extra_args ) - assert response.status_code == 200 mock_get_monthly_template_usage.assert_called_once_with(SERVICE_ONE_ID, 2016) - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') table_rows = page.select('tbody tr') assert ' '.join(table_rows[0].text.split()) == ( @@ -603,7 +614,7 @@ def test_monthly_has_equal_length_tables( @freeze_time("2016-01-01 11:09:00.061258") def test_should_show_upcoming_jobs_on_dashboard( - logged_in_client, + client_request, mock_get_service_templates, mock_get_template_statistics, mock_get_service_statistics, @@ -611,16 +622,15 @@ def test_should_show_upcoming_jobs_on_dashboard( mock_get_usage, mock_get_inbound_sms_summary ): - response = logged_in_client.get(url_for('main.service_dashboard', service_id=SERVICE_ONE_ID)) + page = client_request.get( + 'main.service_dashboard', + service_id=SERVICE_ONE_ID, + ) second_call = mock_get_jobs.call_args_list[1] assert second_call[0] == (SERVICE_ONE_ID,) assert second_call[1]['statuses'] == ['scheduled'] - assert response.status_code == 200 - - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') - table_rows = page.find_all('tbody')[0].find_all('tr') assert len(table_rows) == 2 @@ -732,7 +742,7 @@ def test_correct_font_size_for_big_numbers( @freeze_time("2016-01-01 11:09:00.061258") def test_should_show_recent_jobs_on_dashboard( - logged_in_client, + client_request, mock_get_service_templates, mock_get_template_statistics, mock_get_service_statistics, @@ -740,16 +750,16 @@ def test_should_show_recent_jobs_on_dashboard( mock_get_usage, mock_get_inbound_sms_summary ): - response = logged_in_client.get(url_for('main.service_dashboard', service_id=SERVICE_ONE_ID)) + page = client_request.get( + 'main.service_dashboard', + service_id=SERVICE_ONE_ID, + ) third_call = mock_get_jobs.call_args_list[2] assert third_call[0] == (SERVICE_ONE_ID,) assert third_call[1]['limit_days'] == 7 assert 'scheduled' not in third_call[1]['statuses'] - assert response.status_code == 200 - - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') table_rows = page.find_all('tbody')[2].find_all('tr') assert len(table_rows) == 4 @@ -768,21 +778,20 @@ def test_should_show_recent_jobs_on_dashboard( @freeze_time("2012-03-31 12:12:12") def test_usage_page( - logged_in_client, + client_request, mock_get_usage, mock_get_billable_units, mock_get_free_sms_fragment_limit ): - response = logged_in_client.get(url_for('main.usage', service_id=SERVICE_ONE_ID)) - - assert response.status_code == 200 + page = client_request.get( + 'main.usage', + service_id=SERVICE_ONE_ID, + ) mock_get_billable_units.assert_called_once_with(SERVICE_ONE_ID, 2011) mock_get_usage.assert_called_once_with(SERVICE_ONE_ID, 2011) mock_get_free_sms_fragment_limit.assert_called_with(SERVICE_ONE_ID, 2011) - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') - cols = page.find_all('div', {'class': 'column-half'}) nav = page.find('ul', {'class': 'pill', 'role': 'tablist'}) nav_links = nav.find_all('a') @@ -809,23 +818,22 @@ def test_usage_page( @freeze_time("2012-03-31 12:12:12") def test_usage_page_with_letters( - logged_in_client, + client_request, service_one, mock_get_usage, mock_get_billable_units, mock_get_free_sms_fragment_limit ): service_one['permissions'].append('letter') - response = logged_in_client.get(url_for('main.usage', service_id=SERVICE_ONE_ID)) - - assert response.status_code == 200 + page = client_request.get( + 'main.usage', + service_id=SERVICE_ONE_ID, + ) mock_get_billable_units.assert_called_once_with(SERVICE_ONE_ID, 2011) mock_get_usage.assert_called_once_with(SERVICE_ONE_ID, 2011) mock_get_free_sms_fragment_limit.assert_called_with(SERVICE_ONE_ID, 2011) - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') - cols = page.find_all('div', {'class': 'column-one-third'}) nav = page.find('ul', {'class': 'pill', 'role': 'tablist'}) nav_links = nav.find_all('a') @@ -855,7 +863,7 @@ def test_usage_page_with_letters( @freeze_time("2012-04-30 12:12:12") def test_usage_page_displays_letters_ordered_by_postage( mocker, - logged_in_client, + client_request, service_one, mock_get_usage, mock_get_free_sms_fragment_limit @@ -867,9 +875,11 @@ def test_usage_page_displays_letters_ordered_by_postage( ] mocker.patch('app.billing_api_client.get_billable_units_ft', return_value=billable_units_resp) service_one['permissions'].append('letter') - response = logged_in_client.get(url_for('main.usage', service_id=SERVICE_ONE_ID)) + page = client_request.get( + 'main.usage', + service_id=SERVICE_ONE_ID, + ) - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') row_for_april = page.find('table').find('tr', class_='table-row') postage_details = row_for_april.find_all('li', class_='tabular-numbers') @@ -892,19 +902,28 @@ def test_usage_page_with_year_argument( def test_usage_page_for_invalid_year( - logged_in_client, + client_request, ): - assert logged_in_client.get(url_for('main.usage', service_id=SERVICE_ONE_ID, year='abcd')).status_code == 404 + client_request.get( + 'main.usage', + service_id=SERVICE_ONE_ID, + year='abcd', + _expected_status=404, + ) @freeze_time("2012-03-31 12:12:12") def test_future_usage_page( - logged_in_client, + client_request, mock_get_future_usage, mock_get_future_billable_units, mock_get_free_sms_fragment_limit ): - assert logged_in_client.get(url_for('main.usage', service_id=SERVICE_ONE_ID, year=2014)).status_code == 200 + client_request.get( + 'main.usage', + service_id=SERVICE_ONE_ID, + year=2014, + ) mock_get_future_billable_units.assert_called_once_with(SERVICE_ONE_ID, 2014) mock_get_future_usage.assert_called_once_with(SERVICE_ONE_ID, 2014) @@ -1104,7 +1123,7 @@ def test_aggregate_notifications_stats(): def test_service_dashboard_updates_gets_dashboard_totals( mocker, - logged_in_client, + client_request, mock_get_service_templates, mock_get_template_statistics, mock_get_service_statistics, @@ -1117,11 +1136,11 @@ def test_service_dashboard_updates_gets_dashboard_totals( 'sms': {'requested': 456, 'delivered': 0, 'failed': 0} }) - response = logged_in_client.get(url_for('main.service_dashboard', service_id=SERVICE_ONE_ID)) + page = client_request.get( + 'main.service_dashboard', + service_id=SERVICE_ONE_ID, + ) - assert response.status_code == 200 - - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') numbers = [number.text.strip() for number in page.find_all('div', class_='big-number-number')] assert '123' in numbers assert '456' in numbers diff --git a/tests/app/main/views/test_feedback.py b/tests/app/main/views/test_feedback.py index e6595d19e..66740b91c 100644 --- a/tests/app/main/views/test_feedback.py +++ b/tests/app/main/views/test_feedback.py @@ -160,20 +160,26 @@ def test_passed_non_logged_in_user_details_through_flow(client, mocker, ticket_t ]) @pytest.mark.parametrize('ticket_type', [PROBLEM_TICKET_TYPE, QUESTION_TICKET_TYPE]) def test_passes_user_details_through_flow( - logged_in_client, + client_request, mocker, ticket_type, data ): mock_post = mocker.patch('app.main.views.feedback.zendesk_client.create_ticket') - resp = logged_in_client.post( - url_for('main.feedback', ticket_type=ticket_type), - data=data, + client_request.post( + 'main.feedback', + ticket_type=ticket_type, + _data=data, + _expected_status=302, + _expected_redirect=url_for( + 'main.thanks', + urgent=True, + anonymous=False, + _external=True, + ), ) - assert resp.status_code == 302 - assert resp.location == url_for('main.thanks', urgent=True, anonymous=False, _external=True) mock_post.assert_called_with( subject='Notify feedback', message=ANY, @@ -267,7 +273,7 @@ def test_email_address_must_be_valid_if_provided_to_support_form( ]) def test_urgency( - logged_in_client, + client_request, mocker, ticket_type, severe, @@ -277,12 +283,19 @@ def test_urgency( ): mocker.patch('app.main.views.feedback.in_business_hours', return_value=is_in_business_hours) mock_post = mocker.patch('app.main.views.feedback.zendesk_client.create_ticket') - response = logged_in_client.post( - url_for('main.feedback', ticket_type=ticket_type, severe=severe), - data={'feedback': 'blah', 'email_address': 'test@example.com'}, + client_request.post( + 'main.feedback', + ticket_type=ticket_type, + severe=severe, + _data={'feedback': 'blah', 'email_address': 'test@example.com'}, + _expected_status=302, + _expected_redirect=url_for( + 'main.thanks', + urgent=is_urgent, + anonymous=False, + _external=True, + ), ) - assert response.status_code == 302 - assert response.location == url_for('main.thanks', urgent=is_urgent, anonymous=False, _external=True) assert mock_post.call_args[1]['p1'] == is_p1 @@ -340,28 +353,30 @@ def test_redirects_to_triage( def test_doesnt_lose_message_if_post_across_closing( - logged_in_client, + client_request, mocker, ): mocker.patch('app.main.views.feedback.has_live_services', return_value=True) mocker.patch('app.main.views.feedback.in_business_hours', return_value=False) - response = logged_in_client.post( - url_for('main.feedback', ticket_type=PROBLEM_TICKET_TYPE), - data={'feedback': 'foo'}, + page = client_request.post( + 'main.feedback', + ticket_type=PROBLEM_TICKET_TYPE, + _data={'feedback': 'foo'}, + _expected_status=302, + _expected_redirect=url_for('.triage', _external=True), ) - with logged_in_client.session_transaction() as session: + with client_request.session_transaction() as session: assert session['feedback_message'] == 'foo' - assert response.status_code == 302 - assert response.location == url_for('.triage', _external=True) - response = logged_in_client.get( - url_for('main.feedback', ticket_type=PROBLEM_TICKET_TYPE, severe='yes') + page = client_request.get( + 'main.feedback', + ticket_type=PROBLEM_TICKET_TYPE, + severe='yes', ) - assert response.status_code == 200 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') - with logged_in_client.session_transaction() as session: + + with client_request.session_transaction() as session: assert page.find('textarea', {'name': 'feedback'}).text == 'foo' assert 'feedback_message' not in session diff --git a/tests/app/main/views/test_index.py b/tests/app/main/views/test_index.py index 8c0884ffa..211d2b25e 100644 --- a/tests/app/main/views/test_index.py +++ b/tests/app/main/views/test_index.py @@ -32,17 +32,21 @@ def test_non_logged_in_user_can_see_homepage( def test_logged_in_user_redirects_to_choose_account( - logged_in_client, + client_request, api_user_active, mock_get_user, mock_get_user_by_email, mock_login, ): - response = logged_in_client.get(url_for('main.index')) - assert response.status_code == 302 - - response = logged_in_client.get(url_for('main.sign_in', follow_redirects=True)) - assert response.location == url_for('main.show_accounts_or_dashboard', _external=True) + 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) + ) def test_robots(client): @@ -76,16 +80,18 @@ def test_static_pages( ('trial_mode', 'trial-mode'), ]) def test_old_static_pages_redirect_to_using_notify_with_anchor( - client, + client_request, view, expected_anchor, ): - response = client.get(url_for('main.{}'.format(view))) - assert response.status_code == 301 - assert response.location == url_for( - 'main.using_notify', - _anchor=expected_anchor, - _external=True + client_request.get( + 'main.{}'.format(view), + _expected_status=301, + _expected_redirect=url_for( + 'main.using_notify', + _anchor=expected_anchor, + _external=True + ), ) diff --git a/tests/app/main/views/test_jobs.py b/tests/app/main/views/test_jobs.py index b47000a37..a562cd33a 100644 --- a/tests/app/main/views/test_jobs.py +++ b/tests/app/main/views/test_jobs.py @@ -1,7 +1,6 @@ import json import pytest -from bs4 import BeautifulSoup from flask import url_for from freezegun import freeze_time @@ -250,7 +249,7 @@ def test_should_show_page_for_one_job_with_flexible_data_retention( def test_get_jobs_should_tell_user_if_more_than_one_page( - logged_in_client, + client_request, fake_uuid, service_one, mock_get_job, @@ -258,20 +257,17 @@ def test_get_jobs_should_tell_user_if_more_than_one_page( mock_get_notifications_with_previous_next, mock_get_service_data_retention, ): - response = logged_in_client.get(url_for( + page = client_request.get( 'main.view_job', service_id=service_one['id'], job_id=fake_uuid, - status='' - )) - - assert response.status_code == 200 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + status='', + ) assert page.find('p', {'class': 'table-show-more-link'}).text.strip() == 'Only showing the first 50 rows' def test_should_show_job_in_progress( - logged_in_client, + client_request, service_one, active_user_with_permissions, mock_get_service_template, @@ -281,15 +277,11 @@ def test_should_show_job_in_progress( mock_get_service_data_retention, fake_uuid, ): - - response = logged_in_client.get(url_for( + page = client_request.get( 'main.view_job', service_id=service_one['id'], - job_id=fake_uuid - )) - - assert response.status_code == 200 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + job_id=fake_uuid, + ) assert page.find('p', {'class': 'hint'}).text.strip() == 'Report is 50% complete…' @@ -420,23 +412,19 @@ def test_should_show_letter_job_with_banner_after_sending_after_1730( @freeze_time("2016-01-01T00:00:00.061258") def test_should_show_scheduled_job( - logged_in_client, - active_user_with_permissions, + client_request, mock_get_service_template, mock_get_scheduled_job, mock_get_service_data_retention, - mocker, mock_get_notifications, fake_uuid, ): - response = logged_in_client.get(url_for( + page = client_request.get( 'main.view_job', service_id=SERVICE_ONE_ID, - job_id=fake_uuid - )) + job_id=fake_uuid, + ) - assert response.status_code == 200 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') assert normalize_spaces(page.select('main p')[1].text) == ( 'Sending Two week reminder today at midnight' ) @@ -450,38 +438,38 @@ def test_should_show_scheduled_job( def test_should_cancel_job( - logged_in_client, - service_one, + client_request, fake_uuid, mocker, ): mock_cancel = mocker.patch('app.main.jobs.job_api_client.cancel_job') - response = logged_in_client.post(url_for( + client_request.post( 'main.cancel_job', - service_id=service_one['id'], - job_id=fake_uuid - )) + service_id=SERVICE_ONE_ID, + job_id=fake_uuid, + _expected_status=302, + _expected_redirect=url_for( + 'main.service_dashboard', + service_id=SERVICE_ONE_ID, + _external=True, + ) + ) - mock_cancel.assert_called_once_with(service_one['id'], fake_uuid) - assert response.status_code == 302 - assert response.location == url_for('main.service_dashboard', service_id=service_one['id'], _external=True) + mock_cancel.assert_called_once_with(SERVICE_ONE_ID, fake_uuid) def test_should_not_show_cancelled_job( - logged_in_client, - service_one, + client_request, active_user_with_permissions, mock_get_cancelled_job, - mocker, fake_uuid, ): - response = logged_in_client.get(url_for( + client_request.get( 'main.view_job', - service_id=service_one['id'], - job_id=fake_uuid - )) - - assert response.status_code == 404 + service_id=SERVICE_ONE_ID, + job_id=fake_uuid, + _expected_status=404, + ) @freeze_time("2016-01-01 00:00:00.000001") diff --git a/tests/app/main/views/test_manage_users.py b/tests/app/main/views/test_manage_users.py index 7980362fd..5e8df8324 100644 --- a/tests/app/main/views/test_manage_users.py +++ b/tests/app/main/views/test_manage_users.py @@ -2,7 +2,6 @@ import copy import uuid import pytest -from bs4 import BeautifulSoup from flask import url_for import app @@ -20,7 +19,6 @@ from tests.conftest import ( normalize_spaces, sample_uuid, ) -from tests.conftest import service_one as create_sample_service @pytest.mark.parametrize('user, expected_self_text, expected_coworker_text', [ @@ -523,38 +521,41 @@ def test_cant_edit_non_member_user_permissions( @pytest.mark.parametrize('auth_type', ['email_auth', 'sms_auth']) def test_edit_user_permissions_including_authentication_with_email_auth_service( - logged_in_client, + client_request, + service_one, active_user_with_permissions, - mocker, mock_get_users_by_service, mock_get_invites_for_service, mock_set_user_permissions, mock_update_user_attribute, - service_one, auth_type, mock_get_template_folders ): service_one['permissions'].append('email_auth') - response = logged_in_client.post( - url_for( - 'main.edit_user_permissions', - service_id=service_one['id'], - user_id=active_user_with_permissions.id - ), - data={ + client_request.post( + 'main.edit_user_permissions', + service_id=SERVICE_ONE_ID, + user_id=active_user_with_permissions.id, + _data={ 'email_address': active_user_with_permissions.email_address, 'send_messages': 'y', 'manage_templates': 'y', 'manage_service': 'y', 'manage_api_keys': 'y', - 'login_authentication': auth_type - } + 'login_authentication': auth_type, + }, + _expected_status=302, + _expected_redirect=url_for( + 'main.manage_users', + service_id=SERVICE_ONE_ID, + _external=True, + ), ) mock_set_user_permissions.assert_called_with( str(active_user_with_permissions.id), - service_one['id'], + SERVICE_ONE_ID, permissions={ 'send_messages', 'manage_templates', @@ -568,29 +569,22 @@ def test_edit_user_permissions_including_authentication_with_email_auth_service( auth_type=auth_type ) - assert response.status_code == 302 - assert response.location == url_for( - 'main.manage_users', service_id=service_one['id'], _external=True - ) - def test_should_show_page_for_inviting_user( - logged_in_client, - active_user_with_permissions, - mocker, + client_request, mock_get_template_folders, ): - service = create_sample_service(active_user_with_permissions) - response = logged_in_client.get(url_for('main.invite_user', service_id=service['id'])) - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + page = client_request.get( + 'main.invite_user', + service_id=SERVICE_ONE_ID, + ) assert 'Invite a team member' in page.find('h1').text.strip() - assert response.status_code == 200 assert not page.find('div', class_='checkboxes-nested') def test_should_show_folder_permission_form_if_service_has_folder_permissions_enabled( - logged_in_client, + client_request, mocker, mock_get_template_folders, service_one @@ -601,11 +595,12 @@ def test_should_show_folder_permission_form_if_service_has_folder_permissions_en {'id': 'folder-id-2', 'name': 'folder_two', 'parent_id': None, 'users_with_permission': []}, {'id': 'folder-id-3', 'name': 'folder_three', 'parent_id': 'folder-id-1', 'users_with_permission': []}, ] - response = logged_in_client.get(url_for('main.invite_user', service_id=service_one['id'])) - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + page = client_request.get( + 'main.invite_user', + service_id=SERVICE_ONE_ID, + ) assert 'Invite a team member' in page.find('h1').text.strip() - assert response.status_code == 200 folder_checkboxes = page.find('div', class_='checkboxes-nested').find_all('li') assert len(folder_checkboxes) == 3 @@ -616,7 +611,7 @@ def test_should_show_folder_permission_form_if_service_has_folder_permissions_en ('test@nonwhitelist.com', False) ]) def test_invite_user( - logged_in_client, + client_request, active_user_with_permissions, mocker, sample_invite, @@ -624,7 +619,6 @@ def test_invite_user( gov_user, mock_get_template_folders, ): - service = create_sample_service(active_user_with_permissions) sample_invite['email_address'] = 'test@example.gov.uk' data = [InvitedUser(**sample_invite)] @@ -632,19 +626,19 @@ def test_invite_user( mocker.patch('app.invite_api_client.get_invites_for_service', return_value=data) mocker.patch('app.user_api_client.get_users_for_service', return_value=[active_user_with_permissions]) mocker.patch('app.invite_api_client.create_invite', return_value=InvitedUser(**sample_invite)) - response = logged_in_client.post( - url_for('main.invite_user', service_id=service['id']), - data={'email_address': email_address, - 'view_activity': 'y', - 'send_messages': 'y', - 'manage_templates': 'y', - 'manage_service': 'y', - 'manage_api_keys': 'y'}, - follow_redirects=True + page = client_request.post( + 'main.invite_user', + service_id=SERVICE_ONE_ID, + _data={ + 'email_address': email_address, + 'view_activity': 'y', + 'send_messages': 'y', + 'manage_templates': 'y', + 'manage_service': 'y', + 'manage_api_keys': 'y', + }, + _follow_redirects=True, ) - - assert response.status_code == 200 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') assert page.h1.string.strip() == 'Team members' flash_banner = page.find('div', class_='banner-default-with-tick').string.strip() assert flash_banner == 'Invite sent to test@example.gov.uk' @@ -668,13 +662,13 @@ def test_invite_user( ('test@nonwhitelist.com', False) ]) def test_invite_user_with_email_auth_service( - logged_in_client, + client_request, + service_one, active_user_with_permissions, sample_invite, email_address, gov_user, mocker, - service_one, auth_type, mock_get_template_folders, ): @@ -686,20 +680,22 @@ def test_invite_user_with_email_auth_service( mocker.patch('app.invite_api_client.get_invites_for_service', return_value=data) mocker.patch('app.user_api_client.get_users_for_service', return_value=[active_user_with_permissions]) mocker.patch('app.invite_api_client.create_invite', return_value=InvitedUser(**sample_invite)) - response = logged_in_client.post( - url_for('main.invite_user', service_id=service_one['id']), - data={'email_address': email_address, - 'view_activity': 'y', - 'send_messages': 'y', - 'manage_templates': 'y', - 'manage_service': 'y', - 'manage_api_keys': 'y', - 'login_authentication': auth_type}, - follow_redirects=True + page = client_request.post( + 'main.invite_user', + service_id=SERVICE_ONE_ID, + _data={ + 'email_address': email_address, + 'view_activity': 'y', + 'send_messages': 'y', + 'manage_templates': 'y', + 'manage_service': 'y', + 'manage_api_keys': 'y', + 'login_authentication': auth_type, + }, + _follow_redirects=True, + _expected_status=200, ) - assert response.status_code == 200 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') assert page.h1.string.strip() == 'Team members' flash_banner = page.find('div', class_='banner-default-with-tick').string.strip() assert flash_banner == 'Invite sent to test@example.gov.uk' @@ -715,7 +711,7 @@ def test_invite_user_with_email_auth_service( def test_invite_user_sends_invite_with_all_folders_if_folder_permissions_not_enabled( - logged_in_client, + client_request, mocker, mock_get_template_folders, service_one @@ -729,13 +725,16 @@ def test_invite_user_sends_invite_with_all_folders_if_folder_permissions_not_ena ] invite_mock = mocker.patch('app.invite_api_client.create_invite') - response = logged_in_client.post( - url_for('main.invite_user', service_id=service_one['id']), - data={'email_address': 'user@example.com', - 'send_messages': 'y'}, - follow_redirects=True + client_request.post( + 'main.invite_user', + service_id=SERVICE_ONE_ID, + _data={ + 'email_address': 'user@example.com', + 'send_messages': 'y', + }, + _follow_redirects=True, + _expected_status=200, ) - assert response.status_code == 200 folder_data_sent = invite_mock.call_args[0][-1] @@ -841,24 +840,24 @@ def test_manage_users_does_not_show_accepted_invite( def test_user_cant_invite_themselves( - logged_in_client, + client_request, mocker, active_user_with_permissions, mock_create_invite, mock_get_template_folders, ): - service = create_sample_service(active_user_with_permissions) - response = logged_in_client.post( - url_for('main.invite_user', service_id=service['id']), - data={'email_address': active_user_with_permissions.email_address, - 'send_messages': 'y', - 'manage_service': 'y', - 'manage_api_keys': 'y'}, - follow_redirects=True + page = client_request.post( + 'main.invite_user', + service_id=SERVICE_ONE_ID, + _data={ + 'email_address': active_user_with_permissions.email_address, + 'send_messages': 'y', + 'manage_service': 'y', + 'manage_api_keys': 'y', + }, + _follow_redirects=True, + _expected_status=200, ) - - assert response.status_code == 200 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') assert page.h1.string.strip() == 'Invite a team member' form_error = page.find('span', class_='error-message').string.strip() assert form_error == "You can’t send an invitation to yourself" @@ -898,7 +897,7 @@ def test_remove_user_from_service( def test_can_invite_user_as_platform_admin( - logged_in_client, + client_request, service_one, platform_admin_user, active_user_with_permissions, @@ -907,9 +906,11 @@ def test_can_invite_user_as_platform_admin( ): mocker.patch('app.user_api_client.get_users_for_service', return_value=[active_user_with_permissions]) - response = logged_in_client.get(url_for('main.manage_users', service_id=service_one['id'])) - resp_text = response.get_data(as_text=True) - assert url_for('.invite_user', service_id=service_one['id']) in resp_text + page = client_request.get( + 'main.manage_users', + service_id=SERVICE_ONE_ID, + ) + assert url_for('.invite_user', service_id=service_one['id']) in str(page) def test_edit_user_email_page( @@ -947,24 +948,21 @@ def test_edit_user_email_page_404_for_non_team_member( def test_edit_user_email_redirects_to_confirmation( - logged_in_client, + client_request, active_user_with_permissions, mock_get_users_by_service, - service_one, - mocker, - mock_get_user, ): - response = logged_in_client.post( - url_for( - 'main.edit_user_email', - service_id=service_one['id'], - user_id=active_user_with_permissions.id)) - assert response.status_code == 302 - assert response.location == url_for( - 'main.confirm_edit_user_email', - service_id=service_one['id'], + client_request.post( + 'main.edit_user_email', + service_id=SERVICE_ONE_ID, user_id=active_user_with_permissions.id, - _external=True + _expected_status=302, + _expected_redirect=url_for( + 'main.confirm_edit_user_email', + service_id=SERVICE_ONE_ID, + user_id=active_user_with_permissions.id, + _external=True, + ), ) @@ -993,48 +991,43 @@ def test_edit_user_email_without_changing_goes_back_to_team_members( def test_confirm_edit_user_email_page( - logged_in_client, + client_request, active_user_with_permissions, mock_get_users_by_service, - service_one, - mocker, mock_get_user, ): new_email = 'new_email@gov.uk' - with logged_in_client.session_transaction() as session: + with client_request.session_transaction() as session: session['team_member_email_change'] = new_email - response = logged_in_client.get(url_for( - 'main.confirm_edit_user_email', - service_id=service_one['id'], - user_id=active_user_with_permissions.id - )) - assert 'Confirm change of email address' in response.get_data(as_text=True) + page = client_request.get( + 'main.confirm_edit_user_email', + service_id=SERVICE_ONE_ID, + user_id=active_user_with_permissions.id, + ) + + assert 'Confirm change of email address' in page.text for text in [ 'New email address:', new_email, 'We will send {} an email to tell them about the change.'.format(active_user_with_permissions.name) ]: - assert text in response.get_data(as_text=True) - assert 'Confirm' in response.get_data(as_text=True) - assert response.status_code == 200 + assert text in page.text + assert 'Confirm' in page.text def test_confirm_edit_user_email_page_redirects_if_session_empty( - logged_in_client, - active_user_with_permissions, + client_request, mock_get_users_by_service, - service_one, - mocker, - mock_get_user, + active_user_with_permissions, ): - response = logged_in_client.get(url_for( + page = client_request.get( 'main.confirm_edit_user_email', - service_id=service_one['id'], - user_id=active_user_with_permissions.id - )) - assert response.status_code == 302 - assert 'Confirm change of email address' not in response.get_data(as_text=True) + service_id=SERVICE_ONE_ID, + user_id=active_user_with_permissions.id, + _follow_redirects=True, + ) + assert 'Confirm change of email address' not in page.text def test_confirm_edit_user_email_page_404s_for_non_team_member( @@ -1050,7 +1043,7 @@ def test_confirm_edit_user_email_page_404s_for_non_team_member( def test_confirm_edit_user_email_changes_user_email( - logged_in_client, + client_request, active_user_with_permissions, mock_get_users_by_service, service_one, @@ -1059,16 +1052,19 @@ def test_confirm_edit_user_email_changes_user_email( mock_update_user_attribute ): new_email = 'new_email@gov.uk' - with logged_in_client.session_transaction() as session: + with client_request.session_transaction() as session: session['team_member_email_change'] = new_email - response = logged_in_client.post( - url_for( - 'main.confirm_edit_user_email', - service_id=service_one['id'], - user_id=active_user_with_permissions.id)) - assert response.status_code == 302 - assert response.location == url_for( - 'main.manage_users', service_id=service_one['id'], _external=True) + client_request.post( + 'main.confirm_edit_user_email', + service_id=service_one['id'], + user_id=active_user_with_permissions.id, + _expected_status=302, + _expected_redirect=url_for( + 'main.manage_users', + service_id=SERVICE_ONE_ID, + _external=True, + ), + ) mock_update_user_attribute.assert_called_once_with( active_user_with_permissions.id, email_address=new_email, @@ -1162,51 +1158,49 @@ def test_edit_user_mobile_number_page( def test_edit_user_mobile_number_redirects_to_confirmation( - logged_in_client, + client_request, active_user_with_permissions, mock_get_users_by_service, - service_one, - mocker, - mock_get_user, ): - - data = {'mobile_number': '07554080636'} - response = logged_in_client.post( - url_for( - 'main.edit_user_mobile_number', - service_id=service_one['id'], - user_id=active_user_with_permissions.id), data=data) - assert response.status_code == 302 - assert response.location == url_for( - 'main.confirm_edit_user_mobile_number', - service_id=service_one['id'], + client_request.post( + 'main.edit_user_mobile_number', + service_id=SERVICE_ONE_ID, user_id=active_user_with_permissions.id, - _external=True + _data={'mobile_number': '07554080636'}, + _expected_status=302, + _expected_redirect=url_for( + 'main.confirm_edit_user_mobile_number', + service_id=SERVICE_ONE_ID, + user_id=active_user_with_permissions.id, + _external=True, + ), ) def test_edit_user_mobile_number_redirects_to_manage_users_if_number_not_changed( - logged_in_client, + client_request, active_user_with_permissions, mock_get_users_by_service, service_one, mocker, mock_get_user, ): - - data = {'mobile_number': '0770••••762'} - response = logged_in_client.post( - url_for( - 'main.edit_user_mobile_number', - service_id=service_one['id'], - user_id=active_user_with_permissions.id), data=data) - assert response.status_code == 302 - assert response.location == url_for( - 'main.manage_users', service_id=service_one['id'], _external=True) + client_request.post( + 'main.edit_user_mobile_number', + service_id=SERVICE_ONE_ID, + user_id=active_user_with_permissions.id, + _data={'mobile_number': '0770••••762'}, + _expected_status=302, + _expected_redirect=url_for( + 'main.manage_users', + service_id=SERVICE_ONE_ID, + _external=True, + ), + ) def test_confirm_edit_user_mobile_number_page( - logged_in_client, + client_request, active_user_with_permissions, mock_get_users_by_service, service_one, @@ -1214,44 +1208,43 @@ def test_confirm_edit_user_mobile_number_page( mock_get_user, ): new_number = '07554080636' - with logged_in_client.session_transaction() as session: + with client_request.session_transaction() as session: session['team_member_mobile_change'] = new_number - response = logged_in_client.get(url_for( + page = client_request.get( 'main.confirm_edit_user_mobile_number', - service_id=service_one['id'], - user_id=active_user_with_permissions.id - )) + service_id=SERVICE_ONE_ID, + user_id=active_user_with_permissions.id, + ) - assert response.status_code == 200 - assert 'Confirm change of mobile number' in response.get_data(as_text=True) + assert 'Confirm change of mobile number' in page.text for text in [ 'New mobile number:', new_number, 'We will send {} a text message to tell them about the change.'.format(active_user_with_permissions.name) ]: - assert text in response.get_data(as_text=True) - assert 'Confirm' in response.get_data(as_text=True) + assert text in page.text + assert 'Confirm' in page.text def test_confirm_edit_user_mobile_number_page_redirects_if_session_empty( - logged_in_client, + client_request, active_user_with_permissions, mock_get_users_by_service, service_one, mocker, mock_get_user, ): - response = logged_in_client.get(url_for( + page = client_request.get( 'main.confirm_edit_user_mobile_number', - service_id=service_one['id'], - user_id=active_user_with_permissions.id - )) - assert response.status_code == 302 - assert 'Confirm change of mobile number' not in response.get_data(as_text=True) + service_id=SERVICE_ONE_ID, + user_id=active_user_with_permissions.id, + _expected_status=302, + ) + assert 'Confirm change of mobile number' not in page.text def test_confirm_edit_user_mobile_number_changes_user_mobile_number( - logged_in_client, + client_request, active_user_with_permissions, mock_get_users_by_service, service_one, @@ -1260,16 +1253,19 @@ def test_confirm_edit_user_mobile_number_changes_user_mobile_number( mock_update_user_attribute ): new_number = '07554080636' - with logged_in_client.session_transaction() as session: + with client_request.session_transaction() as session: session['team_member_mobile_change'] = new_number - response = logged_in_client.post( - url_for( - 'main.confirm_edit_user_mobile_number', - service_id=service_one['id'], - user_id=active_user_with_permissions.id)) - assert response.status_code == 302 - assert response.location == url_for( - 'main.manage_users', service_id=service_one['id'], _external=True) + client_request.post( + 'main.confirm_edit_user_mobile_number', + service_id=SERVICE_ONE_ID, + user_id=active_user_with_permissions.id, + _expected_status=302, + _expected_redirect=url_for( + 'main.manage_users', + service_id=SERVICE_ONE_ID, + _external=True, + ), + ) mock_update_user_attribute.assert_called_once_with( active_user_with_permissions.id, mobile_number=new_number, diff --git a/tests/app/main/views/test_send.py b/tests/app/main/views/test_send.py index a6dbc063f..33b35367a 100644 --- a/tests/app/main/views/test_send.py +++ b/tests/app/main/views/test_send.py @@ -185,7 +185,7 @@ def test_sms_sender_has_receives_replies_hint( ) ]) def test_sender_session_is_present_after_selected( - logged_in_client, + client_request, service_one, fake_uuid, template_mock, @@ -194,12 +194,14 @@ def test_sender_session_is_present_after_selected( ): template_mock(mocker) sender_data(mocker) - logged_in_client.post( - url_for('.set_sender', service_id=service_one['id'], template_id=fake_uuid), - data={'sender': '1234'} + client_request.post( + '.set_sender', + service_id=service_one['id'], + template_id=fake_uuid, + _data={'sender': '1234'}, ) - with logged_in_client.session_transaction() as session: + with client_request.session_transaction() as session: assert session['sender_id'] == '1234' @@ -214,7 +216,7 @@ def test_sender_session_is_present_after_selected( ) ]) def test_set_sender_redirects_if_no_sender_data( - logged_in_client, + client_request, service_one, fake_uuid, template_mock, @@ -223,17 +225,18 @@ def test_set_sender_redirects_if_no_sender_data( ): template_mock(mocker) sender_data(mocker) - response = logged_in_client.get( - url_for('.set_sender', service_id=service_one['id'], template_id=fake_uuid) - ) - assert response.status_code == 302 - expected_url = url_for( - '.send_one_off', - service_id=service_one['id'], + client_request.get( + '.set_sender', + service_id=SERVICE_ONE_ID, template_id=fake_uuid, - _external=True, + _expected_status=302, + _expected_url=url_for( + '.send_one_off', + service_id=service_one['id'], + template_id=fake_uuid, + _external=True, + ) ) - assert response.location == expected_url def test_that_test_files_exist(): @@ -242,7 +245,7 @@ def test_that_test_files_exist(): def test_should_not_allow_files_to_be_uploaded_without_the_correct_permission( - logged_in_client, + client_request, mock_get_service_template, service_one, fake_uuid, @@ -250,14 +253,13 @@ def test_should_not_allow_files_to_be_uploaded_without_the_correct_permission( template_id = fake_uuid service_one['permissions'] = [] - response = logged_in_client.get(url_for( + page = client_request.get( '.send_messages', - service_id=service_one['id'], - template_id=template_id), - follow_redirects=True) - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + service_id=SERVICE_ONE_ID, + template_id=template_id, + _follow_redirects=True, + ) - assert response.status_code == 200 assert page.select('main p')[0].text.strip() == "Sending text messages has been disabled for your service." assert page.select(".page-footer-back-link")[0].text == "Back to the template" assert page.select(".page-footer-back-link")[0]['href'] == url_for( @@ -908,7 +910,7 @@ def test_404_for_previewing_a_row_out_of_range( active_caseworking_user, )) def test_send_test_doesnt_show_file_contents( - logged_in_client, + client_request, mocker, mock_get_service_template, mock_s3_upload, @@ -925,13 +927,13 @@ def test_send_test_doesnt_show_file_contents( 07700 900 986 """) - response = logged_in_client.get( - url_for('main.send_test', service_id=service_one['id'], template_id=fake_uuid), - follow_redirects=True, + page = client_request.get( + 'main.send_test', + service_id=SERVICE_ONE_ID, + template_id=fake_uuid, + _follow_redirects=True, ) - assert response.status_code == 200 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') assert page.select('h1')[0].text.strip() == 'Preview of ‘Two week reminder’' assert len(page.select('table')) == 0 assert len(page.select('.banner-dangerous')) == 0 @@ -984,7 +986,7 @@ def test_send_test_doesnt_show_file_contents( ]) def test_send_test_step_redirects_if_session_not_setup( mocker, - logged_in_client, + client_request, mock_get_service_statistics, mock_get_users_by_service, mock_has_no_jobs, @@ -998,22 +1000,24 @@ def test_send_test_step_redirects_if_session_not_setup( template_mock(mocker) mocker.patch('app.main.views.send.get_page_count_for_letter', return_value=99) - with logged_in_client.session_transaction() as session: + with client_request.session_transaction() as session: assert 'recipient' not in session assert 'placeholders' not in session - response = logged_in_client.get( - url_for(endpoint, service_id=SERVICE_ONE_ID, template_id=fake_uuid, step_index=0), - follow_redirects=True + client_request.get( + endpoint, + service_id=SERVICE_ONE_ID, + template_id=fake_uuid, + step_index=0, + _follow_redirects=True, ) - assert response.status_code == 200 - with logged_in_client.session_transaction() as session: + with client_request.session_transaction() as session: assert session['recipient'] == expected_recipient def test_send_one_off_does_not_send_without_the_correct_permissions( - logged_in_client, + client_request, mock_get_service_template, service_one, fake_uuid, @@ -1021,14 +1025,13 @@ def test_send_one_off_does_not_send_without_the_correct_permissions( template_id = fake_uuid service_one['permissions'] = [] - response = logged_in_client.get(url_for( + page = client_request.get( '.send_one_off', - service_id=service_one['id'], - template_id=template_id), - follow_redirects=True) - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + service_id=SERVICE_ONE_ID, + template_id=template_id, + _follow_redirects=True, + ) - assert response.status_code == 200 assert page.select('main p')[0].text.strip() == "Sending text messages has been disabled for your service." assert page.select(".page-footer-back-link")[0].text == "Back to the template" assert page.select(".page-footer-back-link")[0]['href'] == url_for( @@ -1145,7 +1148,7 @@ def test_send_one_off_or_test_has_correct_page_titles( ), ]) def test_send_one_off_has_skip_link( - logged_in_client, + client_request, service_one, fake_uuid, mock_get_service_email_template, @@ -1160,14 +1163,15 @@ def test_send_one_off_has_skip_link( template_mock(mocker) mocker.patch('app.main.views.send.get_page_count_for_letter', return_value=99) - response = logged_in_client.get( - url_for('main.send_one_off_step', service_id=service_one['id'], template_id=fake_uuid, step_index=0), - follow_redirects=True + page = client_request.get( + 'main.send_one_off_step', + service_id=SERVICE_ONE_ID, + template_id=fake_uuid, + step_index=0, + _follow_redirects=True, ) - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') - skip_links = page.select('a.top-gutter-4-3') - assert response.status_code == 200 + skip_links = page.select('a.top-gutter-4-3') if expected_link_text and expected_link_url: assert skip_links[0].text.strip() == expected_link_text @@ -1212,7 +1216,7 @@ def test_send_one_off_has_sticky_header_for_email_and_letter( active_caseworking_user, )) def test_skip_link_will_not_show_on_sms_one_off_if_service_has_no_mobile_number( - logged_in_client, + client_request, service_one, fake_uuid, mock_get_service_template, @@ -1223,11 +1227,13 @@ def test_skip_link_will_not_show_on_sms_one_off_if_service_has_no_mobile_number( user = user(fake_uuid) user.mobile_number = None mocker.patch('app.user_api_client.get_user', return_value=user) - response = logged_in_client.get( - url_for('main.send_one_off_step', service_id=service_one['id'], template_id=fake_uuid, step_index=0), - follow_redirects=True + page = client_request.get( + 'main.send_one_off_step', + service_id=SERVICE_ONE_ID, + template_id=fake_uuid, + step_index=0, + _follow_redirects=True, ) - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') skip_links = page.select('a.top-gutter-4-3') assert not skip_links @@ -1425,7 +1431,7 @@ def test_send_test_redirects_to_start_if_you_skip_steps( ('main.send_one_off_step', 'main.send_one_off'), ]) def test_send_test_redirects_to_start_if_index_out_of_bounds_and_some_placeholders_empty( - logged_in_client, + client_request, service_one, fake_uuid, mock_get_service_email_template, @@ -1439,22 +1445,21 @@ def test_send_test_redirects_to_start_if_index_out_of_bounds_and_some_placeholde user, ): mocker.patch('app.user_api_client.get_user', return_value=user(fake_uuid)) - with logged_in_client.session_transaction() as session: + with client_request.session_transaction() as session: session['placeholders'] = {'name': 'foo'} - response = logged_in_client.get(url_for( + client_request.get( endpoint, - service_id=service_one['id'], + service_id=SERVICE_ONE_ID, template_id=fake_uuid, step_index=999, - )) - - assert response.status_code == 302 - assert response.location == url_for( - expected_redirect, - service_id=service_one['id'], - template_id=fake_uuid, - _external=True, + _expected_status=302, + _expected_redirect=url_for( + expected_redirect, + service_id=SERVICE_ONE_ID, + template_id=fake_uuid, + _external=True, + ), ) @@ -1467,7 +1472,7 @@ def test_send_test_redirects_to_start_if_index_out_of_bounds_and_some_placeholde ('main.send_one_off', 'main.send_one_off_step'), ]) def test_send_test_sms_message_redirects_with_help_argument( - logged_in_client, + client_request, mocker, service_one, fake_uuid, @@ -1479,17 +1484,20 @@ def test_send_test_sms_message_redirects_with_help_argument( template = {'data': {'template_type': 'sms'}} mocker.patch('app.service_api_client.get_service_template', return_value=template) - response = logged_in_client.get( - url_for(endpoint, service_id=service_one['id'], template_id=fake_uuid, help=1) - ) - assert response.status_code == 302 - assert response.location == url_for( - expected_redirect, - service_id=service_one['id'], + client_request.get( + endpoint, + service_id=SERVICE_ONE_ID, template_id=fake_uuid, - step_index=0, help=1, - _external=True, + _expected_status=302, + _expected_response=url_for( + expected_redirect, + service_id=SERVICE_ONE_ID, + template_id=fake_uuid, + step_index=0, + help=1, + _external=True, + ) ) @@ -1498,7 +1506,7 @@ def test_send_test_sms_message_redirects_with_help_argument( active_caseworking_user, )) def test_send_test_email_message_without_placeholders_redirects_to_check_page( - logged_in_client, + client_request, mocker, service_one, mock_get_service_email_template_without_placeholders, @@ -1511,15 +1519,17 @@ def test_send_test_email_message_without_placeholders_redirects_to_check_page( ): mocker.patch('app.user_api_client.get_user', return_value=user(fake_uuid)) - with logged_in_client.session_transaction() as session: + with client_request.session_transaction() as session: session['recipient'] = 'foo@bar.com' - response = logged_in_client.get( - url_for('main.send_test', step_index=0, service_id=service_one['id'], template_id=fake_uuid), - follow_redirects=True + page = client_request.get( + 'main.send_test', + step_index=0, + service_id=SERVICE_ONE_ID, + template_id=fake_uuid, + _follow_redirects=True, ) - assert response.status_code == 200 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + assert page.select('h1')[0].text.strip() == 'Preview of ‘Two week reminder’' @@ -1639,7 +1649,7 @@ def test_send_test_letter_redirects_to_right_url( def test_send_test_populates_field_from_session( - logged_in_client, + client_request, mocker, service_one, mock_login, @@ -1648,19 +1658,17 @@ def test_send_test_populates_field_from_session( fake_uuid, ): - with logged_in_client.session_transaction() as session: + with client_request.session_transaction() as session: session['recipient'] = None session['placeholders'] = {} session['placeholders']['name'] = 'Jo' - response = logged_in_client.get(url_for( + page = client_request.get( 'main.send_test_step', - service_id=service_one['id'], + service_id=SERVICE_ONE_ID, template_id=fake_uuid, step_index=0, - )) - assert response.status_code == 200 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + ) assert page.select('input')[0]['value'] == 'Jo' @@ -1690,29 +1698,24 @@ def test_send_test_caches_page_count( def test_send_test_indicates_optional_address_columns( - logged_in_client, + client_request, mocker, - service_one, - mock_login, - mock_get_service, mock_get_service_letter_template, fake_uuid, ): mocker.patch('app.main.views.send.get_page_count_for_letter', return_value=1) - with logged_in_client.session_transaction() as session: + with client_request.session_transaction() as session: session['recipient'] = None session['placeholders'] = {} - response = logged_in_client.get(url_for( + page = client_request.get( 'main.send_test_step', - service_id=service_one['id'], + service_id=SERVICE_ONE_ID, template_id=fake_uuid, step_index=3, - )) - assert response.status_code == 200 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + ) assert normalize_spaces(page.select('label')[0].text) == ( 'address line 3 ' @@ -1720,78 +1723,70 @@ def test_send_test_indicates_optional_address_columns( ) assert page.select('.page-footer-back-link')[0]['href'] == url_for( 'main.send_one_off_step', - service_id=service_one['id'], + service_id=SERVICE_ONE_ID, template_id=fake_uuid, step_index=2, ) def test_send_test_allows_empty_optional_address_columns( - logged_in_client, + client_request, mocker, - service_one, - mock_login, - mock_get_service, mock_get_service_letter_template, fake_uuid, ): mocker.patch('app.main.views.send.get_page_count_for_letter', return_value=1) - with logged_in_client.session_transaction() as session: + with client_request.session_transaction() as session: session['recipient'] = None session['placeholders'] = {} - response = logged_in_client.post( - url_for( - 'main.send_test_step', - service_id=service_one['id'], - template_id=fake_uuid, - step_index=3, - ), - # no data here - ) - - assert response.status_code == 302 - assert response.location == url_for( + client_request.post( 'main.send_test_step', - service_id=service_one['id'], + service_id=SERVICE_ONE_ID, template_id=fake_uuid, - step_index=4, - _external=True, + step_index=3, + # no data here + _expected_status=302, + _expected_redirect=url_for( + 'main.send_test_step', + service_id=SERVICE_ONE_ID, + template_id=fake_uuid, + step_index=4, + _external=True, + ), ) def test_send_test_sms_message_puts_submitted_data_in_session( - logged_in_client, + client_request, service_one, mock_get_service_template_with_placeholders, mock_get_users_by_service, mock_get_service_statistics, fake_uuid, ): - with logged_in_client.session_transaction() as session: + with client_request.session_transaction() as session: session['recipient'] = '07700 900762' session['placeholders'] = {} - response = logged_in_client.post( - url_for( - 'main.send_test_step', - service_id=service_one['id'], - template_id=fake_uuid, - step_index=0, - ), - data={'placeholder_value': 'Jo'} - ) - assert response.status_code == 302 - assert response.location == url_for( - 'main.check_notification', + client_request.post( + 'main.send_test_step', service_id=service_one['id'], template_id=fake_uuid, - _external=True + step_index=0, + _data={'placeholder_value': 'Jo'}, + _expected_status=302, + _expected_redirect=url_for( + 'main.check_notification', + service_id=service_one['id'], + template_id=fake_uuid, + _external=True, + ) ) - with logged_in_client.session_transaction() as session: + with client_request.session_transaction() as session: assert session['recipient'] == '07700 900762' assert session['placeholders']['name'] == 'Jo' @@ -1839,7 +1834,7 @@ def test_send_test_works_as_letter_preview( def test_send_test_clears_session( - logged_in_client, + client_request, mocker, service_one, fake_uuid, @@ -1847,20 +1842,18 @@ def test_send_test_clears_session( template = {'data': {'template_type': 'sms'}} mocker.patch('app.service_api_client.get_service_template', return_value=template) - with logged_in_client.session_transaction() as session: + with client_request.session_transaction() as session: session['recipient'] = '07700900001' session['placeholders'] = {'foo': 'bar'} - response = logged_in_client.get( - url_for( - 'main.send_test', - service_id=service_one['id'], - template_id=fake_uuid, - ), + client_request.get( + 'main.send_test', + service_id=SERVICE_ONE_ID, + template_id=fake_uuid, + _expected_status=302, ) - assert response.status_code == 302 - with logged_in_client.session_transaction() as session: + with client_request.session_transaction() as session: assert session['recipient'] is None assert session['placeholders'] == {} @@ -2035,8 +2028,7 @@ def test_letter_can_only_be_sent_now( '', '2016-08-25T13:04:21.767198' ]) def test_create_job_should_call_api( - logged_in_client, - service_one, + client_request, mock_create_job, mock_get_job, mock_get_notifications, @@ -2046,13 +2038,12 @@ def test_create_job_should_call_api( fake_uuid, when ): - service_id = service_one['id'] - data = mock_get_job(service_one['id'], fake_uuid)['data'] + data = mock_get_job(SERVICE_ONE_ID, fake_uuid)['data'] job_id = data['id'] original_file_name = data['original_file_name'] template_id = data['template'] notification_count = data['notification_count'] - with logged_in_client.session_transaction() as session: + with client_request.session_transaction() as session: session['file_uploads'] = { fake_uuid: { 'template_id': template_id, @@ -2061,22 +2052,21 @@ def test_create_job_should_call_api( } } - response = logged_in_client.post( - url_for( - 'main.start_job', - service_id=service_one['id'], - upload_id=job_id, - original_file_name=original_file_name - ), - data={'scheduled_for': when}, - follow_redirects=True, + page = client_request.post( + 'main.start_job', + service_id=SERVICE_ONE_ID, + upload_id=job_id, + original_file_name=original_file_name, + _data={'scheduled_for': when}, + _follow_redirects=True, + _expected_status=200, ) - assert response.status_code == 200 - assert original_file_name in response.get_data(as_text=True) + assert original_file_name in page.text + mock_create_job.assert_called_with( job_id, - service_id, + SERVICE_ONE_ID, scheduled_for=when, ) @@ -2360,12 +2350,9 @@ def test_route_permissions_sending( ] ) def test_check_messages_back_link( - logged_in_client, - api_user_active, - mock_login, + client_request, mock_get_user_by_email, mock_get_users_by_service, - mock_get_service, mock_has_permissions, mock_get_service_statistics, mock_get_job_doesnt_exist, @@ -2386,7 +2373,7 @@ def test_check_messages_back_link( return_value=5, ) - with logged_in_client.session_transaction() as session: + with client_request.session_transaction() as session: session['file_uploads'] = { fake_uuid: { 'original_file_name': 'valid.csv', @@ -2396,18 +2383,18 @@ def test_check_messages_back_link( } } - response = logged_in_client.get(url_for( + page = client_request.get( 'main.check_messages', - service_id=fake_uuid, + service_id=SERVICE_ONE_ID, upload_id=fake_uuid, template_id=fake_uuid, + _test_page_title=False, **extra_args - )) - assert response.status_code == 200 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + ) + assert ( page.findAll('a', {'class': 'page-footer-back-link'})[0]['href'] - ) == expected_url(service_id=fake_uuid, template_id=fake_uuid) + ) == expected_url(service_id=SERVICE_ONE_ID, template_id=fake_uuid) def test_shows_link_to_end_tour( @@ -2456,15 +2443,12 @@ def test_go_to_dashboard_after_tour_link( ], ids=['none_sent', 'some_sent']) def test_check_messages_shows_too_many_messages_errors( mocker, - logged_in_client, - api_user_active, - mock_login, + client_request, + mock_get_service, # set message_limit to 50 mock_get_users_by_service, - mock_get_service, mock_get_service_template, mock_get_job_doesnt_exist, mock_get_jobs, - mock_has_permissions, fake_uuid, num_requested, expected_msg @@ -2478,7 +2462,7 @@ def test_check_messages_shows_too_many_messages_errors( 'email': {'requested': 0, 'delivered': 0, 'failed': 0} }) - with logged_in_client.session_transaction() as session: + with client_request.session_transaction() as session: session['file_uploads'] = { fake_uuid: { 'template_id': fake_uuid, @@ -2487,15 +2471,15 @@ def test_check_messages_shows_too_many_messages_errors( } } - response = logged_in_client.get(url_for( + page = client_request.get( 'main.check_messages', - service_id=fake_uuid, + service_id=SERVICE_ONE_ID, template_id=fake_uuid, upload_id=fake_uuid, original_file_name='valid.csv', - )) - assert response.status_code == 200 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + _test_page_title=False, + ) + assert page.find('h1').text.strip() == 'Too many recipients' assert page.find('div', class_='banner-dangerous').find('a').text.strip() == 'trial mode' @@ -2506,9 +2490,8 @@ def test_check_messages_shows_too_many_messages_errors( def test_check_messages_shows_trial_mode_error( - logged_in_client, + client_request, mock_get_users_by_service, - mock_get_service, mock_get_service_template, mock_has_permissions, mock_get_service_statistics, @@ -2521,21 +2504,21 @@ def test_check_messages_shows_trial_mode_error( 'phone number,\n07900900321' # Not in team )) - with logged_in_client.session_transaction() as session: + with client_request.session_transaction() as session: session['file_uploads'] = { fake_uuid: { 'template_id': '', } } - response = logged_in_client.get(url_for( + page = client_request.get( 'main.check_messages', - service_id=uuid.uuid4(), + service_id=SERVICE_ONE_ID, template_id=fake_uuid, - upload_id=fake_uuid - )) - assert response.status_code == 200 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + upload_id=fake_uuid, + _test_page_title=False, + ) + assert ' '.join( page.find('div', class_='banner-dangerous').text.split() ) == ( @@ -2945,11 +2928,8 @@ def test_send_one_off_letter_errors_in_trial_mode( def test_check_messages_shows_over_max_row_error( - logged_in_client, - api_user_active, - mock_login, + client_request, mock_get_users_by_service, - mock_get_service, mock_get_service_template_with_placeholders, mock_has_permissions, mock_get_service_statistics, @@ -2964,21 +2944,21 @@ def test_check_messages_shows_over_max_row_error( mock_recipients.__len__.return_value = 99999 mock_recipients.too_many_rows.return_value = True - with logged_in_client.session_transaction() as session: + with client_request.session_transaction() as session: session['file_uploads'] = { fake_uuid: { 'template_id': fake_uuid, } } - response = logged_in_client.get(url_for( + page = client_request.get( 'main.check_messages', - service_id=fake_uuid, + service_id=SERVICE_ONE_ID, template_id=fake_uuid, - upload_id=fake_uuid - )) - assert response.status_code == 200 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + upload_id=fake_uuid, + _test_page_title=False, + ) + assert ' '.join( page.find('div', class_='banner-dangerous').text.split() ) == ( @@ -2995,27 +2975,27 @@ def test_check_messages_shows_over_max_row_error( {'name': 'Jo'} ]) def test_check_notification_redirects_if_session_not_populated( - logged_in_client, + client_request, service_one, fake_uuid, existing_session_items, mock_get_service_template_with_placeholders ): - with logged_in_client.session_transaction() as session: + with client_request.session_transaction() as session: session.update(existing_session_items) - resp = logged_in_client.get(url_for( + client_request.get( 'main.check_notification', - service_id=service_one['id'], - template_id=fake_uuid - )) - - assert resp.location == url_for( - 'main.send_one_off_step', - service_id=service_one['id'], + service_id=SERVICE_ONE_ID, template_id=fake_uuid, - step_index=1, - _external=True + _expected_status=301, + _expected_redirect=url_for( + 'main.send_one_off_step', + service_id=SERVICE_ONE_ID, + template_id=fake_uuid, + step_index=1, + _external=True, + ) ) @@ -3187,23 +3167,23 @@ def test_send_notification_clears_session( def test_send_notification_redirects_if_missing_data( - logged_in_client, - service_one, + client_request, fake_uuid, ): - with logged_in_client.session_transaction() as session: + with client_request.session_transaction() as session: session['placeholders'] = {'a': 'b'} - resp = logged_in_client.post( - url_for('main.send_notification', service_id=service_one['id'], template_id=fake_uuid) - ) - - assert resp.status_code == 302 - assert resp.location == url_for( - '.send_one_off', - service_id=service_one['id'], + client_request.post( + 'main.send_notification', + service_id=SERVICE_ONE_ID, template_id=fake_uuid, - _external=True + _expected_status=302, + _expected_redirect=url_for( + '.send_one_off', + service_id=SERVICE_ONE_ID, + template_id=fake_uuid, + _external=True, + ), ) @@ -3212,28 +3192,29 @@ def test_send_notification_redirects_if_missing_data( ({'help': '3'}, {'help': '3'}) ]) def test_send_notification_redirects_to_view_page( - logged_in_client, - service_one, + client_request, fake_uuid, mock_send_notification, extra_args, extra_redirect_args ): - with logged_in_client.session_transaction() as session: + with client_request.session_transaction() as session: session['recipient'] = '07700900001' session['placeholders'] = {'a': 'b'} - resp = logged_in_client.post( - url_for('main.send_notification', service_id=service_one['id'], template_id=fake_uuid, **extra_args) - ) - - assert resp.status_code == 302 - assert resp.location == url_for( - '.view_notification', - service_id=service_one['id'], - notification_id=fake_uuid, - _external=True, - **extra_redirect_args + client_request.post( + 'main.send_notification', + service_id=SERVICE_ONE_ID, + template_id=fake_uuid, + _expected_status=302, + _expected_redirect=url_for( + '.view_notification', + service_id=SERVICE_ONE_ID, + notification_id=fake_uuid, + _external=True, + **extra_redirect_args + ), + **extra_args ) diff --git a/tests/app/main/views/test_service_settings.py b/tests/app/main/views/test_service_settings.py index 73e022302..ed4f73e40 100644 --- a/tests/app/main/views/test_service_settings.py +++ b/tests/app/main/views/test_service_settings.py @@ -242,42 +242,41 @@ def test_if_cant_send_letters_then_cant_see_letter_contact_block( def test_letter_contact_block_shows_none_if_not_set( - logged_in_client, - service_one, - mocker, - single_reply_to_email_address, - no_letter_contact_blocks, - mock_get_service_organisation, - single_sms_sender, - mock_get_service_settings_page_common, + client_request, + service_one, + single_reply_to_email_address, + no_letter_contact_blocks, + mock_get_service_organisation, + single_sms_sender, + mock_get_service_settings_page_common, ): service_one['permissions'] = ['letter'] - response = logged_in_client.get(url_for( - 'main.service_settings', service_id=service_one['id'] - )) + page = client_request.get( + 'main.service_settings', + service_id=SERVICE_ONE_ID, + ) - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') div = page.find_all('tr')[9].find_all('td')[1].div assert div.text.strip() == 'Not set' assert 'default' in div.attrs['class'][0] def test_escapes_letter_contact_block( - logged_in_client, - service_one, - mocker, - single_reply_to_email_address, - single_sms_sender, - mock_get_service_organisation, - injected_letter_contact_block, - mock_get_service_settings_page_common, + client_request, + service_one, + mocker, + single_reply_to_email_address, + single_sms_sender, + mock_get_service_organisation, + injected_letter_contact_block, + mock_get_service_settings_page_common, ): service_one['permissions'] = ['letter'] - response = logged_in_client.get(url_for( - 'main.service_settings', service_id=service_one['id'] - )) + page = client_request.get( + 'main.service_settings', + service_id=SERVICE_ONE_ID, + ) - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') div = str(page.find_all('tr')[9].find_all('td')[1].div) assert 'foo
bar' in div assert '