diff --git a/app/main/views/platform_admin.py b/app/main/views/platform_admin.py index 962c1c3b4..70078c045 100644 --- a/app/main/views/platform_admin.py +++ b/app/main/views/platform_admin.py @@ -8,6 +8,7 @@ from notifications_python_client.errors import HTTPError from requests import RequestException from app import ( + billing_api_client, complaint_api_client, format_date_numeric, letter_jobs_client, @@ -292,6 +293,37 @@ def notifications_sent_by_service(): return render_template('views/platform-admin/notifications_by_service.html', form=form) +@main.route("/platform-admin/reports/usage-for-all-services", methods=['GET', 'POST']) +@user_is_platform_admin +def usage_for_all_services(): + form = RequiredDateFilterForm() + + if form.validate_on_submit(): + start_date = form.start_date.data + end_date = form.end_date.data + headers = ["organisation_id", "organisation_name", "service_id", "service_name", + "sms_cost", "sms_fragments", "letter_cost", "letter_breakdown"] + + result = billing_api_client.get_usage_for_all_services(start_date, end_date) + rows = [ + [ + r['organisation_id'], r["organisation_name"], r["service_id"], r["service_name"], + r["sms_cost"], r['sms_fragments'], r["letter_cost"], r["letter_breakdown"].strip() + ] + for r in result + ] + if rows: + return Spreadsheet.from_rows([headers] + rows).as_csv_data, 200, { + 'Content-Type': 'text/csv; charset=utf-8', + 'Content-Disposition': 'attachment; filename="Usage for all services from {} to {}.csv"'.format( + start_date, end_date + ) + } + else: + flash('No results for dates') + return render_template('views/platform-admin/usage_for_all_services.html', form=form) + + @main.route("/platform-admin/complaints") @user_is_platform_admin def platform_admin_list_complaints(): diff --git a/app/navigation.py b/app/navigation.py index ed7d7c87f..d04a43998 100644 --- a/app/navigation.py +++ b/app/navigation.py @@ -92,6 +92,7 @@ class HeaderNavigation(Navigation): 'live_services_csv', 'notifications_sent_by_service', 'performance_platform_xlsx', + 'usage_for_all_services', 'platform_admin', 'platform_admin_letter_validation_preview', 'platform_admin_list_complaints', @@ -578,6 +579,7 @@ class MainNavigation(Navigation): 'two_factor_email_sent', 'update_email_branding', 'update_letter_branding', + 'usage_for_all_services', 'user_information', 'user_profile', 'user_profile_email', @@ -853,6 +855,7 @@ class CaseworkNavigation(Navigation): 'update_letter_branding', 'uploads', 'usage', + 'usage_for_all_services', 'user_information', 'user_profile', 'user_profile_email', @@ -1129,6 +1132,7 @@ class OrgNavigation(Navigation): 'update_letter_branding', 'uploads', 'usage', + 'usage_for_all_services', 'user_information', 'user_profile', 'user_profile_email', diff --git a/app/notify_client/billing_api_client.py b/app/notify_client/billing_api_client.py index 204588430..849716b55 100644 --- a/app/notify_client/billing_api_client.py +++ b/app/notify_client/billing_api_client.py @@ -34,5 +34,12 @@ class BillingAPIClient(NotifyAdminAPIClient): data=data ) + def get_usage_for_all_services(self, start_date, end_date): + return self.get(url='/platform-stats/usage-for-all-services', + params={ + 'start_date': str(start_date), + 'end_date': str(end_date), + }) + billing_api_client = BillingAPIClient() diff --git a/app/templates/views/platform-admin/reports.html b/app/templates/views/platform-admin/reports.html index 702651b8d..8f5c90f19 100644 --- a/app/templates/views/platform-admin/reports.html +++ b/app/templates/views/platform-admin/reports.html @@ -21,4 +21,7 @@

Monthly notification statuses for live services

+

+ Usage for all services +

{% endblock %} diff --git a/app/templates/views/platform-admin/usage_for_all_services.html b/app/templates/views/platform-admin/usage_for_all_services.html new file mode 100644 index 000000000..d0ad090b9 --- /dev/null +++ b/app/templates/views/platform-admin/usage_for_all_services.html @@ -0,0 +1,20 @@ +{% extends "views/platform-admin/_base_template.html" %} +{% from "components/form.html" import form_wrapper %} + +{% block per_page_title %} + Usage for all services +{% endblock %} + +{% block platform_admin_content %} + +

+ Usage for all services +

+ + {% call form_wrapper() %} + {{ textbox(form.start_date, hint="Enter start date in format YYYY-MM-DD") }} + {{ textbox(form.end_date, hint="Enter end date in format YYYY-MM-DD") }} + {{ page_footer('Download report') }} + {% endcall %} + +{% endblock %} \ No newline at end of file diff --git a/tests/app/main/views/organisations/test_organisation.py b/tests/app/main/views/organisations/test_organisation.py index 9a9817783..7e3ae2de9 100644 --- a/tests/app/main/views/organisations/test_organisation.py +++ b/tests/app/main/views/organisations/test_organisation.py @@ -17,7 +17,7 @@ from tests.conftest import ( def test_organisation_page_shows_all_organisations( - logged_in_platform_admin_client, + platform_admin_client, mocker ): orgs = [ @@ -29,7 +29,7 @@ def test_organisation_page_shows_all_organisations( get_organisations = mocker.patch( 'app.models.organisation.Organisations.client', return_value=orgs ) - response = logged_in_platform_admin_client.get( + response = platform_admin_client.get( url_for('.organisations') ) @@ -594,12 +594,12 @@ def test_update_organisation_domains( def test_update_organisation_name( - logged_in_platform_admin_client, + platform_admin_client, organisation_one, mock_get_organisation, mock_organisation_name_is_unique ): - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for('.edit_organisation_name', org_id=organisation_one['id']), data={'name': 'TestNewOrgName'} ) @@ -614,11 +614,11 @@ def test_update_organisation_name( def test_update_organisation_with_incorrect_input( - logged_in_platform_admin_client, + platform_admin_client, organisation_one, mock_get_organisation, ): - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for('.edit_organisation_name', org_id=organisation_one['id']), data={'name': ''} ) @@ -632,12 +632,12 @@ def test_update_organisation_with_incorrect_input( def test_update_organisation_with_non_unique_name( - logged_in_platform_admin_client, + platform_admin_client, organisation_one, mock_get_organisation, mock_organisation_name_is_not_unique ): - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for('.edit_organisation_name', org_id=organisation_one['id']), data={'name': 'TestNewOrgName'} ) @@ -653,17 +653,17 @@ def test_update_organisation_with_non_unique_name( def test_confirm_update_organisation( - logged_in_platform_admin_client, + platform_admin_client, organisation_one, mock_get_organisation, mock_verify_password, mock_update_organisation, mocker ): - with logged_in_platform_admin_client.session_transaction() as session: + with platform_admin_client.session_transaction() as session: session['organisation_name_change'] = 'newName' - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for( '.confirm_edit_organisation_name', org_id=organisation_one['id'], @@ -681,17 +681,17 @@ def test_confirm_update_organisation( def test_confirm_update_organisation_with_incorrect_password( - logged_in_platform_admin_client, + platform_admin_client, organisation_one, mock_get_organisation, mocker ): - with logged_in_platform_admin_client.session_transaction() as session: + with platform_admin_client.session_transaction() as session: session['organisation_name_change'] = 'newName' mocker.patch('app.user_api_client.verify_password', return_value=False) - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for( '.confirm_edit_organisation_name', org_id=organisation_one['id'] @@ -707,13 +707,13 @@ def test_confirm_update_organisation_with_incorrect_password( def test_confirm_update_organisation_with_name_already_in_use( - logged_in_platform_admin_client, + platform_admin_client, organisation_one, mock_get_organisation, mock_verify_password, mocker ): - with logged_in_platform_admin_client.session_transaction() as session: + with platform_admin_client.session_transaction() as session: session['organisation_name_change'] = 'newName' mocker.patch( @@ -727,7 +727,7 @@ def test_confirm_update_organisation_with_name_already_in_use( ) ) - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for( '.confirm_edit_organisation_name', org_id=organisation_one['id'] @@ -739,11 +739,11 @@ def test_confirm_update_organisation_with_name_already_in_use( def test_get_edit_organisation_go_live_notes_page( - logged_in_platform_admin_client, + platform_admin_client, mock_get_organisation, organisation_one, ): - response = logged_in_platform_admin_client.get( + response = platform_admin_client.get( url_for( '.edit_organisation_go_live_notes', org_id=organisation_one['id'] @@ -761,14 +761,14 @@ def test_get_edit_organisation_go_live_notes_page( (' ', None) ]) def test_post_edit_organisation_go_live_notes_updates_go_live_notes( - logged_in_platform_admin_client, + platform_admin_client, mock_get_organisation, mock_update_organisation, organisation_one, input_note, saved_note, ): - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for( '.edit_organisation_go_live_notes', org_id=organisation_one['id'], diff --git a/tests/app/main/views/service_settings/test_service_setting_permissions.py b/tests/app/main/views/service_settings/test_service_setting_permissions.py index 98b3d0767..9dc34903c 100644 --- a/tests/app/main/views/service_settings/test_service_setting_permissions.py +++ b/tests/app/main/views/service_settings/test_service_setting_permissions.py @@ -47,7 +47,7 @@ def test_service_set_permission_requires_platform_admin( ]) def test_service_set_permission( mocker, - logged_in_platform_admin_client, + platform_admin_client, service_one, mock_get_inbound_number_for_service, permission, @@ -55,7 +55,7 @@ def test_service_set_permission( on ): force_permission = mocker.patch('app.models.service.Service.force_permission') - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for('main.service_set_permission', service_id=service_one['id'], permission=permission), data={'enabled': form_data} ) diff --git a/tests/app/main/views/test_dashboard.py b/tests/app/main/views/test_dashboard.py index 2bd6a68dc..82bcbdc2a 100644 --- a/tests/app/main/views/test_dashboard.py +++ b/tests/app/main/views/test_dashboard.py @@ -1452,7 +1452,7 @@ def test_org_breadcrumbs_show_if_user_is_platform_admin( mock_get_service_templates_when_no_templates_exist, mock_get_jobs, platform_admin_user, - logged_in_platform_admin_client, + platform_admin_client, ): service_one_json = service_json(SERVICE_ONE_ID, users=[platform_admin_user['id']], @@ -1461,7 +1461,7 @@ def test_org_breadcrumbs_show_if_user_is_platform_admin( mocker.patch('app.service_api_client.get_service', return_value={'data': service_one_json}) mocker.patch('app.models.service.Organisation') - response = logged_in_platform_admin_client.get(url_for('main.service_dashboard', service_id=SERVICE_ONE_ID)) + response = platform_admin_client.get(url_for('main.service_dashboard', service_id=SERVICE_ONE_ID)) page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') assert page.select_one('.navigation-organisation-link')['href'] == url_for( diff --git a/tests/app/main/views/test_email_branding.py b/tests/app/main/views/test_email_branding.py index a91b2b6b4..ac59ab1e2 100644 --- a/tests/app/main/views/test_email_branding.py +++ b/tests/app/main/views/test_email_branding.py @@ -15,11 +15,11 @@ from tests.conftest import ( def test_email_branding_page_shows_full_branding_list( - logged_in_platform_admin_client, + platform_admin_client, mock_get_all_email_branding ): - response = logged_in_platform_admin_client.get( + response = platform_admin_client.get( url_for('.email_branding') ) @@ -52,11 +52,11 @@ def test_email_branding_page_shows_full_branding_list( def test_edit_email_branding_shows_the_correct_branding_info( - logged_in_platform_admin_client, + platform_admin_client, mock_get_email_branding, fake_uuid ): - response = logged_in_platform_admin_client.get( + response = platform_admin_client.get( url_for('.update_email_branding', branding_id=fake_uuid) ) @@ -70,11 +70,11 @@ def test_edit_email_branding_shows_the_correct_branding_info( def test_create_email_branding_does_not_show_any_branding_info( - logged_in_platform_admin_client, + platform_admin_client, mock_no_email_branding ): - response = logged_in_platform_admin_client.get( + response = platform_admin_client.get( url_for('.create_email_branding') ) @@ -88,7 +88,7 @@ def test_create_email_branding_does_not_show_any_branding_info( def test_create_new_email_branding_without_logo( - logged_in_platform_admin_client, + platform_admin_client, mocker, fake_uuid, mock_create_email_branding, @@ -104,7 +104,7 @@ def test_create_new_email_branding_without_logo( mock_persist = mocker.patch('app.main.views.email_branding.persist_logo') mocker.patch('app.main.views.email_branding.delete_email_temp_files_created_by') - logged_in_platform_admin_client.post( + platform_admin_client.post( url_for('.create_email_branding'), content_type='multipart/form-data', data=data @@ -174,12 +174,12 @@ def test_create_email_branding_does_not_require_a_name_when_uploading_a_file( def test_create_new_email_branding_when_branding_saved( - logged_in_platform_admin_client, + platform_admin_client, mocker, mock_create_email_branding, fake_uuid ): - with logged_in_platform_admin_client.session_transaction() as session: + with platform_admin_client.session_transaction() as session: user_id = session["user_id"] data = { @@ -199,7 +199,7 @@ def test_create_new_email_branding_when_branding_saved( mocker.patch('app.main.views.email_branding.persist_logo') mocker.patch('app.main.views.email_branding.delete_email_temp_files_created_by') - logged_in_platform_admin_client.post( + platform_admin_client.post( url_for('.create_email_branding', logo=temp_filename), content_type='multipart/form-data', data={ @@ -228,7 +228,7 @@ def test_create_new_email_branding_when_branding_saved( ('main.update_email_branding', True), ]) def test_deletes_previous_temp_logo_after_uploading_logo( - logged_in_platform_admin_client, + platform_admin_client, mocker, endpoint, has_data, @@ -237,7 +237,7 @@ def test_deletes_previous_temp_logo_after_uploading_logo( if has_data: mock_get_email_branding(mocker, fake_uuid) - with logged_in_platform_admin_client.session_transaction() as session: + with platform_admin_client.session_transaction() as session: user_id = session["user_id"] temp_old_filename = EMAIL_LOGO_LOCATION_STRUCTURE.format( @@ -259,7 +259,7 @@ def test_deletes_previous_temp_logo_after_uploading_logo( mocked_delete_email_temp_file = mocker.patch('app.main.views.email_branding.delete_email_temp_file') - logged_in_platform_admin_client.post( + platform_admin_client.post( url_for('main.create_email_branding', logo=temp_old_filename, branding_id=fake_uuid), data={'file': (BytesIO(''.encode('utf-8')), 'test.png')}, content_type='multipart/form-data' @@ -271,13 +271,13 @@ def test_deletes_previous_temp_logo_after_uploading_logo( def test_update_existing_branding( - logged_in_platform_admin_client, + platform_admin_client, mocker, fake_uuid, mock_get_email_branding, mock_update_email_branding ): - with logged_in_platform_admin_client.session_transaction() as session: + with platform_admin_client.session_transaction() as session: user_id = session["user_id"] data = { @@ -297,7 +297,7 @@ def test_update_existing_branding( mocker.patch('app.main.views.email_branding.persist_logo') mocker.patch('app.main.views.email_branding.delete_email_temp_files_created_by') - logged_in_platform_admin_client.post( + platform_admin_client.post( url_for('.update_email_branding', logo=temp_filename, branding_id=fake_uuid), content_type='multipart/form-data', data={'colour': data['colour'], 'name': data['name'], 'text': data['text'], @@ -320,11 +320,11 @@ def test_update_existing_branding( def test_temp_logo_is_shown_after_uploading_logo( - logged_in_platform_admin_client, + platform_admin_client, mocker, fake_uuid, ): - with logged_in_platform_admin_client.session_transaction() as session: + with platform_admin_client.session_transaction() as session: user_id = session["user_id"] temp_filename = EMAIL_LOGO_LOCATION_STRUCTURE.format( @@ -336,7 +336,7 @@ def test_temp_logo_is_shown_after_uploading_logo( mocker.patch('app.main.views.email_branding.upload_email_logo', return_value=temp_filename) mocker.patch('app.main.views.email_branding.delete_email_temp_file') - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for('main.create_email_branding'), data={'file': (BytesIO(''.encode('utf-8')), 'test.png')}, content_type='multipart/form-data', @@ -351,12 +351,12 @@ def test_temp_logo_is_shown_after_uploading_logo( def test_logo_persisted_when_organisation_saved( - logged_in_platform_admin_client, + platform_admin_client, mock_create_email_branding, mocker, fake_uuid ): - with logged_in_platform_admin_client.session_transaction() as session: + with platform_admin_client.session_transaction() as session: user_id = session["user_id"] temp_filename = EMAIL_LOGO_LOCATION_STRUCTURE.format( @@ -366,7 +366,7 @@ def test_logo_persisted_when_organisation_saved( mocked_persist_logo = mocker.patch('app.main.views.email_branding.persist_logo') mocked_delete_email_temp_files_by = mocker.patch('app.main.views.email_branding.delete_email_temp_files_created_by') - resp = logged_in_platform_admin_client.post( + resp = platform_admin_client.post( url_for('.create_email_branding', logo=temp_filename), content_type='multipart/form-data' ) @@ -380,12 +380,12 @@ def test_logo_persisted_when_organisation_saved( def test_logo_does_not_get_persisted_if_updating_email_branding_client_throws_an_error( - logged_in_platform_admin_client, + platform_admin_client, mock_create_email_branding, mocker, fake_uuid ): - with logged_in_platform_admin_client.session_transaction() as session: + with platform_admin_client.session_transaction() as session: user_id = session["user_id"] temp_filename = EMAIL_LOGO_LOCATION_STRUCTURE.format( @@ -395,7 +395,7 @@ def test_logo_does_not_get_persisted_if_updating_email_branding_client_throws_an mocked_delete_email_temp_files_by = mocker.patch('app.main.views.email_branding.delete_email_temp_files_created_by') mocker.patch('app.main.views.email_branding.email_branding_client.create_email_branding', side_effect=HTTPError()) - logged_in_platform_admin_client.post( + platform_admin_client.post( url_for('.create_email_branding', logo=temp_filename), content_type='multipart/form-data' ) @@ -410,7 +410,7 @@ def test_logo_does_not_get_persisted_if_updating_email_branding_client_throws_an ('', 302), ]) def test_colour_regex_validation( - logged_in_platform_admin_client, + platform_admin_client, mocker, fake_uuid, colour_hex, @@ -427,7 +427,7 @@ def test_colour_regex_validation( mocker.patch('app.main.views.email_branding.delete_email_temp_files_created_by') - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for('.create_email_branding'), content_type='multipart/form-data', data=data diff --git a/tests/app/main/views/test_find_users.py b/tests/app/main/views/test_find_users.py index 5c64e8dd9..99e331465 100644 --- a/tests/app/main/views/test_find_users.py +++ b/tests/app/main/views/test_find_users.py @@ -153,11 +153,11 @@ def test_user_information_page_displays_if_there_are_failed_login_attempts( def test_user_information_page_shows_archive_link_for_active_users( - logged_in_platform_admin_client, + platform_admin_client, api_user_active, mock_get_organisations_and_services_for_user, ): - response = logged_in_platform_admin_client.get( + response = platform_admin_client.get( url_for('main.user_information', user_id=api_user_active['id']) ) page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') @@ -186,11 +186,11 @@ def test_user_information_page_does_not_show_archive_link_for_inactive_users( def test_archive_user_prompts_for_confirmation( - logged_in_platform_admin_client, + platform_admin_client, api_user_active, mock_get_organisations_and_services_for_user, ): - response = logged_in_platform_admin_client.get( + response = platform_admin_client.get( url_for('main.archive_user', user_id=api_user_active['id']) ) @@ -200,14 +200,14 @@ def test_archive_user_prompts_for_confirmation( def test_archive_user_posts_to_user_client( - logged_in_platform_admin_client, + platform_admin_client, api_user_active, mocker, mock_events, ): mock_user_client = mocker.patch('app.user_api_client.post') - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for('main.archive_user', user_id=api_user_active['id']) ) @@ -219,7 +219,7 @@ def test_archive_user_posts_to_user_client( def test_archive_user_does_not_create_event_if_user_client_raises_exception( - logged_in_platform_admin_client, + platform_admin_client, api_user_active, mocker, mock_events, @@ -227,7 +227,7 @@ def test_archive_user_does_not_create_event_if_user_client_raises_exception( mock_user_client = mocker.patch('app.user_api_client.post', side_effect=Exception()) with pytest.raises(Exception): - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for('main.archive_user', user_id=api_user_active.id) ) diff --git a/tests/app/main/views/test_inbound_sms_admin.py b/tests/app/main/views/test_inbound_sms_admin.py index df11144ee..323cc8697 100644 --- a/tests/app/main/views/test_inbound_sms_admin.py +++ b/tests/app/main/views/test_inbound_sms_admin.py @@ -25,9 +25,9 @@ sample_inbound_sms = {'data': [{"id": "activated", ]} -def test_inbound_sms_admin(logged_in_platform_admin_client, mocker): +def test_inbound_sms_admin(platform_admin_client, mocker): mocker.patch("app.inbound_number_client.get_all_inbound_sms_number_service", return_value=sample_inbound_sms) - response = logged_in_platform_admin_client.get(url_for("main.inbound_sms_admin")) + response = platform_admin_client.get(url_for("main.inbound_sms_admin")) assert response.status_code == 200 page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') diff --git a/tests/app/main/views/test_letter_branding.py b/tests/app/main/views/test_letter_branding.py index d9c463727..98313eec3 100644 --- a/tests/app/main/views/test_letter_branding.py +++ b/tests/app/main/views/test_letter_branding.py @@ -16,10 +16,10 @@ from tests.conftest import normalize_spaces def test_letter_branding_page_shows_full_branding_list( - logged_in_platform_admin_client, + platform_admin_client, mock_get_all_letter_branding ): - response = logged_in_platform_admin_client.get( + response = platform_admin_client.get( url_for('.letter_branding') ) @@ -49,10 +49,10 @@ def test_letter_branding_page_shows_full_branding_list( def test_update_letter_branding_shows_the_current_letter_brand( - logged_in_platform_admin_client, + platform_admin_client, mock_get_letter_branding_by_id, ): - response = logged_in_platform_admin_client.get( + response = platform_admin_client.get( url_for('.update_letter_branding', branding_id='abc') ) @@ -66,11 +66,11 @@ def test_update_letter_branding_shows_the_current_letter_brand( def test_update_letter_branding_with_new_valid_file( mocker, - logged_in_platform_admin_client, + platform_admin_client, mock_get_letter_branding_by_id, fake_uuid ): - with logged_in_platform_admin_client.session_transaction() as session: + with platform_admin_client.session_transaction() as session: user_id = session["user_id"] filename = 'new_file.svg' @@ -80,7 +80,7 @@ def test_update_letter_branding_with_new_valid_file( mocker.patch('app.s3_client.s3_logo_client.uuid.uuid4', return_value=fake_uuid) mock_delete_temp_files = mocker.patch('app.main.views.letter_branding.delete_letter_temp_file') - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for('.update_letter_branding', branding_id='abc'), data={'file': (BytesIO(''.encode('utf-8')), filename)}, follow_redirects=True @@ -96,10 +96,10 @@ def test_update_letter_branding_with_new_valid_file( def test_update_letter_branding_when_uploading_invalid_file( - logged_in_platform_admin_client, + platform_admin_client, mock_get_letter_branding_by_id ): - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for('.update_letter_branding', branding_id='abc'), data={'file': (BytesIO(''.encode('utf-8')), 'test.png')}, follow_redirects=True @@ -114,11 +114,11 @@ def test_update_letter_branding_when_uploading_invalid_file( def test_update_letter_branding_deletes_any_temp_files_when_uploading_a_file( mocker, - logged_in_platform_admin_client, + platform_admin_client, mock_get_letter_branding_by_id, fake_uuid, ): - with logged_in_platform_admin_client.session_transaction() as session: + with platform_admin_client.session_transaction() as session: user_id = session["user_id"] temp_logo = LETTER_TEMP_LOGO_LOCATION.format(user_id=user_id, unique_id=fake_uuid, filename='temp.svg') @@ -126,7 +126,7 @@ def test_update_letter_branding_deletes_any_temp_files_when_uploading_a_file( mock_s3_upload = mocker.patch('app.s3_client.s3_logo_client.utils_s3upload') mock_delete_temp_files = mocker.patch('app.main.views.letter_branding.delete_letter_temp_file') - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for('.update_letter_branding', branding_id='abc', logo=temp_logo), data={'file': (BytesIO(''.encode('utf-8')), 'new_uploaded_file.svg')}, follow_redirects=True @@ -142,7 +142,7 @@ def test_update_letter_branding_deletes_any_temp_files_when_uploading_a_file( def test_update_letter_branding_with_original_file_and_new_details( mocker, - logged_in_platform_admin_client, + platform_admin_client, mock_get_all_letter_branding, mock_get_letter_branding_by_id, fake_uuid @@ -151,7 +151,7 @@ def test_update_letter_branding_with_original_file_and_new_details( mock_template_preview = mocker.patch('app.main.views.letter_branding.get_png_file_from_svg') mock_upload_logos = mocker.patch('app.main.views.letter_branding.upload_letter_logos') - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for('.update_letter_branding', branding_id=fake_uuid), data={ 'name': 'Updated name', @@ -175,7 +175,7 @@ def test_update_letter_branding_with_original_file_and_new_details( def test_update_letter_branding_shows_form_errors_on_name_fields( mocker, - logged_in_platform_admin_client, + platform_admin_client, mock_get_letter_branding_by_id, fake_uuid ): @@ -183,7 +183,7 @@ def test_update_letter_branding_shows_form_errors_on_name_fields( logo = permanent_letter_logo_name('hm-government', 'svg') - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for('.update_letter_branding', branding_id=fake_uuid, logo=logo), data={ 'name': '', @@ -202,7 +202,7 @@ def test_update_letter_branding_shows_form_errors_on_name_fields( def test_update_letter_branding_shows_database_errors_on_name_field( mocker, - logged_in_platform_admin_client, + platform_admin_client, mock_get_letter_branding_by_id, fake_uuid, ): @@ -222,7 +222,7 @@ def test_update_letter_branding_shows_database_errors_on_name_field( message={'name': ['name already in use']} )) - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for('.update_letter_branding', branding_id='abc'), data={ 'name': 'my brand', @@ -239,7 +239,7 @@ def test_update_letter_branding_shows_database_errors_on_name_field( def test_update_letter_branding_with_new_file_and_new_details( mocker, - logged_in_platform_admin_client, + platform_admin_client, mock_get_all_letter_branding, mock_get_letter_branding_by_id, fake_uuid @@ -254,7 +254,7 @@ def test_update_letter_branding_with_new_file_and_new_details( mock_upload_png = mocker.patch('app.main.views.letter_branding.upload_letter_png_logo') mock_delete_temp_files = mocker.patch('app.main.views.letter_branding.delete_letter_temp_files_created_by') - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for('.update_letter_branding', branding_id=fake_uuid, logo=temp_logo), data={ 'name': 'Updated name', @@ -286,7 +286,7 @@ def test_update_letter_branding_with_new_file_and_new_details( def test_update_letter_branding_rolls_back_db_changes_and_shows_error_if_saving_to_s3_fails( mocker, - logged_in_platform_admin_client, + platform_admin_client, mock_get_letter_branding_by_id, fake_uuid ): @@ -295,7 +295,7 @@ def test_update_letter_branding_rolls_back_db_changes_and_shows_error_if_saving_ mocker.patch('app.main.views.letter_branding.upload_letter_logos', side_effect=BotoClientError({}, 'error')) temp_logo = LETTER_TEMP_LOGO_LOCATION.format(user_id=fake_uuid, unique_id=fake_uuid, filename='new_file.svg') - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for('.update_letter_branding', branding_id=fake_uuid, logo=temp_logo), data={ 'name': 'Updated name', @@ -315,8 +315,8 @@ def test_update_letter_branding_rolls_back_db_changes_and_shows_error_if_saving_ ] -def test_create_letter_branding_does_not_show_branding_info(logged_in_platform_admin_client): - response = logged_in_platform_admin_client.get( +def test_create_letter_branding_does_not_show_branding_info(platform_admin_client): + response = platform_admin_client.get( url_for('.create_letter_branding') ) @@ -329,10 +329,10 @@ def test_create_letter_branding_does_not_show_branding_info(logged_in_platform_a def test_create_letter_branding_when_uploading_valid_file( mocker, - logged_in_platform_admin_client, + platform_admin_client, fake_uuid ): - with logged_in_platform_admin_client.session_transaction() as session: + with platform_admin_client.session_transaction() as session: user_id = session["user_id"] filename = 'test.svg' @@ -342,7 +342,7 @@ def test_create_letter_branding_when_uploading_valid_file( mocker.patch('app.s3_client.s3_logo_client.uuid.uuid4', return_value=fake_uuid) mock_delete_temp_files = mocker.patch('app.main.views.letter_branding.delete_letter_temp_file') - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for('.create_letter_branding'), data={'file': (BytesIO(''.encode('utf-8')), filename)}, follow_redirects=True @@ -356,8 +356,8 @@ def test_create_letter_branding_when_uploading_valid_file( mock_delete_temp_files.assert_not_called() -def test_create_letter_branding_when_uploading_invalid_file(logged_in_platform_admin_client): - response = logged_in_platform_admin_client.post( +def test_create_letter_branding_when_uploading_invalid_file(platform_admin_client): + response = platform_admin_client.post( url_for('.create_letter_branding'), data={'file': (BytesIO(''.encode('utf-8')), 'test.png')}, follow_redirects=True @@ -372,10 +372,10 @@ def test_create_letter_branding_when_uploading_invalid_file(logged_in_platform_a def test_create_letter_branding_deletes_temp_files_when_uploading_a_new_file( mocker, - logged_in_platform_admin_client, + platform_admin_client, fake_uuid, ): - with logged_in_platform_admin_client.session_transaction() as session: + with platform_admin_client.session_transaction() as session: user_id = session["user_id"] temp_logo = LETTER_TEMP_LOGO_LOCATION.format(user_id=user_id, unique_id=fake_uuid, filename='temp.svg') @@ -383,7 +383,7 @@ def test_create_letter_branding_deletes_temp_files_when_uploading_a_new_file( mock_s3_upload = mocker.patch('app.s3_client.s3_logo_client.utils_s3upload') mock_delete_temp_files = mocker.patch('app.main.views.letter_branding.delete_letter_temp_file') - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for('.create_letter_branding', logo=temp_logo), data={'file': (BytesIO(''.encode('utf-8')), 'new.svg')}, follow_redirects=True @@ -399,15 +399,15 @@ def test_create_letter_branding_deletes_temp_files_when_uploading_a_new_file( def test_create_new_letter_branding_shows_preview_of_logo( mocker, - logged_in_platform_admin_client, + platform_admin_client, fake_uuid ): - with logged_in_platform_admin_client.session_transaction() as session: + with platform_admin_client.session_transaction() as session: user_id = session["user_id"] temp_logo = LETTER_TEMP_LOGO_LOCATION.format(user_id=user_id, unique_id=fake_uuid, filename='temp.svg') - response = logged_in_platform_admin_client.get( + response = platform_admin_client.get( url_for('.create_letter_branding', logo=temp_logo) ) @@ -419,10 +419,10 @@ def test_create_new_letter_branding_shows_preview_of_logo( def test_create_letter_branding_shows_an_error_when_submitting_details_with_no_logo( - logged_in_platform_admin_client, + platform_admin_client, fake_uuid ): - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for('.create_letter_branding'), data={ 'name': 'Test brand', @@ -439,10 +439,10 @@ def test_create_letter_branding_shows_an_error_when_submitting_details_with_no_l def test_create_letter_branding_persists_logo_when_all_data_is_valid( mocker, - logged_in_platform_admin_client, + platform_admin_client, fake_uuid, ): - with logged_in_platform_admin_client.session_transaction() as session: + with platform_admin_client.session_transaction() as session: user_id = session["user_id"] temp_logo = LETTER_TEMP_LOGO_LOCATION.format(user_id=user_id, unique_id=fake_uuid, filename='test.svg') @@ -455,7 +455,7 @@ def test_create_letter_branding_persists_logo_when_all_data_is_valid( mock_upload_png = mocker.patch('app.main.views.letter_branding.upload_letter_png_logo') mock_delete_temp_files = mocker.patch('app.main.views.letter_branding.delete_letter_temp_files_created_by') - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for('.create_letter_branding', logo=temp_logo), data={ 'name': 'Test brand', @@ -485,15 +485,15 @@ def test_create_letter_branding_persists_logo_when_all_data_is_valid( def test_create_letter_branding_shows_form_errors_on_name_field( - logged_in_platform_admin_client, + platform_admin_client, fake_uuid ): - with logged_in_platform_admin_client.session_transaction() as session: + with platform_admin_client.session_transaction() as session: user_id = session["user_id"] temp_logo = LETTER_TEMP_LOGO_LOCATION.format(user_id=user_id, unique_id=fake_uuid, filename='test.svg') - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for('.create_letter_branding', logo=temp_logo), data={ 'name': '', @@ -511,10 +511,10 @@ def test_create_letter_branding_shows_form_errors_on_name_field( def test_create_letter_branding_shows_database_errors_on_name_fields( mocker, - logged_in_platform_admin_client, + platform_admin_client, fake_uuid, ): - with logged_in_platform_admin_client.session_transaction() as session: + with platform_admin_client.session_transaction() as session: user_id = session["user_id"] mocker.patch('app.main.views.letter_branding.get_png_file_from_svg') @@ -535,7 +535,7 @@ def test_create_letter_branding_shows_database_errors_on_name_fields( temp_logo = LETTER_TEMP_LOGO_LOCATION.format(user_id=user_id, unique_id=fake_uuid, filename='test.svg') - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for('.create_letter_branding', logo=temp_logo), data={ 'name': 'my brand', diff --git a/tests/app/main/views/test_letters.py b/tests/app/main/views/test_letters.py index 9c49360cb..b5edfe596 100644 --- a/tests/app/main/views/test_letters.py +++ b/tests/app/main/views/test_letters.py @@ -14,7 +14,7 @@ letters_urls = [ ([], 403) ]) def test_letters_access_restricted( - logged_in_platform_admin_client, + platform_admin_client, mocker, permissions, response_code, @@ -26,7 +26,7 @@ def test_letters_access_restricted( mocker.patch('app.service_api_client.get_service', return_value={"data": service_one}) - response = logged_in_platform_admin_client.get(url(service_id=service_one['id'])) + response = platform_admin_client.get(url(service_id=service_one['id'])) assert response.status_code == response_code diff --git a/tests/app/main/views/test_platform_admin.py b/tests/app/main/views/test_platform_admin.py index d3c475456..4f72fe549 100644 --- a/tests/app/main/views/test_platform_admin.py +++ b/tests/app/main/views/test_platform_admin.py @@ -19,12 +19,7 @@ from app.main.views.platform_admin import ( sum_service_usage, ) from tests import service_json -from tests.conftest import ( - SERVICE_ONE_ID, - SERVICE_TWO_ID, - mock_get_user, - normalize_spaces, -) +from tests.conftest import SERVICE_ONE_ID, SERVICE_TWO_ID, normalize_spaces @pytest.mark.parametrize('endpoint', [ @@ -47,16 +42,10 @@ def test_should_redirect_if_not_logged_in( 'main.trial_services', ]) def test_should_403_if_not_platform_admin( - client, - active_user_with_permissions, - mocker, + client_request, endpoint, ): - mock_get_user(mocker, user=active_user_with_permissions) - client.login(active_user_with_permissions) - response = client.get(url_for(endpoint)) - - assert response.status_code == 403 + client_request.get(endpoint, _expected_status=403) @pytest.mark.parametrize('endpoint, restricted, research_mode, displayed', [ @@ -70,9 +59,7 @@ def test_should_show_research_and_restricted_mode( restricted, research_mode, displayed, - client, - platform_admin_user, - mocker, + platform_admin_client, mock_get_detailed_services, fake_uuid, ): @@ -80,9 +67,8 @@ def test_should_show_research_and_restricted_mode( services[0]['statistics'] = create_stats() mock_get_detailed_services.return_value = {'data': services} - mock_get_user(mocker, user=platform_admin_user) - client.login(platform_admin_user) - response = client.get(url_for(endpoint)) + + response = platform_admin_client.get(url_for(endpoint)) assert response.status_code == 200 mock_get_detailed_services.assert_called_once_with({'detailed': True, @@ -100,16 +86,12 @@ def test_should_show_research_and_restricted_mode( ('main.trial_services', 1), ]) def test_should_render_platform_admin_page( - client, - platform_admin_user, - mocker, + platform_admin_client, mock_get_detailed_services, endpoint, expected_services_shown ): - mock_get_user(mocker, user=platform_admin_user) - client.login(platform_admin_user) - response = client.get(url_for(endpoint)) + response = platform_admin_client.get(url_for(endpoint)) assert response.status_code == 200 page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') assert len(page.select('tbody tr')) == expected_services_shown * 3 # one row for SMS, one for email, one for letter @@ -129,16 +111,12 @@ def test_should_render_platform_admin_page( ]) def test_live_trial_services_toggle_including_from_test_key( partial_url_for, - client, - platform_admin_user, - mocker, + platform_admin_client, mock_get_detailed_services, endpoint, inc ): - mock_get_user(mocker, user=platform_admin_user) - client.login(platform_admin_user) - response = client.get(partial_url_for(endpoint)) + response = platform_admin_client.get(partial_url_for(endpoint)) assert response.status_code == 200 mock_get_detailed_services.assert_called_once_with({ @@ -153,15 +131,11 @@ def test_live_trial_services_toggle_including_from_test_key( 'main.trial_services' ]) def test_live_trial_services_with_date_filter( - client, - platform_admin_user, - mocker, + platform_admin_client, mock_get_detailed_services, endpoint ): - mock_get_user(mocker, user=platform_admin_user) - client.login(platform_admin_user) - response = client.get(url_for(endpoint, start_date='2016-12-20', end_date='2016-12-28')) + response = platform_admin_client.get(url_for(endpoint, start_date='2016-12-20', end_date='2016-12-28')) assert response.status_code == 200 resp_data = response.get_data(as_text=True) @@ -192,9 +166,7 @@ def test_live_trial_services_with_date_filter( ), ]) def test_should_show_total_on_live_trial_services_pages( - client, - platform_admin_user, - mocker, + platform_admin_client, mock_get_detailed_services, endpoint, fake_uuid, @@ -230,9 +202,7 @@ def test_should_show_total_on_live_trial_services_pages( mock_get_detailed_services.return_value = {'data': services} - mock_get_user(mocker, user=platform_admin_user) - client.login(platform_admin_user) - response = client.get(url_for(endpoint)) + response = platform_admin_client.get(url_for(endpoint)) assert response.status_code == 200 page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') assert ( @@ -349,9 +319,7 @@ def test_should_show_email_and_sms_stats_for_all_service_types( endpoint, restricted, research_mode, - client, - platform_admin_user, - mocker, + platform_admin_client, mock_get_detailed_services, fake_uuid, ): @@ -366,9 +334,7 @@ def test_should_show_email_and_sms_stats_for_all_service_types( ) mock_get_detailed_services.return_value = {'data': services} - mock_get_user(mocker, user=platform_admin_user) - client.login(platform_admin_user) - response = client.get(url_for(endpoint)) + response = platform_admin_client.get(url_for(endpoint)) assert response.status_code == 200 mock_get_detailed_services.assert_called_once_with({'detailed': True, @@ -397,9 +363,7 @@ def test_should_show_email_and_sms_stats_for_all_service_types( ], ids=['live', 'trial']) def test_should_show_archived_services_last( endpoint, - client, - platform_admin_user, - mocker, + platform_admin_client, mock_get_detailed_services, restricted, ): @@ -413,9 +377,7 @@ def test_should_show_archived_services_last( services[2]['statistics'] = create_stats() mock_get_detailed_services.return_value = {'data': services} - mock_get_user(mocker, user=platform_admin_user) - client.login(platform_admin_user) - response = client.get(url_for(endpoint)) + response = platform_admin_client.get(url_for(endpoint)) assert response.status_code == 200 mock_get_detailed_services.assert_called_once_with({'detailed': True, @@ -433,9 +395,7 @@ def test_should_show_archived_services_last( @pytest.mark.parametrize('research_mode', (True, False)) def test_shows_archived_label_instead_of_live_or_research_mode_label( - client, - platform_admin_user, - mocker, + platform_admin_client, mock_get_detailed_services, research_mode, ): @@ -445,9 +405,7 @@ def test_shows_archived_label_instead_of_live_or_research_mode_label( services[0]['statistics'] = create_stats() mock_get_detailed_services.return_value = {'data': services} - mock_get_user(mocker, user=platform_admin_user) - client.login(platform_admin_user) - response = client.get(url_for('main.live_services')) + response = platform_admin_client.get(url_for('main.live_services')) assert response.status_code == 200 page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') @@ -466,9 +424,7 @@ def test_should_order_services_by_usage_with_inactive_last( endpoint, restricted, research_mode, - client, - platform_admin_user, - mocker, + platform_admin_client, mock_get_detailed_services, fake_uuid, ): @@ -505,9 +461,7 @@ def test_should_order_services_by_usage_with_inactive_last( ) mock_get_detailed_services.return_value = {'data': services} - mock_get_user(mocker, user=platform_admin_user) - client.login(platform_admin_user) - response = client.get(url_for(endpoint)) + response = platform_admin_client.get(url_for(endpoint)) assert response.status_code == 200 mock_get_detailed_services.assert_called_once_with({'detailed': True, @@ -550,12 +504,9 @@ def test_sum_service_usage_with_zeros(fake_uuid): def test_platform_admin_list_complaints( - client, - platform_admin_user, - mocker + platform_admin_client, + mocker ): - mock_get_user(mocker, user=platform_admin_user) - client.login(platform_admin_user) complaint = { 'id': str(uuid.uuid4()), 'notification_id': str(uuid.uuid4()), @@ -569,8 +520,7 @@ def test_platform_admin_list_complaints( mock = mocker.patch('app.complaint_api_client.get_all_complaints', return_value={'complaints': [complaint], 'links': {}}) - client.login(platform_admin_user) - response = client.get(url_for('main.platform_admin_list_complaints')) + response = platform_admin_client.get(url_for('main.platform_admin_list_complaints')) assert response.status_code == 200 resp_data = response.get_data(as_text=True) @@ -578,9 +528,7 @@ def test_platform_admin_list_complaints( assert mock.called -def test_should_show_complaints_with_next_previous(mocker, client, platform_admin_user, service_one, fake_uuid): - mock_get_user(mocker, user=platform_admin_user) - client.login(platform_admin_user) +def test_should_show_complaints_with_next_previous(platform_admin_client, mocker, service_one, fake_uuid): api_response = { 'complaints': [{'complaint_date': None, @@ -596,7 +544,7 @@ def test_should_show_complaints_with_next_previous(mocker, client, platform_admi mocker.patch('app.complaint_api_client.get_all_complaints', return_value=api_response) - response = client.get(url_for('main.platform_admin_list_complaints', page=2)) + response = platform_admin_client.get(url_for('main.platform_admin_list_complaints', page=2)) assert response.status_code == 200 page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') @@ -611,13 +559,11 @@ def test_should_show_complaints_with_next_previous(mocker, client, platform_admi assert 'page 1' in prev_page_link.text.strip() -def test_platform_admin_list_complaints_returns_404_with_invalid_page(mocker, client, platform_admin_user): - mock_get_user(mocker, user=platform_admin_user) - client.login(platform_admin_user) +def test_platform_admin_list_complaints_returns_404_with_invalid_page(platform_admin_client, mocker): mocker.patch('app.complaint_api_client.get_all_complaints', return_value={'complaints': [], 'links': {}}) - response = client.get(url_for('main.platform_admin_list_complaints', page='invalid')) + response = platform_admin_client.get(url_for('main.platform_admin_list_complaints', page='invalid')) assert response.status_code == 404 @@ -644,7 +590,7 @@ def test_get_tech_failure_status_box_data_removes_percentage_data(): assert 'percentage' not in tech_failure_data -def test_platform_admin_with_start_and_end_dates_provided(mocker, logged_in_platform_admin_client): +def test_platform_admin_with_start_and_end_dates_provided(mocker, platform_admin_client): start_date = '2018-01-01' end_date = '2018-06-01' api_args = {'start_date': datetime.date(2018, 1, 1), 'end_date': datetime.date(2018, 6, 1)} @@ -654,7 +600,7 @@ def test_platform_admin_with_start_and_end_dates_provided(mocker, logged_in_plat 'app.main.views.platform_admin.platform_stats_api_client.get_aggregate_platform_stats') complaint_count_mock = mocker.patch('app.main.views.platform_admin.complaint_api_client.get_complaint_count') - logged_in_platform_admin_client.get( + platform_admin_client.get( url_for('main.platform_admin', start_date=start_date, end_date=end_date) ) @@ -663,7 +609,7 @@ def test_platform_admin_with_start_and_end_dates_provided(mocker, logged_in_plat @freeze_time('2018-6-11') -def test_platform_admin_with_only_a_start_date_provided(mocker, logged_in_platform_admin_client): +def test_platform_admin_with_only_a_start_date_provided(mocker, platform_admin_client): start_date = '2018-01-01' api_args = {'start_date': datetime.date(2018, 1, 1), 'end_date': datetime.datetime.utcnow().date()} @@ -672,13 +618,13 @@ def test_platform_admin_with_only_a_start_date_provided(mocker, logged_in_platfo 'app.main.views.platform_admin.platform_stats_api_client.get_aggregate_platform_stats') complaint_count_mock = mocker.patch('app.main.views.platform_admin.complaint_api_client.get_complaint_count') - logged_in_platform_admin_client.get(url_for('main.platform_admin', start_date=start_date)) + platform_admin_client.get(url_for('main.platform_admin', start_date=start_date)) aggregate_stats_mock.assert_called_with(api_args) complaint_count_mock.assert_called_with(api_args) -def test_platform_admin_without_dates_provided(mocker, logged_in_platform_admin_client): +def test_platform_admin_without_dates_provided(mocker, platform_admin_client): api_args = {} mocker.patch('app.main.views.platform_admin.make_columns') @@ -686,7 +632,7 @@ def test_platform_admin_without_dates_provided(mocker, logged_in_platform_admin_ 'app.main.views.platform_admin.platform_stats_api_client.get_aggregate_platform_stats') complaint_count_mock = mocker.patch('app.main.views.platform_admin.complaint_api_client.get_complaint_count') - logged_in_platform_admin_client.get(url_for('main.platform_admin')) + platform_admin_client.get(url_for('main.platform_admin')) aggregate_stats_mock.assert_called_with(api_args) complaint_count_mock.assert_called_with(api_args) @@ -694,7 +640,7 @@ def test_platform_admin_without_dates_provided(mocker, logged_in_platform_admin_ def test_platform_admin_displays_stats_in_right_boxes_and_with_correct_styling( mocker, - logged_in_platform_admin_client, + platform_admin_client, ): platform_stats = { 'email': {'failures': @@ -714,7 +660,7 @@ def test_platform_admin_displays_stats_in_right_boxes_and_with_correct_styling( return_value=platform_stats) mocker.patch('app.main.views.platform_admin.complaint_api_client.get_complaint_count', return_value=15) - response = logged_in_platform_admin_client.get(url_for('main.platform_admin')) + response = platform_admin_client.get(url_for('main.platform_admin')) page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') # Email permanent failure status box - number is correct @@ -733,13 +679,11 @@ def test_platform_admin_displays_stats_in_right_boxes_and_with_correct_styling( 'div', class_='big-number-status-failing').text -def test_platform_admin_submit_returned_letters(mocker, client, platform_admin_user): - mock_get_user(mocker, user=platform_admin_user) - client.login(platform_admin_user) +def test_platform_admin_submit_returned_letters(mocker, platform_admin_client): mock_client = mocker.patch('app.letter_jobs_client.submit_returned_letters') - response = client.post( + response = platform_admin_client.post( url_for('main.platform_admin_returned_letters'), data={'references': ' NOTIFY000REF1 \n NOTIFY002REF2 '} ) @@ -750,13 +694,11 @@ def test_platform_admin_submit_returned_letters(mocker, client, platform_admin_u assert response.location == url_for('main.platform_admin_returned_letters', _external=True) -def test_platform_admin_submit_empty_returned_letters(mocker, client, platform_admin_user): - mock_get_user(mocker, user=platform_admin_user) - client.login(platform_admin_user) +def test_platform_admin_submit_empty_returned_letters(mocker, platform_admin_client): mock_client = mocker.patch('app.letter_jobs_client.submit_returned_letters') - response = client.post( + response = platform_admin_client.post( url_for('main.platform_admin_returned_letters'), data={'references': ' \n '} ) @@ -797,10 +739,8 @@ def test_service_letter_validation_preview_returns_400_if_file_is_too_big( page.find('span', class_='error-message').text.strip() == "File must be less than 2MB" -def test_letter_validation_preview_renders_correctly(mocker, client, platform_admin_user): - mock_get_user(mocker, user=platform_admin_user) - client.login(platform_admin_user) - response = client.get(url_for('main.platform_admin_letter_validation_preview')) +def test_letter_validation_preview_renders_correctly(mocker, platform_admin_client): + response = platform_admin_client.get(url_for('main.platform_admin_letter_validation_preview')) assert response.status_code == 200 page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') @@ -810,10 +750,8 @@ def test_letter_validation_preview_renders_correctly(mocker, client, platform_ad @pytest.mark.parametrize("result,expected_class", [(True, 'banner-with-tick'), (False, "banner-dangerous")]) def test_letter_validation_preview_calls_template_preview_when_data_correct_and_displays_correct_message( - mocker, client, platform_admin_user, result, expected_class + mocker, platform_admin_client, result, expected_class ): - mock_get_user(mocker, user=platform_admin_user) - client.login(platform_admin_user) endpoint = '{}/precompiled/validate?include_preview=true'.format(current_app.config['TEMPLATE_PREVIEW_API_HOST']) mocker.patch('app.main.views.platform_admin.antivirus_client.scan', return_value=True) @@ -825,7 +763,7 @@ def test_letter_validation_preview_calls_template_preview_when_data_correct_and_ status_code=200 ) with open('tests/test_pdf_files/multi_page_pdf.pdf', 'rb') as file: - response = client.post( + response = platform_admin_client.post( url_for('main.platform_admin_letter_validation_preview'), data={"file": file}, content_type='multipart/form-data' @@ -838,12 +776,10 @@ def test_letter_validation_preview_calls_template_preview_when_data_correct_and_ assert page.find('div', class_=expected_class).text.strip() == "bazinga!" -def test_letter_validation_preview_doesnt_call_template_preview_when_no_file(mocker, client, platform_admin_user): - mock_get_user(mocker, user=platform_admin_user) - client.login(platform_admin_user) +def test_letter_validation_preview_doesnt_call_template_preview_when_no_file(mocker, platform_admin_client): antivirus_scan = mocker.patch('app.main.views.platform_admin.antivirus_client.scan') validate_letter = mocker.patch('app.main.views.platform_admin.validate_letter') - response = client.post( + response = platform_admin_client.post( url_for('main.platform_admin_letter_validation_preview'), data={"file": ""}, content_type='multipart/form-data' @@ -856,13 +792,11 @@ def test_letter_validation_preview_doesnt_call_template_preview_when_no_file(moc assert page.find('span', class_='error-message').text.strip() == "You need to upload a file to submit" -def test_letter_validation_preview_doesnt_call_template_preview_when_file_not_pdf(mocker, client, platform_admin_user): - mock_get_user(mocker, user=platform_admin_user) - client.login(platform_admin_user) +def test_letter_validation_preview_doesnt_call_template_preview_when_file_not_pdf(mocker, platform_admin_client): antivirus_scan = mocker.patch('app.main.views.platform_admin.antivirus_client.scan') validate_letter = mocker.patch('app.main.views.platform_admin.validate_letter') with open('tests/non_spreadsheet_files/actually_a_png.csv', 'rb') as file: - response = client.post( + response = platform_admin_client.post( url_for('main.platform_admin_letter_validation_preview'), data={"file": file}, content_type='multipart/form-data' @@ -875,15 +809,14 @@ def test_letter_validation_preview_doesnt_call_template_preview_when_file_not_pd def test_letter_validation_preview_doesnt_call_template_preview_when_file_doesnt_pass_virus_scan( - mocker, client, platform_admin_user + mocker, + platform_admin_client ): - mock_get_user(mocker, user=platform_admin_user) - client.login(platform_admin_user) antivirus_scan = mocker.patch('app.main.views.platform_admin.antivirus_client.scan', return_value=False) validate_letter = mocker.patch('app.main.views.platform_admin.validate_letter') with open('tests/test_pdf_files/multi_page_pdf.pdf', 'rb') as file: - response = client.post( + response = platform_admin_client.post( url_for('main.platform_admin_letter_validation_preview'), data={"file": file}, content_type='multipart/form-data' @@ -954,14 +887,10 @@ def test_clear_cache_requires_option(client_request, platform_admin_user, mocker def test_reports_page( - client, - platform_admin_user, - mocker + platform_admin_client ): - mock_get_user(mocker, user=platform_admin_user) - client.login(platform_admin_user) - response = client.get(url_for('main.platform_admin_reports')) + response = platform_admin_client.get(url_for('main.platform_admin_reports')) assert response.status_code == 200 page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') @@ -978,9 +907,7 @@ def test_reports_page( ).attrs['href'] == url_for('main.notifications_sent_by_service') -def test_get_live_services_report(client, platform_admin_user, mocker): - mock_get_user(mocker, user=platform_admin_user) - client.login(platform_admin_user) +def test_get_live_services_report(platform_admin_client, mocker): mocker.patch( 'app.service_api_client.get_live_services_data', @@ -999,7 +926,7 @@ def test_get_live_services_report(client, platform_admin_user, mocker): 'free_sms_fragment_limit': 200}, ]} ) - response = client.get(url_for('main.live_services_csv')) + response = platform_admin_client.get(url_for('main.live_services_csv')) assert response.status_code == 200 report = response.get_data(as_text=True) assert report.strip() == ( @@ -1014,9 +941,7 @@ def test_get_live_services_report(client, platform_admin_user, mocker): ) -def test_get_performance_platform_report(client, platform_admin_user, mocker): - mock_get_user(mocker, user=platform_admin_user) - client.login(platform_admin_user) +def test_get_performance_platform_report(platform_admin_client, mocker): mocker.patch( 'app.service_api_client.get_live_services_data', @@ -1033,7 +958,7 @@ def test_get_performance_platform_report(client, platform_admin_user, mocker): 'letter_volume_intent': 0, 'sms_totals': 0, 'email_totals': 0, 'letter_totals': 0}, ]} ) - response = client.get(url_for('main.performance_platform_xlsx')) + response = platform_admin_client.get(url_for('main.performance_platform_xlsx')) assert response.status_code == 200 assert pyexcel.get_array( file_type='xlsx', @@ -1079,14 +1004,67 @@ def test_get_notifications_sent_by_service_validates_form(mocker, client_request mock_get_stats_from_api.assert_not_called() +def test_usage_for_all_services_when_no_results_for_date(client_request, platform_admin_user, mocker): + client_request.login(platform_admin_user) + + mocker.patch("app.main.views.platform_admin.billing_api_client.get_usage_for_all_services", + return_value=[]) + + page = client_request.post('main.usage_for_all_services', + _expected_status=200, + _data={'start_date': '2019-01-01', 'end_date': '2019-03-31'}) + + error = page.select_one('.banner-dangerous') + assert normalize_spaces(error.text) == 'No results for dates' + + +def test_usage_for_all_services_when_calls_api_and_download_data(platform_admin_client, mocker): + mocker.patch("app.main.views.platform_admin.billing_api_client.get_usage_for_all_services", + return_value=[{'letter_breakdown': '6 second class letters at 45p\n2 first class letters at 35p\n', + 'letter_cost': 3.4, + 'organisation_id': '7832a1be-a1f0-4f2a-982f-05adfd3d6354', + 'organisation_name': 'Org for a - with sms and letter', + 'service_id': '48e82ac0-c8c4-4e46-8712-c83c35a94006', + 'service_name': 'a - with sms and letter', + 'sms_cost': 0, 'sms_fragments': 0 + }]) + + response = platform_admin_client.post(url_for('main.usage_for_all_services'), + data={'start_date': '2019-01-01', 'end_date': '2019-03-31'}) + + assert response.status_code == 200 + assert response.content_type == 'text/csv; charset=utf-8' + assert response.headers['Content-Disposition'] == ( + 'attachment; filename="Usage for all services from {} to {}.csv"'.format('2019-01-01', '2019-03-31') + ) + + assert response.get_data(as_text=True) == ( + 'organisation_id,organisation_name,service_id,service_name,' + + 'sms_cost,sms_fragments,letter_cost,letter_breakdown' + + + '\r\n' + + + '7832a1be-a1f0-4f2a-982f-05adfd3d6354,' + + 'Org for a - with sms and letter,' + + '48e82ac0-c8c4-4e46-8712-c83c35a94006,' + + 'a - with sms and letter,' + + '0,' + + '0,' + + '3.4,' + + '"6 second class letters at 45p' + + '\n' + + '2 first class letters at 35p"' + + + '\r\n' + ) + + def test_get_notifications_sent_by_service_calls_api_and_downloads_data( mocker, - client, - platform_admin_user, + platform_admin_client, service_one, service_two, ): - mock_get_user(mocker, user=platform_admin_user) api_data = [ ['Tue, 01 Jan 2019 00:00:00 GMT', SERVICE_ONE_ID, service_one['name'], 'email', 191, 0, 0, 14, 0, 0], ['Tue, 01 Jan 2019 00:00:00 GMT', SERVICE_ONE_ID, service_one['name'], 'sms', 42, 0, 0, 8, 0, 0], @@ -1097,9 +1075,7 @@ def test_get_notifications_sent_by_service_calls_api_and_downloads_data( start_date = datetime.date(2019, 1, 1) end_date = datetime.date(2019, 1, 31) - client.login(platform_admin_user) - - response = client.post( + response = platform_admin_client.post( url_for('main.notifications_sent_by_service'), data={'start_date': start_date, 'end_date': end_date} ) diff --git a/tests/app/main/views/test_send.py b/tests/app/main/views/test_send.py index 313a7e44d..87e2a8f89 100644 --- a/tests/app/main/views/test_send.py +++ b/tests/app/main/views/test_send.py @@ -1455,7 +1455,7 @@ def test_send_test_redirects_to_end_if_step_out_of_bounds( ('main.send_one_off_step', 'main.send_one_off'), ]) def test_send_test_redirects_to_start_if_you_skip_steps( - logged_in_platform_admin_client, + platform_admin_client, service_one, fake_uuid, mock_get_service_letter_template, @@ -1470,11 +1470,11 @@ def test_send_test_redirects_to_start_if_you_skip_steps( ): mocker.patch('app.user_api_client.get_user', return_value=user(fake_uuid)) - with logged_in_platform_admin_client.session_transaction() as session: + with platform_admin_client.session_transaction() as session: session['send_test_letter_page_count'] = 1 session['placeholders'] = {'address_line_1': 'foo'} - response = logged_in_platform_admin_client.get(url_for( + response = platform_admin_client.get(url_for( endpoint, service_id=service_one['id'], template_id=fake_uuid, @@ -1722,7 +1722,7 @@ def test_send_test_sms_message_back_link_in_tour( def test_send_test_letter_clears_previous_page_cache( - logged_in_platform_admin_client, + platform_admin_client, mocker, service_one, mock_login, @@ -1731,22 +1731,22 @@ def test_send_test_letter_clears_previous_page_cache( fake_uuid, ): - with logged_in_platform_admin_client.session_transaction() as session: + with platform_admin_client.session_transaction() as session: session['send_test_letter_page_count'] = 'WRONG' - response = logged_in_platform_admin_client.get(url_for( + response = platform_admin_client.get(url_for( 'main.send_test', service_id=service_one['id'], template_id=fake_uuid, )) assert response.status_code == 302 - with logged_in_platform_admin_client.session_transaction() as session: + with platform_admin_client.session_transaction() as session: assert session['send_test_letter_page_count'] is None def test_send_test_letter_redirects_to_right_url( - logged_in_platform_admin_client, + platform_admin_client, fake_uuid, mock_get_service_letter_template, mock_s3_upload, @@ -1755,7 +1755,7 @@ def test_send_test_letter_redirects_to_right_url( mocker, ): - with logged_in_platform_admin_client.session_transaction() as session: + with platform_admin_client.session_transaction() as session: session['send_test_letter_page_count'] = 1 session['recipient'] = '' session['placeholders'] = { @@ -1768,7 +1768,7 @@ def test_send_test_letter_redirects_to_right_url( 'postcode': 'SW1 1AA', } - response = logged_in_platform_admin_client.get(url_for( + response = platform_admin_client.get(url_for( 'main.send_one_off_step', service_id=SERVICE_ONE_ID, template_id=fake_uuid, @@ -1930,7 +1930,7 @@ def test_send_test_sms_message_puts_submitted_data_in_session( @pytest.mark.parametrize('filetype', ['pdf', 'png']) def test_send_test_works_as_letter_preview( filetype, - logged_in_platform_admin_client, + platform_admin_client, mock_get_service_letter_template, mock_get_users_by_service, mock_get_service_statistics, @@ -1948,9 +1948,9 @@ def test_send_test_works_as_letter_preview( service_id = service_one['id'] template_id = fake_uuid - with logged_in_platform_admin_client.session_transaction() as session: + with platform_admin_client.session_transaction() as session: session['placeholders'] = {'address_line_1': 'Jo Lastname'} - response = logged_in_platform_admin_client.get( + response = platform_admin_client.get( url_for( 'main.send_test_preview', service_id=service_id, @@ -2208,12 +2208,12 @@ def test_create_job_should_call_api( def test_can_start_letters_job( - logged_in_platform_admin_client, + platform_admin_client, mock_create_job, service_one, fake_uuid ): - with logged_in_platform_admin_client.session_transaction() as session: + with platform_admin_client.session_transaction() as session: session['file_uploads'] = { fake_uuid: { 'template_id': fake_uuid, @@ -2222,7 +2222,7 @@ def test_can_start_letters_job( } } - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for('main.start_job', service_id=service_one['id'], upload_id=fake_uuid), data={} ) @@ -2271,7 +2271,7 @@ def test_can_start_letters_job( ]) def test_should_show_preview_letter_message( filetype, - logged_in_platform_admin_client, + platform_admin_client, mock_get_service_letter_template, mock_get_users_by_service, mock_get_service_statistics, @@ -2303,7 +2303,7 @@ def test_should_show_preview_letter_message( service_id = service_one['id'] template_id = fake_uuid - with logged_in_platform_admin_client.session_transaction() as session: + with platform_admin_client.session_transaction() as session: session['file_uploads'] = { fake_uuid: { 'template_id': fake_uuid, @@ -2312,7 +2312,7 @@ def test_should_show_preview_letter_message( } } - response = logged_in_platform_admin_client.get( + response = platform_admin_client.get( url_for( 'main.check_messages_preview', service_id=service_id, diff --git a/tests/app/main/views/test_service_settings.py b/tests/app/main/views/test_service_settings.py index 6e821bfa7..3d024e4a2 100644 --- a/tests/app/main/views/test_service_settings.py +++ b/tests/app/main/views/test_service_settings.py @@ -3411,10 +3411,10 @@ def test_organisation_type_pages_are_platform_admin_only( def test_should_show_page_to_set_sms_allowance( - logged_in_platform_admin_client, + platform_admin_client, mock_get_free_sms_fragment_limit ): - response = logged_in_platform_admin_client.get(url_for( + response = platform_admin_client.get(url_for( 'main.set_free_sms_allowance', service_id=SERVICE_ONE_ID )) @@ -3432,14 +3432,14 @@ def test_should_show_page_to_set_sms_allowance( pytest.param('foo', 'foo', marks=pytest.mark.xfail), ]) def test_should_set_sms_allowance( - logged_in_platform_admin_client, + platform_admin_client, given_allowance, expected_api_argument, mock_get_free_sms_fragment_limit, mock_create_or_update_free_sms_fragment_limit, ): - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for( 'main.set_free_sms_allowance', service_id=SERVICE_ONE_ID, @@ -3635,7 +3635,7 @@ def test_switch_service_enable_international_sms( ([], '0207 123 4567', ['upload_document']), ]) def test_service_switch_can_upload_document_shows_permission_page_if_service_contact_details_exist( - logged_in_platform_admin_client, + platform_admin_client, service_one, mock_update_service, mock_get_service_settings_page_common, @@ -3650,7 +3650,7 @@ def test_service_switch_can_upload_document_shows_permission_page_if_service_con service_one['permissions'] = start_permissions service_one['contact_link'] = contact_details - response = logged_in_platform_admin_client.get( + response = platform_admin_client.get( url_for('main.service_switch_can_upload_document', service_id=SERVICE_ONE_ID), follow_redirects=True ) @@ -3659,7 +3659,7 @@ def test_service_switch_can_upload_document_shows_permission_page_if_service_con def test_service_switch_can_upload_document_turning_permission_on_with_no_contact_details_shows_form( - logged_in_platform_admin_client, + platform_admin_client, service_one, mock_get_service_settings_page_common, mock_get_service_organisation, @@ -3667,7 +3667,7 @@ def test_service_switch_can_upload_document_turning_permission_on_with_no_contac no_letter_contact_blocks, single_sms_sender, ): - response = logged_in_platform_admin_client.get( + response = platform_admin_client.get( url_for('main.service_switch_can_upload_document', service_id=SERVICE_ONE_ID), follow_redirects=True ) @@ -3683,7 +3683,7 @@ def test_service_switch_can_upload_document_turning_permission_on_with_no_contac ('phone_number', '0207 12345'), ]) def test_service_switch_can_upload_document_lets_contact_details_be_added_and_shows_permission_page( - logged_in_platform_admin_client, + platform_admin_client, service_one, mock_update_service, mock_get_service_settings_page_common, @@ -3696,7 +3696,7 @@ def test_service_switch_can_upload_document_lets_contact_details_be_added_and_sh ): data = {'contact_details_type': contact_details_type, contact_details_type: contact_details_value} - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for('main.service_switch_can_upload_document', service_id=SERVICE_ONE_ID), data=data, follow_redirects=True @@ -3778,7 +3778,7 @@ def test_archive_service_prompts_user( def test_cant_archive_inactive_service( - logged_in_platform_admin_client, + platform_admin_client, service_one, single_reply_to_email_address, single_letter_contact_block, @@ -3788,7 +3788,7 @@ def test_cant_archive_inactive_service( ): service_one['active'] = False - response = logged_in_platform_admin_client.get(url_for('main.service_settings', service_id=service_one['id'])) + response = platform_admin_client.get(url_for('main.service_settings', service_id=service_one['id'])) assert response.status_code == 200 page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') @@ -3796,14 +3796,14 @@ def test_cant_archive_inactive_service( def test_suspend_service_after_confirm( - logged_in_platform_admin_client, + platform_admin_client, service_one, mocker, mock_get_inbound_number_for_service, ): mocked_fn = mocker.patch('app.service_api_client.post', return_value=service_one) - response = logged_in_platform_admin_client.post(url_for('main.suspend_service', service_id=service_one['id'])) + response = platform_admin_client.post(url_for('main.suspend_service', service_id=service_one['id'])) assert response.status_code == 302 assert response.location == url_for('main.service_settings', service_id=service_one['id'], _external=True) @@ -3811,7 +3811,7 @@ def test_suspend_service_after_confirm( def test_suspend_service_prompts_user( - logged_in_platform_admin_client, + platform_admin_client, service_one, mocker, single_reply_to_email_address, @@ -3822,7 +3822,7 @@ def test_suspend_service_prompts_user( ): mocked_fn = mocker.patch('app.service_api_client.post') - response = logged_in_platform_admin_client.get(url_for('main.suspend_service', service_id=service_one['id'])) + response = platform_admin_client.get(url_for('main.suspend_service', service_id=service_one['id'])) assert response.status_code == 200 page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') @@ -3832,7 +3832,7 @@ def test_suspend_service_prompts_user( def test_cant_suspend_inactive_service( - logged_in_platform_admin_client, + platform_admin_client, service_one, single_reply_to_email_address, single_letter_contact_block, @@ -3842,7 +3842,7 @@ def test_cant_suspend_inactive_service( ): service_one['active'] = False - response = logged_in_platform_admin_client.get(url_for('main.service_settings', service_id=service_one['id'])) + response = platform_admin_client.get(url_for('main.service_settings', service_id=service_one['id'])) assert response.status_code == 200 page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') @@ -3850,7 +3850,7 @@ def test_cant_suspend_inactive_service( def test_resume_service_after_confirm( - logged_in_platform_admin_client, + platform_admin_client, service_one, single_reply_to_email_address, single_letter_contact_block, @@ -3861,7 +3861,7 @@ def test_resume_service_after_confirm( service_one['active'] = False mocked_fn = mocker.patch('app.service_api_client.post', return_value=service_one) - response = logged_in_platform_admin_client.post(url_for('main.resume_service', service_id=service_one['id'])) + response = platform_admin_client.post(url_for('main.resume_service', service_id=service_one['id'])) assert response.status_code == 302 assert response.location == url_for('main.service_settings', service_id=service_one['id'], _external=True) @@ -3869,7 +3869,7 @@ def test_resume_service_after_confirm( def test_resume_service_prompts_user( - logged_in_platform_admin_client, + platform_admin_client, service_one, single_reply_to_email_address, single_letter_contact_block, @@ -3881,7 +3881,7 @@ def test_resume_service_prompts_user( service_one['active'] = False mocked_fn = mocker.patch('app.service_api_client.post') - response = logged_in_platform_admin_client.get(url_for('main.resume_service', service_id=service_one['id'])) + response = platform_admin_client.get(url_for('main.resume_service', service_id=service_one['id'])) assert response.status_code == 200 page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') @@ -3891,7 +3891,7 @@ def test_resume_service_prompts_user( def test_cant_resume_active_service( - logged_in_platform_admin_client, + platform_admin_client, service_one, single_reply_to_email_address, single_letter_contact_block, @@ -3899,7 +3899,7 @@ def test_cant_resume_active_service( single_sms_sender, mock_get_service_settings_page_common ): - response = logged_in_platform_admin_client.get(url_for('main.service_settings', service_id=service_one['id'])) + response = platform_admin_client.get(url_for('main.service_settings', service_id=service_one['id'])) assert response.status_code == 200 page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') @@ -4251,12 +4251,12 @@ def test_updates_sms_prefixing( def test_select_organisation( - logged_in_platform_admin_client, + platform_admin_client, service_one, mock_get_service_organisation, mock_get_organisations ): - response = logged_in_platform_admin_client.get( + response = platform_admin_client.get( url_for('.link_service_to_organisation', service_id=service_one['id']), ) @@ -4271,14 +4271,14 @@ def test_select_organisation( def test_select_organisation_shows_message_if_no_orgs( - logged_in_platform_admin_client, + platform_admin_client, service_one, mock_get_service_organisation, mocker ): mocker.patch('app.organisations_client.get_organisations', return_value=[]) - response = logged_in_platform_admin_client.get( + response = platform_admin_client.get( url_for('.link_service_to_organisation', service_id=service_one['id']), ) @@ -4290,13 +4290,13 @@ def test_select_organisation_shows_message_if_no_orgs( def test_update_service_organisation( - logged_in_platform_admin_client, + platform_admin_client, service_one, mock_get_service_organisation, mock_get_organisations, mock_update_service_organisation, ): - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for('.link_service_to_organisation', service_id=service_one['id']), data={'organisations': '7aa5d4e9-4385-4488-a489-07812ba13384'}, ) @@ -4309,13 +4309,13 @@ def test_update_service_organisation( def test_update_service_organisation_does_not_update_if_same_value( - logged_in_platform_admin_client, + platform_admin_client, service_one, mock_get_service_organisation, mock_get_organisations, mock_update_service_organisation, ): - response = logged_in_platform_admin_client.post( + response = platform_admin_client.post( url_for('.link_service_to_organisation', service_id=service_one['id']), data={'organisations': '7aa5d4e9-4385-4488-a489-07812ba13383'}, ) @@ -4440,7 +4440,7 @@ def test_submit_email_branding_request( def test_show_service_data_retention( - logged_in_platform_admin_client, + platform_admin_client, service_one, mock_get_service_data_retention, @@ -4448,7 +4448,7 @@ def test_show_service_data_retention( mock_get_service_data_retention.return_value[0]['days_of_retention'] = 5 - response = logged_in_platform_admin_client.get(url_for('main.data_retention', service_id=service_one['id'])) + response = platform_admin_client.get(url_for('main.data_retention', service_id=service_one['id'])) page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') rows = page.select('tbody tr') assert len(rows) == 1 @@ -4456,26 +4456,26 @@ def test_show_service_data_retention( def test_view_add_service_data_retention( - logged_in_platform_admin_client, + platform_admin_client, service_one, ): - response = logged_in_platform_admin_client.get(url_for('main.add_data_retention', service_id=service_one['id'])) + response = platform_admin_client.get(url_for('main.add_data_retention', service_id=service_one['id'])) page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') assert normalize_spaces(page.select_one('input')['value']) == "email" assert page.find('input', attrs={'name': 'days_of_retention'}) def test_add_service_data_retention( - logged_in_platform_admin_client, + platform_admin_client, service_one, mock_create_service_data_retention ): - response = logged_in_platform_admin_client.post(url_for('main.add_data_retention', service_id=service_one['id']), - data={'notification_type': "email", - 'days_of_retention': 5 - } - ) + response = platform_admin_client.post(url_for( + 'main.add_data_retention', + service_id=service_one['id']), + data={'notification_type': "email", 'days_of_retention': 5} + ) assert response.status_code == 302 settings_url = url_for( 'main.data_retention', service_id=service_one['id'], _external=True) @@ -4484,17 +4484,19 @@ def test_add_service_data_retention( def test_update_service_data_retention( - logged_in_platform_admin_client, + platform_admin_client, service_one, fake_uuid, mock_get_service_data_retention, mock_update_service_data_retention, ): - response = logged_in_platform_admin_client.post(url_for('main.edit_data_retention', - service_id=service_one['id'], - data_retention_id=str(fake_uuid)), - data={'days_of_retention': 5} - ) + response = platform_admin_client.post( + url_for( + 'main.edit_data_retention', + service_id=service_one['id'], + data_retention_id=str(fake_uuid)), + data={'days_of_retention': 5} + ) assert response.status_code == 302 settings_url = url_for( 'main.data_retention', service_id=service_one['id'], _external=True) @@ -4503,17 +4505,20 @@ def test_update_service_data_retention( def test_update_service_data_retention_return_validation_error_for_negative_days_of_retention( - logged_in_platform_admin_client, + platform_admin_client, service_one, fake_uuid, mock_get_service_data_retention, mock_update_service_data_retention, ): - response = logged_in_platform_admin_client.post(url_for('main.edit_data_retention', - service_id=service_one['id'], - data_retention_id=fake_uuid), - data={'days_of_retention': -5} - ) + response = platform_admin_client.post( + url_for( + 'main.edit_data_retention', + service_id=service_one['id'], + data_retention_id=fake_uuid + ), + data={'days_of_retention': -5} + ) assert response.status_code == 200 page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') error_message = page.find('span', class_='error-message').text.strip() @@ -4523,17 +4528,18 @@ def test_update_service_data_retention_return_validation_error_for_negative_days def test_update_service_data_retention_populates_form( - logged_in_platform_admin_client, + platform_admin_client, service_one, fake_uuid, mock_get_service_data_retention, ): mock_get_service_data_retention.return_value[0]['days_of_retention'] = 5 - response = logged_in_platform_admin_client.get(url_for('main.edit_data_retention', - service_id=service_one['id'], - data_retention_id=fake_uuid) - ) + response = platform_admin_client.get(url_for( + 'main.edit_data_retention', + service_id=service_one['id'], + data_retention_id=fake_uuid + )) assert response.status_code == 200 page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') assert page.find('input', attrs={'name': 'days_of_retention'})['value'] == '5' diff --git a/tests/app/main/views/test_templates.py b/tests/app/main/views/test_templates.py index 76ffda615..a708d4dd5 100644 --- a/tests/app/main/views/test_templates.py +++ b/tests/app/main/views/test_templates.py @@ -722,7 +722,7 @@ def test_should_let_letter_contact_block_be_changed_for_the_template( def test_should_show_page_template_with_priority_select_if_platform_admin( - logged_in_platform_admin_client, + platform_admin_client, platform_admin_user, mocker, mock_get_service_template, @@ -731,7 +731,7 @@ def test_should_show_page_template_with_priority_select_if_platform_admin( ): mocker.patch('app.user_api_client.get_users_for_service', return_value=[platform_admin_user]) template_id = fake_uuid - response = logged_in_platform_admin_client.get(url_for( + response = platform_admin_client.get(url_for( '.edit_service_template', service_id=service_one['id'], template_id=template_id, @@ -806,7 +806,7 @@ def test_dont_show_preview_letter_templates_for_bad_filetype( ]) def test_letter_branding_preview_image( mocker, - logged_in_platform_admin_client, + platform_admin_client, original_filename, new_filename, ): @@ -814,7 +814,7 @@ def test_letter_branding_preview_image( 'app.main.views.templates.TemplatePreview.from_example_template', return_value='foo' ) - resp = logged_in_platform_admin_client.get( + resp = platform_admin_client.get( url_for('.letter_branding_preview_image', filename=original_filename) ) diff --git a/tests/conftest.py b/tests/conftest.py index 0c485907e..dc89436b7 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2835,7 +2835,7 @@ def logged_in_client( @pytest.fixture(scope='function') -def logged_in_platform_admin_client( +def platform_admin_client( client, platform_admin_user, mocker,