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 .grid-row")[0] selected_hint_text = normalize_spaces(selected_hint.select(".usa-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: 202-867-5303" ) assert normalize_spaces(page.select(".sms-message-wrapper")[0].text) == ( "service one: ((one)) ((two)) ((three))" ) assert page.select("a.usa-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": "202-867-5303"} 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"]) 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_request, 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 .grid-row")[1] selected_hint_text = normalize_spaces(selected_hint.select(".usa-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: 202-867-5303" ) assert normalize_spaces(page.select(".sms-message-wrapper")[0].text) == ( "service one: ((one)) ((two)) ((three))" ) def test_should_show_empty_text_box( client_request, mock_get_service_template_with_multiple_placeholders, service_one, fake_uuid, ): with client_request.session_transaction() as session: session["placeholders"] = {"phone number": "202-867-5303"} page = client_request.get( "main.tour_step", service_id=SERVICE_ONE_ID, template_id=fake_uuid, step_index=1 ) textbox = page.select_one( "[data-module=autofocus][data-force-focus=True] .usa-input" ) assert "value" not in textbox assert textbox["name"] == "placeholder_value" assert textbox["class"] == [ "usa-input", ] # data-module=autofocus is set on a containing element so it # shouldn’t also be set on the textbox itself assert "data-module" not in textbox assert ( normalize_spaces(page.select_one("label[for=placeholder_value]").text) == "one" ) 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": "202-867-5303", } page = client_request.get( "main.tour_step", service_id=SERVICE_ONE_ID, template_id=fake_uuid, step_index=1 ) assert page.select(".usa-input")[0]["value"] == "hello" @pytest.mark.parametrize("template_type", ["email"]) @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_request, 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, ), ) 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(".usa-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(".usa-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, ), ) with client_request.session_transaction() as session: assert session["placeholders"] == { "one": "hello", "phone number": "202-867-5303", } 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": "202-867-5303"} 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, ), ) with client_request.session_transaction() as session: assert session["placeholders"] == { "one": "hello", "two": "is it me you are looking for", "phone number": "202-867-5303", } 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": "202-867-5303"} 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(".usa-error-message")[0].text) == ( "Error: Cannot be empty" ) assert normalize_spaces(page.select(".sms-message-recipient")[0].text) == ( "To: 202-867-5303" ) 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": "202-867-5303"} 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": "202-867-5303", } 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, ), ) with client_request.session_transaction() as session: assert session["placeholders"] == { "one": "hello", "two": "hi", "three": "howdy", "phone number": "202-867-5303", } 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, ), ) 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": "202-867-5303", } 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, ), ) 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": "202-867-5303", } 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 .grid-row")[1] selected_hint_text = normalize_spaces(selected_hint.select(".usa-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: 202-867-5303" ) 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": "202-867-5303", } page = client_request.get( "main.check_tour_notification", service_id=SERVICE_ONE_ID, template_id=fake_uuid, ) assert page.select(".usa-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, ), ) 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": "202-867-5303", } 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, ), ) def test_shows_link_to_end_tour( client_request, mock_get_notification, fake_uuid, ): page = client_request.get( "main.view_notification", service_id=SERVICE_ONE_ID, notification_id=fake_uuid, help=3, ) assert page.select(".banner-tour a")[0]["href"] == url_for( "main.go_to_dashboard_after_tour", service_id=SERVICE_ONE_ID, example_template_id="5407f4db-51c7-4150-8758-35412d42186a", ) def test_go_to_dashboard_after_tour_link( client_request, mocker, api_user_active, mock_login, mock_get_service, mock_has_permissions, mock_delete_service_template, fake_uuid, ): client_request.get( "main.go_to_dashboard_after_tour", service_id=fake_uuid, example_template_id=fake_uuid, _expected_redirect=url_for( "main.service_dashboard", service_id=fake_uuid, ), ) mock_delete_service_template.assert_called_once_with(fake_uuid, fake_uuid)