mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-08-20 14:29:51 -04:00
Merge branch 'master' into load-service-err
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
from flask import Response
|
||||
import pytest
|
||||
from bs4 import BeautifulSoup
|
||||
from notifications_python_client.errors import HTTPError
|
||||
|
||||
@@ -21,3 +22,19 @@ def test_load_service_before_request_handles_404(client_request, mocker):
|
||||
)
|
||||
|
||||
get_service.assert_called_once_with('00000000-0000-0000-0000-000000000000')
|
||||
|
||||
|
||||
@pytest.mark.parametrize('url', [
|
||||
'/invitation/MALFORMED_TOKEN',
|
||||
'/new-password/MALFORMED_TOKEN',
|
||||
'/user-profile/email/confirm/MALFORMED_TOKEN',
|
||||
'/verify-email/MALFORMED_TOKEN'
|
||||
])
|
||||
def test_malformed_token_returns_page_not_found(logged_in_client, url):
|
||||
response = logged_in_client.get(url)
|
||||
|
||||
assert response.status_code == 404
|
||||
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
|
||||
assert page.h1.string.strip() == 'Page could not be found'
|
||||
flash_banner = page.find('div', class_='banner-dangerous').string.strip()
|
||||
assert flash_banner == "There’s something wrong with the link you’ve used."
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import pytest
|
||||
from app.main.forms import RegisterUserForm, ServiceSmsSender
|
||||
from app.main.forms import RegisterUserForm, ServiceSmsSenderForm
|
||||
from app.main.validators import ValidGovEmail, NoCommasInPlaceHolders, OnlyGSMCharacters
|
||||
from wtforms import ValidationError
|
||||
from unittest.mock import Mock
|
||||
@@ -184,7 +184,7 @@ def test_sms_sender_form_validation(
|
||||
client,
|
||||
mock_get_user_by_email,
|
||||
):
|
||||
form = ServiceSmsSender()
|
||||
form = ServiceSmsSenderForm()
|
||||
|
||||
form.sms_sender.data = 'elevenchars'
|
||||
form.validate()
|
||||
|
||||
@@ -1,78 +1,64 @@
|
||||
import app
|
||||
import pytest
|
||||
from bs4 import BeautifulSoup
|
||||
from flask import url_for
|
||||
from notifications_python_client.errors import HTTPError
|
||||
from tests.conftest import normalize_spaces
|
||||
|
||||
|
||||
def test_set_text_message_sender(
|
||||
logged_in_client,
|
||||
mock_update_service,
|
||||
service_one
|
||||
def test_set_inbound_sms_sets_a_number_for_service(
|
||||
logged_in_client,
|
||||
mock_add_sms_sender,
|
||||
multiple_available_inbound_numbers,
|
||||
service_one,
|
||||
fake_uuid,
|
||||
mock_no_inbound_number_for_service,
|
||||
mocker
|
||||
):
|
||||
data = {"sms_sender": "elevenchars"}
|
||||
response = logged_in_client.post(url_for('main.service_set_sms_sender', service_id=service_one['id']),
|
||||
data=data)
|
||||
assert response.status_code == 302
|
||||
assert response.location == url_for('main.service_settings', service_id=service_one['id'], _external=True)
|
||||
mocker.patch('app.service_api_client.update_service_with_properties')
|
||||
data = {
|
||||
"inbound_number": "781d9c60-7a7e-46b7-9896-7b045b992fa5",
|
||||
}
|
||||
|
||||
mock_update_service.assert_called_with(
|
||||
response = logged_in_client.post(
|
||||
url_for('main.service_set_inbound_number', service_id=service_one['id']),
|
||||
data=data
|
||||
)
|
||||
|
||||
assert response.status_code == 302
|
||||
mock_add_sms_sender.assert_called_once_with(
|
||||
service_one['id'],
|
||||
sms_sender="elevenchars"
|
||||
sms_sender="781d9c60-7a7e-46b7-9896-7b045b992fa5",
|
||||
is_default=True,
|
||||
inbound_number_id="781d9c60-7a7e-46b7-9896-7b045b992fa5"
|
||||
)
|
||||
|
||||
|
||||
def test_get_inbound_number_in_service_settings(
|
||||
logged_in_client,
|
||||
mock_update_service,
|
||||
mock_get_letter_organisations,
|
||||
single_reply_to_email_address,
|
||||
single_letter_contact_block,
|
||||
def test_set_inbound_sms_when_no_available_inbound_numbers(
|
||||
client_request,
|
||||
service_one,
|
||||
no_available_inbound_numbers,
|
||||
mock_no_inbound_number_for_service,
|
||||
mocker
|
||||
):
|
||||
mocker_get_inbound_number_fun = mocker.patch(
|
||||
'app.inbound_number_client.get_inbound_sms_number_for_service',
|
||||
return_value={'data': {'number': '077777777', 'id': 'some_uuid'}})
|
||||
page = client_request.get(
|
||||
'main.service_set_inbound_number',
|
||||
service_id=service_one['id']
|
||||
)
|
||||
|
||||
response = logged_in_client.get(url_for('main.service_settings', service_id=service_one['id']))
|
||||
assert response.status_code == 200
|
||||
mocker_get_inbound_number_fun.assert_called_once_with(service_one['id'])
|
||||
|
||||
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
|
||||
element = page.find('span', {"id": "077777777"})
|
||||
assert not element
|
||||
assert normalize_spaces(page.select_one('main p').text) == "No available inbound numbers"
|
||||
|
||||
|
||||
def test_allow_inbound_sms_sets_a_number_for_service(
|
||||
logged_in_client,
|
||||
service_one,
|
||||
mocker
|
||||
def test_set_inbound_sms_when_service_already_has_sms(
|
||||
client_request,
|
||||
service_one,
|
||||
multiple_available_inbound_numbers,
|
||||
mock_get_inbound_number_for_service,
|
||||
):
|
||||
mocker.patch('app.service_api_client.update_service_with_properties')
|
||||
mock_activate_inbound_sms = mocker.patch('app.inbound_number_client.activate_inbound_sms_service')
|
||||
|
||||
response = logged_in_client.get(url_for('main.service_set_inbound_number',
|
||||
service_id=service_one['id'],
|
||||
set_inbound_sms=True))
|
||||
page = client_request.get(
|
||||
'main.service_set_inbound_number',
|
||||
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)
|
||||
mock_activate_inbound_sms.assert_called_once_with(service_one['id'])
|
||||
|
||||
|
||||
def test_allow_inbound_sms_returns_400_if_no_numbers_available(
|
||||
logged_in_client,
|
||||
service_one,
|
||||
mocker
|
||||
):
|
||||
mock_switch_service = mocker.patch('app.service_api_client.update_service_with_properties')
|
||||
mock_activate_inbound = mocker.patch('app.inbound_number_client.activate_inbound_sms_service',
|
||||
side_effect=HTTPError)
|
||||
logged_in_client.get(
|
||||
url_for('main.service_set_inbound_number', service_id=service_one['id'], set_inbound_sms='True'))
|
||||
mock_activate_inbound.assert_called_once_with(service_one['id'])
|
||||
assert mock_switch_service.call_count == 2
|
||||
assert normalize_spaces(page.select_one('main p').text) == "This service already has an inbound number"
|
||||
|
||||
|
||||
def test_set_text_message_sender_and_inbound_sms_permission_exists_return_403(
|
||||
@@ -92,84 +78,3 @@ def test_set_text_message_sender_and_inbound_sms_permission_exists_return_403(
|
||||
|
||||
assert not update_service_mock.called
|
||||
assert app.current_service['permissions'] == ['inbound_sms']
|
||||
|
||||
|
||||
def test_turn_inbound_sms_off(
|
||||
logged_in_client,
|
||||
service_one,
|
||||
mocker
|
||||
):
|
||||
service_one['permissions'] = ['inbound_sms']
|
||||
update_service_mock = mocker.patch('app.service_api_client.update_service',
|
||||
return_value=service_one)
|
||||
mock_deactivate_inbound = mocker.patch('app.inbound_number_client.deactivate_inbound_sms_permission')
|
||||
|
||||
response = logged_in_client.get(url_for('main.service_set_inbound_number', service_id=service_one['id'],
|
||||
set_inbound_sms=False))
|
||||
assert response.status_code == 302
|
||||
assert response.location == url_for('main.service_set_sms_sender', service_id=service_one['id'], _external=True)
|
||||
|
||||
assert app.current_service['permissions'] == []
|
||||
mock_deactivate_inbound.assert_called_once_with(service_id=service_one['id'])
|
||||
assert update_service_mock.called
|
||||
|
||||
|
||||
def test_set_text_message_sender_and_not_inbound_sms(
|
||||
logged_in_client,
|
||||
service_one,
|
||||
mocker
|
||||
):
|
||||
service_one['permissions'] = []
|
||||
update_service_mock = mocker.patch('app.service_api_client.update_service',
|
||||
return_value=service_one)
|
||||
|
||||
data = {"sms_sender": "elevenchars"}
|
||||
response = logged_in_client.post(url_for('main.service_set_sms_sender', service_id=service_one['id'],
|
||||
set_inbound_sms=False),
|
||||
data=data)
|
||||
assert response.status_code == 302
|
||||
assert response.location == url_for('main.service_settings', service_id=service_one['id'], _external=True)
|
||||
|
||||
update_service_mock.assert_called_with(
|
||||
service_one['id'],
|
||||
sms_sender="elevenchars"
|
||||
)
|
||||
assert app.current_service['permissions'] == []
|
||||
|
||||
|
||||
@pytest.mark.parametrize('content, expected_error', [
|
||||
("", "Can’t be empty"),
|
||||
("twelvecharss", "Enter 11 characters or fewer"),
|
||||
(".", "Use letters and numbers only")
|
||||
])
|
||||
def test_set_text_message_sender_validation(
|
||||
logged_in_client,
|
||||
mock_update_service,
|
||||
service_one,
|
||||
content,
|
||||
expected_error,
|
||||
):
|
||||
response = logged_in_client.post(url_for(
|
||||
'main.service_set_sms_sender',
|
||||
service_id=service_one['id']),
|
||||
data={"sms_sender": content},
|
||||
follow_redirects=True
|
||||
)
|
||||
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
|
||||
|
||||
assert response.status_code == 200
|
||||
assert page.select(".error-message")[0].text.strip() == expected_error
|
||||
assert not mock_update_service.called
|
||||
|
||||
|
||||
def test_if_sms_sender_set_then_form_populated(
|
||||
logged_in_client,
|
||||
service_one,
|
||||
mock_get_inbound_number_for_service
|
||||
):
|
||||
service_one['sms_sender'] = 'elevenchars'
|
||||
response = logged_in_client.get(url_for('main.service_set_sms_sender', service_id=service_one['id']))
|
||||
|
||||
assert response.status_code == 200
|
||||
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
|
||||
assert page.find(id='sms_sender')['value'] == 'elevenchars'
|
||||
|
||||
@@ -14,6 +14,7 @@ def get_service_settings_page(
|
||||
mock_get_letter_organisations,
|
||||
no_reply_to_email_addresses,
|
||||
no_letter_contact_blocks,
|
||||
single_sms_sender,
|
||||
):
|
||||
platform_admin_request = client_request_factory(logged_in_platform_admin_client)
|
||||
return functools.partial(platform_admin_request.get, 'main.service_settings', service_id=service_one['id'])
|
||||
@@ -35,7 +36,6 @@ def get_service_settings_page(
|
||||
({'permissions': ['sms']}, '.service_switch_can_send_sms', {}, 'Stop sending sms'),
|
||||
({'permissions': []}, '.service_switch_can_send_sms', {}, 'Allow to send sms'),
|
||||
|
||||
({'permissions': ['sms', 'inbound_sms']}, '.service_set_inbound_number', {'set_inbound_sms': False}, 'Stop inbound sms'), # noqa
|
||||
({'permissions': ['sms']}, '.service_set_inbound_number', {'set_inbound_sms': True}, 'Allow inbound sms'),
|
||||
|
||||
({'active': True}, '.archive_service', {}, 'Archive service'),
|
||||
@@ -87,6 +87,7 @@ def test_normal_user_doesnt_see_any_toggle_buttons(
|
||||
mock_get_letter_organisations,
|
||||
no_reply_to_email_addresses,
|
||||
no_letter_contact_blocks,
|
||||
single_sms_sender,
|
||||
):
|
||||
page = client_request.get('main.service_settings', service_id=service_one['id'])
|
||||
toggles = page.find('a', {'class': 'button'})
|
||||
|
||||
@@ -13,14 +13,14 @@ def test_existing_user_accept_invite_calls_api_and_redirects_to_dashboard(
|
||||
client,
|
||||
service_one,
|
||||
api_user_active,
|
||||
sample_invite,
|
||||
mock_get_service,
|
||||
mock_check_invite_token,
|
||||
mock_get_user_by_email,
|
||||
mock_get_users_by_service,
|
||||
mock_accept_invite,
|
||||
mock_add_user_to_service,
|
||||
mocker,
|
||||
):
|
||||
mocker.patch('app.main.views.invites.check_token')
|
||||
|
||||
expected_service = service_one['id']
|
||||
expected_redirect_location = 'http://localhost/services/{}/dashboard'.format(expected_service)
|
||||
@@ -47,8 +47,8 @@ def test_existing_user_with_no_permissions_accept_invite(
|
||||
mock_get_user_by_email,
|
||||
mock_get_users_by_service,
|
||||
mock_add_user_to_service,
|
||||
mock_get_service,
|
||||
):
|
||||
mocker.patch('app.main.views.invites.check_token')
|
||||
|
||||
expected_service = service_one['id']
|
||||
sample_invite['permissions'] = ''
|
||||
@@ -67,6 +67,7 @@ def test_if_existing_user_accepts_twice_they_redirect_to_sign_in(
|
||||
sample_invite,
|
||||
mock_get_service,
|
||||
):
|
||||
mocker.patch('app.main.views.invites.check_token')
|
||||
|
||||
sample_invite['status'] = 'accepted'
|
||||
invite = InvitedUser(**sample_invite)
|
||||
@@ -93,6 +94,7 @@ def test_existing_user_of_service_get_redirected_to_signin(
|
||||
mock_get_user_by_email,
|
||||
mock_accept_invite,
|
||||
):
|
||||
mocker.patch('app.main.views.invites.check_token')
|
||||
sample_invite['email_address'] = api_user_active.email_address
|
||||
invite = InvitedUser(**sample_invite)
|
||||
mocker.patch('app.invite_api_client.check_token', return_value=invite)
|
||||
@@ -122,7 +124,9 @@ def test_existing_signed_out_user_accept_invite_redirects_to_sign_in(
|
||||
mock_add_user_to_service,
|
||||
mock_accept_invite,
|
||||
mock_get_service,
|
||||
mocker,
|
||||
):
|
||||
mocker.patch('app.main.views.invites.check_token')
|
||||
|
||||
expected_service = service_one['id']
|
||||
expected_permissions = ['send_messages', 'manage_service', 'manage_api_keys']
|
||||
@@ -153,7 +157,9 @@ def test_new_user_accept_invite_calls_api_and_redirects_to_registration(
|
||||
mock_add_user_to_service,
|
||||
mock_get_users_by_service,
|
||||
mock_get_service,
|
||||
mocker,
|
||||
):
|
||||
mocker.patch('app.main.views.invites.check_token')
|
||||
|
||||
expected_redirect_location = 'http://localhost/register-from-invite'
|
||||
|
||||
@@ -174,7 +180,9 @@ def test_new_user_accept_invite_calls_api_and_views_registration_page(
|
||||
mock_add_user_to_service,
|
||||
mock_get_users_by_service,
|
||||
mock_get_service,
|
||||
mocker,
|
||||
):
|
||||
mocker.patch('app.main.views.invites.check_token')
|
||||
|
||||
response = client.get(url_for('main.accept_invite', token='thisisnotarealtoken'), follow_redirects=True)
|
||||
|
||||
@@ -209,6 +217,7 @@ def test_cancelled_invited_user_accepts_invited_redirect_to_cancelled_invitation
|
||||
mock_get_user,
|
||||
mock_get_service,
|
||||
):
|
||||
mocker.patch('app.main.views.invites.check_token')
|
||||
cancelled_invitation = create_sample_invite(mocker, service_one, status='cancelled')
|
||||
mock_check_token_invite(mocker, cancelled_invitation)
|
||||
response = client.get(url_for('main.accept_invite', token='thisisnotarealtoken'))
|
||||
@@ -233,7 +242,9 @@ def test_new_user_accept_invite_completes_new_registration_redirects_to_verify(
|
||||
mock_get_users_by_service,
|
||||
mock_add_user_to_service,
|
||||
mock_get_service,
|
||||
mocker,
|
||||
):
|
||||
mocker.patch('app.main.views.invites.check_token')
|
||||
|
||||
expected_service = service_one['id']
|
||||
expected_email = sample_invite['email_address']
|
||||
@@ -282,6 +293,7 @@ def test_signed_in_existing_user_cannot_use_anothers_invite(
|
||||
mock_accept_invite,
|
||||
mock_get_service,
|
||||
):
|
||||
mocker.patch('app.main.views.invites.check_token')
|
||||
invite = InvitedUser(**sample_invite)
|
||||
mocker.patch('app.invite_api_client.check_token', return_value=invite)
|
||||
mocker.patch('app.user_api_client.get_users_for_service', return_value=[api_user_active])
|
||||
@@ -322,7 +334,9 @@ def test_new_invited_user_verifies_and_added_to_service(
|
||||
mock_get_users_by_service,
|
||||
mock_get_detailed_service,
|
||||
mock_get_usage,
|
||||
mocker,
|
||||
):
|
||||
mocker.patch('app.main.views.invites.check_token')
|
||||
|
||||
# visit accept token page
|
||||
response = client.get(url_for('main.accept_invite', token='thisisnotarealtoken'))
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import json
|
||||
from datetime import datetime
|
||||
|
||||
from itsdangerous import SignatureExpired
|
||||
from flask import url_for
|
||||
from notifications_utils.url_safe_token import generate_token
|
||||
|
||||
@@ -69,13 +70,13 @@ def test_should_redirect_index_if_user_has_already_changed_password(
|
||||
def test_should_redirect_to_forgot_password_with_flash_message_when_token_is_expired(
|
||||
app_,
|
||||
client,
|
||||
mock_get_user_by_email_request_password_reset,
|
||||
mock_login,
|
||||
mocker
|
||||
):
|
||||
app_.config['TOKEN_MAX_AGE_SECONDS'] = -1000
|
||||
user = mock_get_user_by_email_request_password_reset.return_value
|
||||
token = generate_token(user.email_address, app_.config['SECRET_KEY'], app_.config['DANGEROUS_SALT'])
|
||||
response = client.post(url_for('.new_password', token=token), data={'new_password': 'a-new_password'})
|
||||
mocker.patch('app.main.views.new_password.check_token', side_effect=SignatureExpired('expired'))
|
||||
token = generate_token('foo@bar.com', app_.config['SECRET_KEY'], app_.config['DANGEROUS_SALT'])
|
||||
|
||||
response = client.get(url_for('.new_password', token=token))
|
||||
|
||||
assert response.status_code == 302
|
||||
assert response.location == url_for('.forgot_password', _external=True)
|
||||
app_.config['TOKEN_MAX_AGE_SECONDS'] = 3600
|
||||
|
||||
@@ -14,15 +14,20 @@ from tests.conftest import (
|
||||
active_user_with_permissions,
|
||||
platform_admin_user,
|
||||
normalize_spaces,
|
||||
no_reply_to_email_addresses,
|
||||
multiple_reply_to_email_addresses,
|
||||
multiple_letter_contact_blocks,
|
||||
multiple_sms_senders,
|
||||
no_reply_to_email_addresses,
|
||||
no_letter_contact_blocks,
|
||||
no_sms_senders,
|
||||
get_default_reply_to_email_address,
|
||||
get_non_default_reply_to_email_address,
|
||||
get_default_letter_contact_block,
|
||||
get_non_default_letter_contact_block,
|
||||
SERVICE_ONE_ID,
|
||||
get_default_sms_sender,
|
||||
get_non_default_sms_sender,
|
||||
get_inbound_number_sms_sender,
|
||||
SERVICE_ONE_ID
|
||||
)
|
||||
|
||||
|
||||
@@ -38,7 +43,7 @@ from tests.conftest import (
|
||||
|
||||
'Label Value Action',
|
||||
'Send text messages On Change',
|
||||
'Text message sender GOVUK Change',
|
||||
'Text message sender GOVUK Manage',
|
||||
'International text messages Off Change',
|
||||
'Receive text messages Off Change',
|
||||
|
||||
@@ -57,7 +62,7 @@ from tests.conftest import (
|
||||
|
||||
'Label Value Action',
|
||||
'Send text messages On Change',
|
||||
'Text message sender GOVUK Change',
|
||||
'Text message sender GOVUK Manage',
|
||||
'International text messages Off Change',
|
||||
'Receive text messages Off Change',
|
||||
|
||||
@@ -80,6 +85,7 @@ def test_should_show_overview(
|
||||
mock_get_letter_organisations,
|
||||
no_reply_to_email_addresses,
|
||||
no_letter_contact_blocks,
|
||||
single_sms_sender,
|
||||
user,
|
||||
expected_rows,
|
||||
mock_get_inbound_number_for_service
|
||||
@@ -112,7 +118,7 @@ def test_should_show_overview(
|
||||
|
||||
'Label Value Action',
|
||||
'Send text messages On Change',
|
||||
'Text message sender 0781239871',
|
||||
'Text message sender GOVUK Manage',
|
||||
'International text messages On Change',
|
||||
'Receive text messages On Change',
|
||||
'API endpoint for received text messages Not set Change',
|
||||
@@ -131,7 +137,7 @@ def test_should_show_overview(
|
||||
|
||||
'Label Value Action',
|
||||
'Send text messages On Change',
|
||||
'Text message sender GOVUK Change',
|
||||
'Text message sender GOVUK Manage',
|
||||
'International text messages Off Change',
|
||||
'Receive text messages Off Change',
|
||||
|
||||
@@ -147,6 +153,7 @@ def test_should_show_overview_for_service_with_more_things_set(
|
||||
service_one,
|
||||
single_reply_to_email_address,
|
||||
single_letter_contact_block,
|
||||
single_sms_sender,
|
||||
mock_get_organisation,
|
||||
mock_get_letter_organisations,
|
||||
mock_get_inbound_number_for_service,
|
||||
@@ -173,12 +180,13 @@ def test_service_settings_show_elided_api_url_if_needed(
|
||||
service_one,
|
||||
mock_get_letter_organisations,
|
||||
single_reply_to_email_address,
|
||||
single_sms_sender,
|
||||
single_letter_contact_block,
|
||||
mocker,
|
||||
fake_uuid,
|
||||
url,
|
||||
elided_url,
|
||||
mock_get_inbound_number_for_service,
|
||||
mock_get_inbound_number_for_service
|
||||
):
|
||||
service_one['permissions'] = ['sms', 'email', 'inbound_sms']
|
||||
service_one['inbound_api'] = [fake_uuid]
|
||||
@@ -216,32 +224,13 @@ def test_if_cant_send_letters_then_cant_see_letter_contact_block(
|
||||
assert 'Letter contact block' not in response.get_data(as_text=True)
|
||||
|
||||
|
||||
def test_if_can_receive_inbound_then_cant_change_sms_sender(
|
||||
logged_in_client,
|
||||
service_one,
|
||||
mock_get_letter_organisations,
|
||||
single_reply_to_email_address,
|
||||
single_letter_contact_block,
|
||||
mock_get_inbound_number_for_service
|
||||
):
|
||||
service_one['permissions'] = ['email', 'sms', 'inbound_sms']
|
||||
response = logged_in_client.get(url_for(
|
||||
'main.service_settings', service_id=service_one['id']
|
||||
))
|
||||
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
|
||||
rows_as_text = [" ".join(row.text.split()) for row in page.find_all('tr')]
|
||||
assert 'Text message sender 0781239871 Change' not in rows_as_text
|
||||
assert url_for('main.service_request_to_go_live', service_id=service_one['id'],
|
||||
set_inbound_sms=False) not in response.get_data(as_text=True)
|
||||
assert '0781239871' in response.get_data(as_text=True)
|
||||
|
||||
|
||||
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,
|
||||
single_sms_sender,
|
||||
mock_get_letter_organisations,
|
||||
mock_get_inbound_number_for_service
|
||||
):
|
||||
@@ -261,6 +250,7 @@ def test_escapes_letter_contact_block(
|
||||
service_one,
|
||||
mocker,
|
||||
single_reply_to_email_address,
|
||||
single_sms_sender,
|
||||
injected_letter_contact_block,
|
||||
mock_get_letter_organisations,
|
||||
mock_get_inbound_number_for_service
|
||||
@@ -312,6 +302,7 @@ def test_show_restricted_service(
|
||||
mock_get_letter_organisations,
|
||||
single_reply_to_email_address,
|
||||
single_letter_contact_block,
|
||||
single_sms_sender,
|
||||
mock_get_inbound_number_for_service
|
||||
):
|
||||
response = logged_in_client.get(url_for('main.service_settings', service_id=service_one['id']))
|
||||
@@ -345,6 +336,7 @@ def test_show_live_service(
|
||||
mock_get_live_service,
|
||||
single_reply_to_email_address,
|
||||
single_letter_contact_block,
|
||||
single_sms_sender,
|
||||
mock_get_letter_organisations,
|
||||
mock_get_inbound_number_for_service
|
||||
):
|
||||
@@ -471,6 +463,7 @@ def test_should_redirect_after_request_to_go_live(
|
||||
active_user_with_permissions,
|
||||
single_reply_to_email_address,
|
||||
single_letter_contact_block,
|
||||
single_sms_sender,
|
||||
mock_get_letter_organisations,
|
||||
mock_get_inbound_number_for_service,
|
||||
):
|
||||
@@ -569,6 +562,7 @@ def test_route_permissions(
|
||||
service_one,
|
||||
single_reply_to_email_address,
|
||||
single_letter_contact_block,
|
||||
single_sms_sender,
|
||||
mock_get_letter_organisations,
|
||||
route,
|
||||
mock_get_inbound_number_for_service
|
||||
@@ -628,6 +622,7 @@ def test_route_for_platform_admin(
|
||||
service_one,
|
||||
single_reply_to_email_address,
|
||||
single_letter_contact_block,
|
||||
single_sms_sender,
|
||||
mock_get_letter_organisations,
|
||||
route,
|
||||
mock_get_inbound_number_for_service
|
||||
@@ -701,7 +696,8 @@ def test_and_more_hint_appears_on_settings_with_more_than_just_a_single_sender(
|
||||
mock_get_letter_organisations,
|
||||
mock_get_inbound_number_for_service,
|
||||
multiple_reply_to_email_addresses,
|
||||
multiple_letter_contact_blocks
|
||||
multiple_letter_contact_blocks,
|
||||
multiple_sms_senders
|
||||
):
|
||||
service_one['permissions'] = ['email', 'sms', 'letter']
|
||||
|
||||
@@ -710,22 +706,26 @@ def test_and_more_hint_appears_on_settings_with_more_than_just_a_single_sender(
|
||||
service_id=service_one['id']
|
||||
)
|
||||
|
||||
assert normalize_spaces(
|
||||
page.select('tbody tr')[2].text
|
||||
) == "Email reply to addresses test@example.com …and 2 more Manage"
|
||||
assert normalize_spaces(
|
||||
page.select('tbody tr')[8].text
|
||||
) == "Sender addresses 1 Example Street …and 2 more Manage"
|
||||
def get_row(page, index):
|
||||
return normalize_spaces(
|
||||
page.select('tbody tr')[index].text
|
||||
)
|
||||
|
||||
assert get_row(page, 2) == "Email reply to addresses test@example.com …and 2 more Manage"
|
||||
assert get_row(page, 4) == "Text message sender Example …and 2 more Manage"
|
||||
assert get_row(page, 8) == "Sender addresses 1 Example Street …and 2 more Manage"
|
||||
|
||||
|
||||
@pytest.mark.parametrize('sender_list_page, expected_output', [
|
||||
('main.service_email_reply_to', 'test@example.com (default) Change'),
|
||||
('main.service_letter_contact_details', '1 Example Street (default) Change'),
|
||||
('main.service_sms_senders', 'GOVUK (default) Change')
|
||||
])
|
||||
def test_api_ids_dont_show_on_option_pages_with_a_single_sender(
|
||||
client_request,
|
||||
single_reply_to_email_address,
|
||||
single_letter_contact_block,
|
||||
single_sms_sender,
|
||||
sender_list_page,
|
||||
expected_output
|
||||
):
|
||||
@@ -758,6 +758,12 @@ def test_api_ids_dont_show_on_option_pages_with_a_single_sender(
|
||||
'1 Example Street (default) Change 1234',
|
||||
'2 Example Street Change 5678',
|
||||
'3 Example Street Change 9457'
|
||||
), (
|
||||
'main.service_sms_senders',
|
||||
multiple_sms_senders,
|
||||
'Example (default and recieves replies) Change 1234',
|
||||
'Example 2 Change 5678',
|
||||
'Example 3 Change 9457'
|
||||
),
|
||||
]
|
||||
)
|
||||
@@ -796,6 +802,11 @@ def test_default_option_shows_for_default_sender(
|
||||
no_letter_contact_blocks,
|
||||
'You haven’t added any letter contact details yet'
|
||||
),
|
||||
(
|
||||
'main.service_sms_senders',
|
||||
no_sms_senders,
|
||||
'You haven’t added any sms senders yet'
|
||||
),
|
||||
])
|
||||
def test_no_senders_message_shows(
|
||||
client_request,
|
||||
@@ -822,7 +833,7 @@ def test_no_senders_message_shows(
|
||||
('testtest', 'Enter a valid email address'),
|
||||
('test@hello.com', 'Enter a government email address. If you think you should have access contact us')
|
||||
])
|
||||
def test_incorrect_reply_to_email_address(
|
||||
def test_incorrect_reply_to_email_address_input(
|
||||
reply_to_input,
|
||||
expected_error,
|
||||
client_request,
|
||||
@@ -842,7 +853,7 @@ def test_incorrect_reply_to_email_address(
|
||||
('', 'Can’t be empty'),
|
||||
('1 \n 2 \n 3 \n 4 \n 5 \n 6 \n 7 \n 8 \n 9 \n 0 \n a', 'Contains 11 lines, maximum is 10')
|
||||
])
|
||||
def test_incorrect_letter_contact_block(
|
||||
def test_incorrect_letter_contact_block_input(
|
||||
contact_block_input,
|
||||
expected_error,
|
||||
client_request,
|
||||
@@ -858,6 +869,26 @@ def test_incorrect_letter_contact_block(
|
||||
assert normalize_spaces(page.select_one('.error-message').text) == expected_error
|
||||
|
||||
|
||||
@pytest.mark.parametrize('sms_sender_input, expected_error', [
|
||||
('', 'Can’t be empty'),
|
||||
('abcdefghijkhgkg', 'Enter 11 characters or fewer')
|
||||
])
|
||||
def test_incorrect_sms_sender_input(
|
||||
sms_sender_input,
|
||||
expected_error,
|
||||
client_request,
|
||||
no_sms_senders
|
||||
):
|
||||
page = client_request.post(
|
||||
'main.service_add_sms_sender',
|
||||
service_id=SERVICE_ONE_ID,
|
||||
_data={'sms_sender': sms_sender_input},
|
||||
_expected_status=200
|
||||
)
|
||||
|
||||
assert normalize_spaces(page.select_one('.error-message').text) == expected_error
|
||||
|
||||
|
||||
@pytest.mark.parametrize('fixture, data, api_default_args', [
|
||||
(no_reply_to_email_addresses, {}, True),
|
||||
(multiple_reply_to_email_addresses, {}, False),
|
||||
@@ -914,6 +945,34 @@ def test_add_letter_contact(
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize('fixture, data, api_default_args', [
|
||||
(no_sms_senders, {}, True),
|
||||
(multiple_sms_senders, {}, False),
|
||||
(multiple_sms_senders, {"is_default": "y"}, True)
|
||||
])
|
||||
def test_add_sms_sender(
|
||||
fixture,
|
||||
data,
|
||||
api_default_args,
|
||||
mocker,
|
||||
client_request,
|
||||
mock_add_sms_sender
|
||||
):
|
||||
fixture(mocker)
|
||||
data['sms_sender'] = "Example"
|
||||
client_request.post(
|
||||
'main.service_add_sms_sender',
|
||||
service_id=SERVICE_ONE_ID,
|
||||
_data=data
|
||||
)
|
||||
|
||||
mock_add_sms_sender.assert_called_once_with(
|
||||
SERVICE_ONE_ID,
|
||||
sms_sender="Example",
|
||||
is_default=api_default_args
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize('sender_page, fixture, checkbox_present', [
|
||||
('main.service_add_email_reply_to', no_reply_to_email_addresses, False),
|
||||
('main.service_add_email_reply_to', multiple_reply_to_email_addresses, True),
|
||||
@@ -1000,6 +1059,37 @@ def test_edit_letter_contact_block(
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize('fixture, data, api_default_args', [
|
||||
(get_default_sms_sender, {"is_default": "y", "sms_sender": "test"}, True),
|
||||
(get_default_sms_sender, {"sms_sender": "test"}, True),
|
||||
(get_non_default_sms_sender, {"sms_sender": "test"}, False),
|
||||
(get_non_default_sms_sender, {"is_default": "y", "sms_sender": "test"}, True)
|
||||
])
|
||||
def test_edit_sms_sender(
|
||||
fixture,
|
||||
data,
|
||||
api_default_args,
|
||||
mocker,
|
||||
fake_uuid,
|
||||
client_request,
|
||||
mock_update_sms_sender
|
||||
):
|
||||
fixture(mocker)
|
||||
client_request.post(
|
||||
'main.service_edit_sms_sender',
|
||||
service_id=SERVICE_ONE_ID,
|
||||
sms_sender_id=fake_uuid,
|
||||
_data=data
|
||||
)
|
||||
|
||||
mock_update_sms_sender.assert_called_once_with(
|
||||
SERVICE_ONE_ID,
|
||||
sms_sender_id=fake_uuid,
|
||||
sms_sender="test",
|
||||
is_default=api_default_args
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize('sender_page, fixture, default_message, params, checkbox_present', [
|
||||
(
|
||||
'main.service_edit_email_reply_to',
|
||||
@@ -1028,6 +1118,20 @@ def test_edit_letter_contact_block(
|
||||
'This is the default contact details for service one letters',
|
||||
'letter_contact_id',
|
||||
True
|
||||
),
|
||||
(
|
||||
'main.service_edit_sms_sender',
|
||||
get_default_sms_sender,
|
||||
'This is currently your text message sender for service one',
|
||||
'sms_sender_id',
|
||||
False
|
||||
),
|
||||
(
|
||||
'main.service_edit_sms_sender',
|
||||
get_non_default_sms_sender,
|
||||
'This is currently your text message sender for service one',
|
||||
'sms_sender_id',
|
||||
True
|
||||
)
|
||||
])
|
||||
def test_default_box_shows_on_non_default_sender_details_while_editing(
|
||||
@@ -1059,6 +1163,34 @@ def test_default_box_shows_on_non_default_sender_details_while_editing(
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize('fixture, hide_textbox, fixture_sender_id', [
|
||||
(get_inbound_number_sms_sender, True, '1234'),
|
||||
(get_default_sms_sender, False, '1234'),
|
||||
])
|
||||
def test_inbound_sms_sender_is_not_editable(
|
||||
client_request,
|
||||
service_one,
|
||||
fake_uuid,
|
||||
fixture,
|
||||
hide_textbox,
|
||||
fixture_sender_id,
|
||||
mocker
|
||||
):
|
||||
fixture(mocker)
|
||||
|
||||
page = client_request.get(
|
||||
'.service_edit_sms_sender',
|
||||
service_id=SERVICE_ONE_ID,
|
||||
sms_sender_id=fixture_sender_id,
|
||||
)
|
||||
|
||||
assert bool(page.find('input', attrs={'name': "sms_sender"})) != hide_textbox
|
||||
if hide_textbox:
|
||||
assert normalize_spaces(
|
||||
page.select_one('form[method="post"] p').text
|
||||
) == "GOVUK This phone number receives replies and can’t be changed"
|
||||
|
||||
|
||||
def test_switch_service_to_research_mode(
|
||||
logged_in_platform_admin_client,
|
||||
platform_admin_user,
|
||||
@@ -1107,7 +1239,8 @@ def test_shows_research_mode_indicator(
|
||||
mock_get_letter_organisations,
|
||||
single_reply_to_email_address,
|
||||
single_letter_contact_block,
|
||||
mock_get_inbound_number_for_service,
|
||||
single_sms_sender,
|
||||
mock_get_inbound_number_for_service
|
||||
):
|
||||
service_one['research_mode'] = True
|
||||
mocker.patch('app.service_api_client.update_service_with_properties', return_value=service_one)
|
||||
@@ -1126,7 +1259,8 @@ def test_does_not_show_research_mode_indicator(
|
||||
mock_get_letter_organisations,
|
||||
single_reply_to_email_address,
|
||||
single_letter_contact_block,
|
||||
mock_get_inbound_number_for_service,
|
||||
single_sms_sender,
|
||||
mock_get_inbound_number_for_service
|
||||
):
|
||||
response = logged_in_client.get(url_for('main.service_settings', service_id=service_one['id']))
|
||||
assert response.status_code == 200
|
||||
@@ -1692,8 +1826,9 @@ def test_archive_service_prompts_user(
|
||||
mocker,
|
||||
single_reply_to_email_address,
|
||||
single_letter_contact_block,
|
||||
single_sms_sender,
|
||||
mock_get_letter_organisations,
|
||||
mock_get_inbound_number_for_service,
|
||||
mock_get_inbound_number_for_service
|
||||
):
|
||||
mocked_fn = mocker.patch('app.service_api_client.post')
|
||||
|
||||
@@ -1710,8 +1845,9 @@ def test_cant_archive_inactive_service(
|
||||
service_one,
|
||||
single_reply_to_email_address,
|
||||
single_letter_contact_block,
|
||||
single_sms_sender,
|
||||
mock_get_letter_organisations,
|
||||
mock_get_inbound_number_for_service,
|
||||
mock_get_inbound_number_for_service
|
||||
):
|
||||
service_one['active'] = False
|
||||
|
||||
@@ -1743,8 +1879,9 @@ def test_suspend_service_prompts_user(
|
||||
mocker,
|
||||
single_reply_to_email_address,
|
||||
single_letter_contact_block,
|
||||
single_sms_sender,
|
||||
mock_get_letter_organisations,
|
||||
mock_get_inbound_number_for_service,
|
||||
mock_get_inbound_number_for_service
|
||||
):
|
||||
mocked_fn = mocker.patch('app.service_api_client.post')
|
||||
|
||||
@@ -1762,8 +1899,9 @@ def test_cant_suspend_inactive_service(
|
||||
service_one,
|
||||
single_reply_to_email_address,
|
||||
single_letter_contact_block,
|
||||
single_sms_sender,
|
||||
mock_get_letter_organisations,
|
||||
mock_get_inbound_number_for_service,
|
||||
mock_get_inbound_number_for_service
|
||||
):
|
||||
service_one['active'] = False
|
||||
|
||||
@@ -1797,9 +1935,10 @@ def test_resume_service_prompts_user(
|
||||
service_one,
|
||||
single_reply_to_email_address,
|
||||
single_letter_contact_block,
|
||||
single_sms_sender,
|
||||
mocker,
|
||||
mock_get_letter_organisations,
|
||||
mock_get_inbound_number_for_service,
|
||||
mock_get_inbound_number_for_service
|
||||
):
|
||||
service_one['active'] = False
|
||||
mocked_fn = mocker.patch('app.service_api_client.post')
|
||||
@@ -1818,8 +1957,9 @@ def test_cant_resume_active_service(
|
||||
service_one,
|
||||
single_reply_to_email_address,
|
||||
single_letter_contact_block,
|
||||
single_sms_sender,
|
||||
mock_get_letter_organisations,
|
||||
mock_get_inbound_number_for_service,
|
||||
mock_get_inbound_number_for_service
|
||||
):
|
||||
response = logged_in_platform_admin_client.get(url_for('main.service_settings', service_id=service_one['id']))
|
||||
|
||||
@@ -1880,6 +2020,7 @@ def test_service_settings_when_inbound_number_is_not_set(
|
||||
service_one,
|
||||
single_reply_to_email_address,
|
||||
single_letter_contact_block,
|
||||
single_sms_sender,
|
||||
mocker,
|
||||
mock_get_letter_organisations,
|
||||
):
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import uuid
|
||||
import json
|
||||
|
||||
from itsdangerous import SignatureExpired
|
||||
from flask import url_for
|
||||
from bs4 import BeautifulSoup
|
||||
|
||||
@@ -97,7 +98,7 @@ def test_verify_email_redirects_to_verify_if_token_valid(
|
||||
mock_send_verify_code,
|
||||
mock_check_verify_code,
|
||||
):
|
||||
token_data = {"user_id": api_user_pending.id, "secret_code": 12345}
|
||||
token_data = {"user_id": api_user_pending.id, "secret_code": 'UNUSED'}
|
||||
mocker.patch('app.main.views.verify.check_token', return_value=json.dumps(token_data))
|
||||
|
||||
with client.session_transaction() as session:
|
||||
@@ -108,39 +109,20 @@ def test_verify_email_redirects_to_verify_if_token_valid(
|
||||
assert response.status_code == 302
|
||||
assert response.location == url_for('main.verify', _external=True)
|
||||
|
||||
assert not mock_check_verify_code.called
|
||||
mock_send_verify_code.assert_called_once_with(api_user_pending.id, 'sms', api_user_pending.mobile_number)
|
||||
|
||||
with client.session_transaction() as session:
|
||||
assert session['user_details'] == {'email': api_user_pending.email_address, 'id': api_user_pending.id}
|
||||
|
||||
|
||||
def test_verify_email_redirects_to_email_sent_if_token_expired(
|
||||
client,
|
||||
mocker,
|
||||
api_user_pending,
|
||||
mock_check_verify_code,
|
||||
):
|
||||
from itsdangerous import SignatureExpired
|
||||
mocker.patch('app.main.views.verify.check_token', side_effect=SignatureExpired('expired'))
|
||||
|
||||
with client.session_transaction() as session:
|
||||
session['user_details'] = {'email_address': api_user_pending.email_address, 'id': api_user_pending.id}
|
||||
|
||||
response = client.get(url_for('main.verify_email', token='notreal'))
|
||||
|
||||
assert response.status_code == 302
|
||||
assert response.location == url_for('main.resend_email_verification', _external=True)
|
||||
|
||||
|
||||
def test_verify_email_redirects_to_email_sent_if_token_used(
|
||||
client,
|
||||
mocker,
|
||||
api_user_pending,
|
||||
mock_get_user_pending,
|
||||
mock_send_verify_code,
|
||||
mock_check_verify_code_code_expired,
|
||||
):
|
||||
from itsdangerous import SignatureExpired
|
||||
mocker.patch('app.main.views.verify.check_token', side_effect=SignatureExpired('expired'))
|
||||
|
||||
with client.session_transaction() as session:
|
||||
session['user_details'] = {'email_address': api_user_pending.email_address, 'id': api_user_pending.id}
|
||||
|
||||
response = client.get(url_for('main.verify_email', token='notreal'))
|
||||
|
||||
assert response.status_code == 302
|
||||
@@ -158,9 +140,6 @@ def test_verify_email_redirects_to_sign_in_if_user_active(
|
||||
token_data = {"user_id": api_user_active.id, "secret_code": 12345}
|
||||
mocker.patch('app.main.views.verify.check_token', return_value=json.dumps(token_data))
|
||||
|
||||
with client.session_transaction() as session:
|
||||
session['user_details'] = {'email_address': api_user_active.email_address, 'id': api_user_active.id}
|
||||
|
||||
response = client.get(url_for('main.verify_email', token='notreal'), follow_redirects=True)
|
||||
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
|
||||
assert page.h1.text == 'Sign in'
|
||||
|
||||
Reference in New Issue
Block a user