Merge branch 'master' into load-service-err

This commit is contained in:
Leo Hemsted
2017-11-01 16:43:51 +00:00
committed by GitHub
27 changed files with 758 additions and 319 deletions

View File

@@ -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 == "Theres something wrong with the link youve used."

View File

@@ -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()

View File

@@ -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', [
("", "Cant 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'

View File

@@ -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'})

View File

@@ -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'))

View File

@@ -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

View File

@@ -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 havent added any letter contact details yet'
),
(
'main.service_sms_senders',
no_sms_senders,
'You havent 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(
('', 'Cant 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', [
('', 'Cant 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 cant 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,
):

View File

@@ -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'