mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-07-02 07:27:35 -04:00
This naming was introduced in 2016 without explanation [1]. I find it confusing because: - It's reminiscent of "_app", which is a Python convention indicating the variable is internal, so maybe avoid using it. - It suggests there's some other "app" fixture I should be using (there isn't, though). The Python style guide describes using an underscore suffix to avoid clashes with inbuilt names [1], which is sort of applicable if we need to import the "app" module [2]. However, we can also avoid clashes by choosing a different name, without the strange underscore. [1]:3b1d521c10[2]:78824f54fd/tests/app/main/views/test_forgot_password.py (L5)
619 lines
17 KiB
Python
619 lines
17 KiB
Python
import pytest
|
|
from flask import url_for
|
|
|
|
from app import current_user
|
|
from tests import validate_route_permission
|
|
from tests.conftest import SERVICE_ONE_ID, create_template, normalize_spaces
|
|
|
|
|
|
def test_should_200_for_tour_start(
|
|
client_request,
|
|
mock_get_service_template_with_multiple_placeholders,
|
|
service_one,
|
|
fake_uuid,
|
|
):
|
|
page = client_request.get(
|
|
'main.begin_tour',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
)
|
|
|
|
assert normalize_spaces(
|
|
page.select('.banner-tour .heading-medium')[0].text
|
|
) == (
|
|
'Try sending yourself this example'
|
|
)
|
|
selected_hint = page.select('.banner-tour .govuk-grid-row')[0]
|
|
selected_hint_text = normalize_spaces(selected_hint.select(".govuk-body")[0].text)
|
|
assert "greyed-out-step" not in selected_hint["class"]
|
|
assert selected_hint_text == 'Every message is sent from a template'
|
|
|
|
assert normalize_spaces(
|
|
page.select('.sms-message-recipient')[0].text
|
|
) == (
|
|
'To: 07700 900762'
|
|
)
|
|
assert normalize_spaces(
|
|
page.select('.sms-message-wrapper')[0].text
|
|
) == (
|
|
'service one: ((one)) ((two)) ((three))'
|
|
)
|
|
|
|
assert page.select('a.govuk-button')[0]['href'] == url_for(
|
|
'.tour_step', service_id=SERVICE_ONE_ID, template_id=fake_uuid, step_index=1
|
|
)
|
|
|
|
|
|
def test_should_clear_session_on_tour_start(
|
|
client_request,
|
|
mock_get_service_template_with_multiple_placeholders,
|
|
service_one,
|
|
fake_uuid,
|
|
):
|
|
with client_request.session_transaction() as session:
|
|
session['placeholders'] = {'one': 'hello', 'phone number': '07700 900762'}
|
|
|
|
client_request.get(
|
|
'main.begin_tour',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
)
|
|
|
|
with client_request.session_transaction() as session:
|
|
assert session['placeholders'] == {}
|
|
|
|
|
|
@pytest.mark.parametrize('template_type', ['email', 'letter', 'broadcast'])
|
|
def test_should_404_if_non_sms_template_for_tour_start(
|
|
client_request,
|
|
fake_uuid,
|
|
mocker,
|
|
template_type,
|
|
):
|
|
mocker.patch(
|
|
'app.service_api_client.get_service_template',
|
|
return_value={'data': create_template(template_type=template_type)}
|
|
)
|
|
|
|
client_request.get(
|
|
'main.begin_tour',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
_expected_status=404,
|
|
)
|
|
|
|
|
|
def test_should_404_if_no_mobile_number_for_tour_start(
|
|
client_request,
|
|
mock_get_service_template_with_multiple_placeholders,
|
|
service_one,
|
|
fake_uuid,
|
|
active_user_with_permissions_no_mobile
|
|
):
|
|
client_request.login(active_user_with_permissions_no_mobile)
|
|
assert current_user.mobile_number is None
|
|
client_request.get(
|
|
'main.begin_tour',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
_expected_status=404,
|
|
)
|
|
|
|
|
|
def test_should_403_if_user_does_not_have_send_permissions_for_tour_start(
|
|
mocker,
|
|
notify_admin,
|
|
client,
|
|
api_user_active,
|
|
mock_get_service_template_with_multiple_placeholders,
|
|
service_one,
|
|
fake_uuid,
|
|
):
|
|
validate_route_permission(
|
|
mocker,
|
|
notify_admin,
|
|
"GET",
|
|
403,
|
|
url_for(
|
|
'main.begin_tour',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
),
|
|
['view_activity'],
|
|
api_user_active,
|
|
service_one)
|
|
|
|
|
|
def test_should_200_for_get_tour_step(
|
|
client_request,
|
|
mock_get_service_template_with_multiple_placeholders,
|
|
service_one,
|
|
fake_uuid,
|
|
):
|
|
with client_request.session_transaction() as session:
|
|
session['placeholders'] = {}
|
|
|
|
page = client_request.get(
|
|
'main.tour_step',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
step_index=1
|
|
)
|
|
|
|
assert 'Example text message' in normalize_spaces(page.select_one('title').text)
|
|
assert normalize_spaces(
|
|
page.select('.banner-tour .heading-medium')[0].text
|
|
) == (
|
|
'Try sending yourself this example'
|
|
)
|
|
selected_hint = page.select('.banner-tour .govuk-grid-row')[1]
|
|
selected_hint_text = normalize_spaces(selected_hint.select(".govuk-body")[0].text)
|
|
assert "greyed-out-step" not in selected_hint["class"]
|
|
assert selected_hint_text == 'The template pulls in the data you provide'
|
|
|
|
assert normalize_spaces(
|
|
page.select('.sms-message-recipient')[0].text
|
|
) == (
|
|
'To: 07700 900762'
|
|
)
|
|
|
|
assert normalize_spaces(
|
|
page.select('.sms-message-wrapper')[0].text
|
|
) == (
|
|
'service one: ((one)) ((two)) ((three))'
|
|
)
|
|
|
|
|
|
def test_should_prefill_answers_for_get_tour_step(
|
|
client_request,
|
|
mock_get_service_template_with_multiple_placeholders,
|
|
service_one,
|
|
fake_uuid,
|
|
):
|
|
with client_request.session_transaction() as session:
|
|
session['placeholders'] = session['placeholders'] = {'one': 'hello', 'phone number': '07700 900762'}
|
|
|
|
page = client_request.get(
|
|
'main.tour_step',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
step_index=1
|
|
)
|
|
|
|
assert page.select('.govuk-input')[0]['value'] == 'hello'
|
|
|
|
|
|
@pytest.mark.parametrize('template_type', ['email', 'letter', 'broadcast'])
|
|
@pytest.mark.parametrize('method', ['get', 'post'])
|
|
def test_should_404_if_non_sms_template_for_tour_step(
|
|
client_request,
|
|
fake_uuid,
|
|
mocker,
|
|
template_type,
|
|
method
|
|
):
|
|
mocker.patch(
|
|
'app.service_api_client.get_service_template',
|
|
return_value={'data': create_template(template_type=template_type)}
|
|
)
|
|
|
|
getattr(client_request, method)(
|
|
'main.tour_step',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
step_index=1,
|
|
_expected_status=404
|
|
)
|
|
|
|
|
|
def test_should_404_for_get_tour_step_0(
|
|
client_request,
|
|
mock_get_service_template_with_multiple_placeholders,
|
|
service_one,
|
|
fake_uuid,
|
|
):
|
|
with client_request.session_transaction() as session:
|
|
session['placeholders'] = {}
|
|
|
|
client_request.get(
|
|
'main.tour_step',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
step_index=0,
|
|
_expected_status=404
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize('method', ['GET', 'POST'])
|
|
def test_should_403_if_user_does_not_have_send_permissions_for_tour_step(
|
|
mocker,
|
|
notify_admin,
|
|
client,
|
|
api_user_active,
|
|
mock_get_service_template_with_multiple_placeholders,
|
|
service_one,
|
|
fake_uuid,
|
|
method
|
|
):
|
|
validate_route_permission(
|
|
mocker,
|
|
notify_admin,
|
|
method,
|
|
403,
|
|
url_for(
|
|
'main.tour_step',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
step_index=1
|
|
),
|
|
['view_activity'],
|
|
api_user_active,
|
|
service_one
|
|
)
|
|
|
|
|
|
def test_tour_step_redirects_to_tour_start_if_placeholders_doesnt_exist_in_session(
|
|
client_request,
|
|
mock_get_service_template_with_multiple_placeholders,
|
|
service_one,
|
|
fake_uuid,
|
|
):
|
|
with client_request.session_transaction() as session:
|
|
assert 'placeholders' not in session
|
|
|
|
client_request.get(
|
|
'main.tour_step',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
step_index=1,
|
|
_expected_status=302,
|
|
_expected_redirect=url_for(
|
|
'main.begin_tour',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
_external=True,
|
|
),
|
|
)
|
|
|
|
|
|
def test_back_link_from_first_get_tour_step_points_to_tour_start(
|
|
client_request,
|
|
mock_get_service_template_with_multiple_placeholders,
|
|
service_one,
|
|
fake_uuid,
|
|
):
|
|
with client_request.session_transaction() as session:
|
|
session['placeholders'] = {}
|
|
|
|
page = client_request.get(
|
|
'main.tour_step',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
step_index=1
|
|
)
|
|
|
|
assert page.select('.govuk-back-link')[0]['href'] == url_for(
|
|
"main.begin_tour",
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid
|
|
)
|
|
|
|
|
|
def test_back_link_from_get_tour_step_points_to_previous_step(
|
|
client_request,
|
|
mock_get_service_template_with_multiple_placeholders,
|
|
service_one,
|
|
fake_uuid,
|
|
):
|
|
with client_request.session_transaction() as session:
|
|
session['placeholders'] = {}
|
|
|
|
page = client_request.get(
|
|
'main.tour_step',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
step_index=2
|
|
)
|
|
|
|
assert page.select('.govuk-back-link')[0]['href'] == url_for(
|
|
'main.tour_step',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
step_index=1
|
|
)
|
|
|
|
|
|
def test_post_tour_step_saves_data_and_redirects_to_next_step(
|
|
client_request,
|
|
mock_get_service_template_with_multiple_placeholders,
|
|
service_one,
|
|
fake_uuid,
|
|
):
|
|
with client_request.session_transaction() as session:
|
|
session['placeholders'] = {}
|
|
|
|
client_request.post(
|
|
'main.tour_step',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
step_index=1,
|
|
_data={'placeholder_value': 'hello'},
|
|
_expected_status=302,
|
|
_expected_redirect=url_for(
|
|
'main.tour_step',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
step_index=2,
|
|
_external=True,
|
|
),
|
|
)
|
|
|
|
with client_request.session_transaction() as session:
|
|
assert session['placeholders'] == {'one': 'hello', 'phone number': '07700 900762'}
|
|
|
|
|
|
def test_post_tour_step_adds_data_to_saved_data_and_redirects_to_next_step(
|
|
client_request,
|
|
mock_get_service_template_with_multiple_placeholders,
|
|
service_one,
|
|
fake_uuid,
|
|
):
|
|
with client_request.session_transaction() as session:
|
|
session['placeholders'] = {'one': 'hello', 'phone number': '07700 900762'}
|
|
|
|
client_request.post(
|
|
'main.tour_step',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
step_index=2,
|
|
_data={'placeholder_value': 'is it me you are looking for'},
|
|
_expected_status=302,
|
|
_expected_redirect=url_for(
|
|
'main.tour_step',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
step_index=3,
|
|
_external=True,
|
|
),
|
|
)
|
|
|
|
with client_request.session_transaction() as session:
|
|
assert session['placeholders'] == {
|
|
'one': 'hello', 'two': 'is it me you are looking for', 'phone number': '07700 900762'
|
|
}
|
|
|
|
|
|
def test_post_tour_step_raises_validation_error_for_form_error(
|
|
client_request,
|
|
mock_get_service_template_with_multiple_placeholders,
|
|
service_one,
|
|
fake_uuid,
|
|
):
|
|
with client_request.session_transaction() as session:
|
|
session['placeholders'] = {'one': 'hi', 'phone number': '07700 900762'}
|
|
|
|
page = client_request.post(
|
|
'main.tour_step',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
step_index=2,
|
|
_data={'placeholder_value': ''},
|
|
_expected_status=200, # should this be 400
|
|
)
|
|
|
|
assert normalize_spaces(
|
|
page.select('.govuk-error-message')[0].text
|
|
) == (
|
|
'Error: Cannot be empty'
|
|
)
|
|
|
|
assert normalize_spaces(
|
|
page.select('.sms-message-recipient')[0].text
|
|
) == (
|
|
'To: 07700 900762'
|
|
)
|
|
|
|
assert normalize_spaces(
|
|
page.select('.sms-message-wrapper')[0].text
|
|
) == (
|
|
'service one: hi ((two)) ((three))'
|
|
)
|
|
|
|
with client_request.session_transaction() as session:
|
|
assert session['placeholders'] == {'one': 'hi', 'phone number': '07700 900762'}
|
|
|
|
|
|
def test_post_final_tour_step_saves_data_and_redirects_to_check_notification(
|
|
client_request,
|
|
mock_get_service_template_with_multiple_placeholders,
|
|
service_one,
|
|
fake_uuid,
|
|
):
|
|
with client_request.session_transaction() as session:
|
|
session['placeholders'] = {'one': 'hello', 'two': 'hi', 'phone number': '07700 900762'}
|
|
|
|
client_request.post(
|
|
'main.tour_step',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
step_index=3,
|
|
_data={'placeholder_value': 'howdy'},
|
|
_expected_status=302,
|
|
_expected_redirect=url_for(
|
|
'main.check_tour_notification',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
_external=True
|
|
),
|
|
)
|
|
|
|
with client_request.session_transaction() as session:
|
|
assert session['placeholders'] == {
|
|
'one': 'hello', 'two': 'hi', 'three': 'howdy', 'phone number': '07700 900762'
|
|
}
|
|
|
|
|
|
def test_get_test_step_out_of_index_redirects_to_first_step(
|
|
client_request,
|
|
mock_get_service_template_with_multiple_placeholders,
|
|
service_one,
|
|
fake_uuid,
|
|
):
|
|
with client_request.session_transaction() as session:
|
|
session['placeholders'] = {}
|
|
|
|
client_request.get(
|
|
'main.tour_step',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
step_index=4,
|
|
_expected_status=302,
|
|
_expected_redirect=url_for(
|
|
'main.tour_step',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
step_index=1,
|
|
_external=True
|
|
),
|
|
)
|
|
|
|
|
|
def test_get_test_step_out_of_index_redirects_to_check_notification_if_all_placeholders_filled(
|
|
client_request,
|
|
mock_get_service_template_with_multiple_placeholders,
|
|
service_one,
|
|
fake_uuid,
|
|
):
|
|
with client_request.session_transaction() as session:
|
|
session['placeholders'] = {'one': 'hello', 'two': 'hi', 'three': 'howdy', 'phone number': '07700 900762'}
|
|
|
|
client_request.get(
|
|
'main.tour_step',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
step_index=4,
|
|
_expected_status=302,
|
|
_expected_redirect=url_for(
|
|
'main.check_tour_notification',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
_external=True
|
|
),
|
|
)
|
|
|
|
|
|
def test_should_200_for_check_tour_notification(
|
|
client_request,
|
|
mock_get_service_template_with_multiple_placeholders,
|
|
service_one,
|
|
fake_uuid,
|
|
):
|
|
with client_request.session_transaction() as session:
|
|
session['placeholders'] = {'one': 'hello', 'two': 'hi', 'three': 'howdy', 'phone number': '07700 900762'}
|
|
|
|
page = client_request.get(
|
|
'main.check_tour_notification',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
)
|
|
|
|
assert normalize_spaces(
|
|
page.select('.banner-tour .heading-medium')[0].text
|
|
) == (
|
|
'Try sending yourself this example'
|
|
)
|
|
selected_hint = page.select('.banner-tour .govuk-grid-row')[1]
|
|
selected_hint_text = normalize_spaces(selected_hint.select(".govuk-body")[0].text)
|
|
assert "greyed-out-step" not in selected_hint["class"]
|
|
assert selected_hint_text == 'The template pulls in the data you provide'
|
|
|
|
assert normalize_spaces(
|
|
page.select('.sms-message-recipient')[0].text
|
|
) == (
|
|
'To: 07700 900762'
|
|
)
|
|
assert normalize_spaces(
|
|
page.select('.sms-message-wrapper')[0].text
|
|
) == (
|
|
'service one: hello hi howdy'
|
|
)
|
|
|
|
# post to send_notification keeps help argument
|
|
assert page.form.attrs['action'] == url_for(
|
|
'main.send_notification',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
help='3'
|
|
)
|
|
|
|
|
|
def test_back_link_from_check_tour_notification_points_to_last_tour_step(
|
|
client_request,
|
|
mock_get_service_template_with_multiple_placeholders,
|
|
service_one,
|
|
fake_uuid,
|
|
):
|
|
with client_request.session_transaction() as session:
|
|
session['placeholders'] = {'one': 'hello', 'two': 'hi', 'three': 'howdy', 'phone number': '07700 900762'}
|
|
|
|
page = client_request.get(
|
|
'main.check_tour_notification',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
)
|
|
|
|
assert page.select('.govuk-back-link')[0]['href'] == url_for(
|
|
"main.tour_step",
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
step_index=3
|
|
)
|
|
|
|
|
|
def test_check_tour_notification_redirects_to_tour_start_if_placeholders_doesnt_exist_in_session(
|
|
client_request,
|
|
mock_get_service_template_with_multiple_placeholders,
|
|
service_one,
|
|
fake_uuid,
|
|
):
|
|
with client_request.session_transaction() as session:
|
|
assert 'placeholders' not in session
|
|
|
|
client_request.get(
|
|
'main.check_tour_notification',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
step_index=1,
|
|
_expected_status=302,
|
|
_expected_redirect=url_for(
|
|
'main.begin_tour',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
_external=True,
|
|
),
|
|
)
|
|
|
|
|
|
def test_check_tour_notification_redirects_to_first_step_if_not_all_placeholders_in_session(
|
|
client_request,
|
|
mock_get_service_template_with_multiple_placeholders,
|
|
service_one,
|
|
fake_uuid,
|
|
):
|
|
with client_request.session_transaction() as session:
|
|
session['placeholders'] = {'one': 'hello', 'two': 'hi', 'phone number': '07700 900762'}
|
|
|
|
client_request.get(
|
|
'main.check_tour_notification',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
_expected_status=302,
|
|
_expected_redirect=url_for(
|
|
'main.tour_step',
|
|
service_id=SERVICE_ONE_ID,
|
|
template_id=fake_uuid,
|
|
step_index=1,
|
|
_external=True
|
|
),
|
|
)
|