from functools import partial from unittest.mock import ANY, PropertyMock, call from urllib.parse import parse_qs, urlparse from uuid import UUID, uuid4 import pytest from bs4 import BeautifulSoup from flask import url_for from freezegun import freeze_time from notifications_utils.clients.zendesk.zendesk_client import ZendeskClient import app from app.utils import email_safe from tests import ( organisation_json, sample_uuid, service_json, validate_route_permission, ) from tests.conftest import ( ORGANISATION_ID, SERVICE_ONE_ID, active_user_no_api_key_permission, active_user_no_settings_permission, active_user_with_permissions, get_default_letter_contact_block, get_default_reply_to_email_address, get_default_sms_sender, get_inbound_number_sms_sender, get_non_default_letter_contact_block, get_non_default_reply_to_email_address, get_non_default_sms_sender, multiple_letter_contact_blocks, multiple_reply_to_email_addresses, multiple_sms_senders, no_letter_contact_blocks, no_reply_to_email_addresses, no_sms_senders, normalize_spaces, platform_admin_user, ) FAKE_TEMPLATE_ID = uuid4() @pytest.fixture def mock_get_service_settings_page_common( mock_get_all_letter_branding, mock_get_inbound_number_for_service, mock_get_free_sms_fragment_limit, mock_get_service_data_retention, ): return @pytest.mark.parametrize('user, expected_rows', [ (active_user_with_permissions, [ 'Label Value Action', 'Service name service one Change', 'Sign-in method Text message code Change', 'Label Value Action', 'Send emails On Change', 'Email reply-to addresses Not set Change', 'Email branding GOV.UK Change', 'Label Value Action', 'Send text messages On Change', 'Text message sender GOVUK Change', 'Text messages start with service name On Change', 'International text messages Off Change', 'Receive text messages Off Change', 'Label Value Action', 'Send letters Off Change', ]), (platform_admin_user, [ 'Label Value Action', 'Service name service one Change', 'Sign-in method Text message code Change', 'Label Value Action', 'Send emails On Change', 'Email reply-to addresses Not set Change', 'Email branding GOV.UK Change', 'Label Value Action', 'Send text messages On Change', 'Text message sender GOVUK Change', 'Text messages start with service name On Change', 'International text messages Off Change', 'Receive text messages Off Change', 'Label Value Action', 'Send letters Off Change', 'Label Value Action', 'Live Off Change', 'Organisation Org 1 Change', 'Organisation type Central Change', 'Free text message allowance 250,000 Change', 'Email branding GOV.UK Change', 'Letter branding Not set Change', 'Data retention email Change', 'Receive inbound SMS Off Change', 'User auth type editing Off Change', 'Uploading documents Off Change', 'Folder permissions Off Change', ]), ]) def test_should_show_overview( client, mocker, service_one, fake_uuid, no_reply_to_email_addresses, no_letter_contact_blocks, mock_get_service_organisation, single_sms_sender, user, expected_rows, mock_get_service_settings_page_common, ): service_one['permissions'] = ['sms', 'email'] client.login(user(fake_uuid), mocker, service_one) response = 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') assert page.find('h1').text == 'Settings' rows = page.select('tr') assert len(rows) == len(expected_rows) for index, row in enumerate(expected_rows): assert row == " ".join(rows[index].text.split()) app.service_api_client.get_service.assert_called_with(service_one['id']) @pytest.mark.parametrize('permissions, expected_rows', [ (['email', 'sms', 'inbound_sms', 'international_sms'], [ 'Service name service one Change', 'Sign-in method Text message code Change', 'Label Value Action', 'Send emails On Change', 'Email reply-to addresses test@example.com Manage', 'Email branding GOV.UK Change', 'Label Value Action', 'Send text messages On Change', 'Text message sender GOVUK Change', 'Text messages start with service name On Change', 'International text messages On Change', 'Receive text messages On Change', 'Label Value Action', 'Send letters Off Change', ]), (['email', 'sms', 'email_auth'], [ 'Service name service one Change', 'Sign-in method Email link or text message code Change', 'Label Value Action', 'Send emails On Change', 'Email reply-to addresses test@example.com Manage', 'Email branding GOV.UK Change', 'Label Value Action', 'Send text messages On Change', 'Text message sender GOVUK Change', 'Text messages start with service name On Change', 'International text messages Off Change', 'Receive text messages Off Change', 'Label Value Action', 'Send letters Off Change', ]), (['letter'], [ 'Service name service one Change', 'Sign-in method Text message code Change', 'Label Value Action', 'Send emails Off Change', 'Label Value Action', 'Send text messages Off Change', 'Label Value Action', 'Send letters On Change', 'Sender addresses 1 Example Street Manage', 'Letter branding Not set Change', ]), ]) def test_should_show_overview_for_service_with_more_things_set( client, active_user_with_permissions, mocker, service_one, single_reply_to_email_address, single_letter_contact_block, single_sms_sender, mock_get_service_organisation, mock_get_email_branding, mock_get_service_settings_page_common, permissions, expected_rows ): client.login(active_user_with_permissions, mocker, service_one) service_one['permissions'] = permissions response = client.get(url_for( 'main.service_settings', service_id=service_one['id'] )) page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') for index, row in enumerate(expected_rows): assert row == " ".join(page.find_all('tr')[index + 1].text.split()) def test_if_cant_send_letters_then_cant_see_letter_contact_block( 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, ): response = client_request.get('main.service_settings', service_id=service_one['id']) assert 'Letter contact block' not in response 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, ): service_one['permissions'] = ['letter'] response = logged_in_client.get(url_for( '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, ): service_one['permissions'] = ['letter'] response = logged_in_client.get(url_for( '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 '