diff --git a/app/main/views/platform_admin.py b/app/main/views/platform_admin.py index fd676cc51..ca753782a 100644 --- a/app/main/views/platform_admin.py +++ b/app/main/views/platform_admin.py @@ -15,18 +15,17 @@ from app.statistics_utils import get_formatted_percentage @login_required @user_has_permissions(admin_override=True) def platform_admin(): + services = service_api_client.get_services({'detailed': True})['data'] return render_template( 'views/platform-admin.html', - **get_statistics() + **get_statistics(services) ) -def get_statistics(): - services = service_api_client.get_services({'detailed': True})['data'] - service_stats = format_stats_by_service(services) +def get_statistics(services): return { 'global_stats': create_global_stats(services), - 'service_stats': service_stats + 'service_stats': format_stats_by_service(services) } diff --git a/tests/app/main/views/test_platform_admin.py b/tests/app/main/views/test_platform_admin.py index 1a974b12d..a6b92979e 100644 --- a/tests/app/main/views/test_platform_admin.py +++ b/tests/app/main/views/test_platform_admin.py @@ -2,10 +2,13 @@ from datetime import date from flask import url_for from freezegun import freeze_time +import pytest +from bs4 import BeautifulSoup from tests.conftest import mock_get_user +from tests import service_json -from app.main.views.platform_admin import get_statistics, format_stats_by_service +from app.main.views.platform_admin import get_statistics, format_stats_by_service, create_global_stats def test_should_redirect_if_not_logged_in(app_): @@ -27,6 +30,39 @@ def test_should_403_if_not_platform_admin(app_, active_user_with_permissions, mo assert response.status_code == 403 +@pytest.mark.parametrize('restricted, research_mode, displayed', [ + (True, False, ''), + (False, False, 'Live'), + (False, True, 'research mode'), + (True, True, 'research mode') +]) +def test_should_show_research_and_restricted_mode( + restricted, + research_mode, + displayed, + app_, + platform_admin_user, + mocker, + mock_get_detailed_services, + fake_uuid +): + services = [service_json(fake_uuid, 'My Service', [], restricted=restricted, research_mode=research_mode)] + services[0]['statistics'] = create_stats() + + mock_get_detailed_services.return_value = {'data': services} + with app_.test_request_context(): + with app_.test_client() as client: + mock_get_user(mocker, user=platform_admin_user) + client.login(platform_admin_user) + response = client.get(url_for('main.platform_admin')) + + assert response.status_code == 200 + mock_get_detailed_services.assert_called_once_with({'detailed': True}) + page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + # get second column, which contains flags as text. + assert page.tbody.select('td:nth-of-type(2)')[0].text.strip() == displayed + + def test_should_render_platform_admin_page( app_, platform_admin_user, @@ -39,33 +75,49 @@ def test_should_render_platform_admin_page( client.login(platform_admin_user) response = client.get(url_for('main.platform_admin')) - assert response.status_code == 200 - resp_data = response.get_data(as_text=True) - assert 'Platform admin' in resp_data - assert 'Today' in resp_data - assert 'Services' in resp_data + assert response.status_code == 200 + resp_data = response.get_data(as_text=True) + assert 'Platform admin' in resp_data + assert 'Today' in resp_data + assert 'Services' in resp_data + mock_get_detailed_services.assert_called_once_with({'detailed': True}) -def test_get_statistics_should_summarise_all_stats(mock_get_all_service_statistics, mock_get_services): - resp = get_statistics()['global_stats'] +def test_create_global_stats_sets_failure_rates(fake_uuid): + services = [ + service_json(fake_uuid, 'a', []), + service_json(fake_uuid, 'b', []) + ] + services[0]['statistics'] = create_stats( + emails_requested=1, + emails_delivered=1, + emails_failed=0, + ) + services[1]['statistics'] = create_stats( + emails_requested=2, + emails_delivered=1, + emails_failed=1, + ) - assert 'emails_delivered' in resp - assert 'emails_failed' in resp - assert 'emails_failure_rate' in resp - assert 'sms_delivered' in resp - assert 'sms_failed' in resp - assert 'sms_failure_rate' in resp + stats = create_global_stats(services) - -@freeze_time('2000-06-30T23:30:00', tz_offset=0) -def test_get_statistics_should_query_for_today_forced_to_GMT(mock_get_all_service_statistics, mock_get_services): - get_statistics() - - mock_get_all_service_statistics.assert_called_once_with(date(2000, 7, 1)) + assert stats == { + 'email': { + 'delivered': 2, + 'failed': 1, + 'requested': 3, + 'failure_rate': '33.3' + }, + 'sms': { + 'delivered': 0, + 'failed': 0, + 'requested': 0, + 'failure_rate': '0' + } + } def create_stats( - service, emails_requested=0, emails_delivered=0, emails_failed=0, @@ -74,59 +126,31 @@ def create_stats( sms_failed=0 ): return { - 'service': service, - 'emails_requested': emails_requested, - 'emails_delivered': emails_delivered, - 'emails_failed': emails_failed, - 'sms_requested': sms_requested, - 'sms_delivered': sms_delivered, - 'sms_failed': sms_failed, + 'sms': { + 'requested': sms_requested, + 'delivered': sms_delivered, + 'failed': sms_failed, + }, + 'email': { + 'requested': emails_requested, + 'delivered': emails_delivered, + 'failed': emails_failed, + } } -def test_format_stats_by_service_gets_correct_stats_for_each_service(): - services = [ - {'name': 'a', 'id': 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', 'restricted': False, 'research_mode': True}, - {'name': 'b', 'id': 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', 'restricted': True, 'research_mode': False} - ] - all_stats = [ - create_stats('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', emails_requested=1), - create_stats('bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', emails_requested=2) - ] +def test_format_stats_by_service_sums_values_for_sending(fake_uuid): + services = [service_json(fake_uuid, 'a', [])] + services[0]['statistics'] = create_stats( + emails_requested=10, + emails_delivered=3, + emails_failed=5, + sms_requested=50, + sms_delivered=7, + sms_failed=11 + ) - ret = format_stats_by_service(all_stats, services) - - assert len(ret) == 2 - assert ret[0]['name'] == 'a' - assert ret[0]['sending'] == 1 - assert ret[0]['delivered'] == 0 - assert ret[0]['failed'] == 0 - assert ret[0]['restricted'] is False - - assert ret[1]['name'] == 'b' - assert ret[1]['sending'] == 2 - assert ret[1]['delivered'] == 0 - assert ret[1]['failed'] == 0 - assert ret[1]['restricted'] is True - - -def test_format_stats_by_service_sums_values_for_sending(): - services = [ - {'name': 'a', 'id': 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', 'restricted': False, 'research_mode': False}, - ] - all_stats = [ - create_stats( - 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', - emails_requested=10, - emails_delivered=3, - emails_failed=5, - sms_requested=50, - sms_delivered=7, - sms_failed=11 - ) - ] - - ret = format_stats_by_service(all_stats, services) + ret = list(format_stats_by_service(services)) assert len(ret) == 1 assert ret[0]['sending'] == 34 diff --git a/tests/conftest.py b/tests/conftest.py index 4d8284da2..6f92be0a9 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -108,8 +108,6 @@ def mock_get_detailed_services(mocker, fake_uuid): return mocker.patch('app.service_api_client.get_services', return_value=services) - - @pytest.fixture(scope='function') def mock_get_live_service(mocker, api_user_active): def _get(service_id):