diff --git a/.ds.baseline b/.ds.baseline index 9b63ec870..48f57745c 100644 --- a/.ds.baseline +++ b/.ds.baseline @@ -161,7 +161,7 @@ "filename": "app/config.py", "hashed_secret": "577a4c667e4af8682ca431857214b3a920883efc", "is_verified": false, - "line_number": 118, + "line_number": 119, "is_secret": false } ], @@ -684,5 +684,5 @@ } ] }, - "generated_at": "2024-10-17T17:16:34Z" + "generated_at": "2024-10-24T21:58:17Z" } diff --git a/app/config.py b/app/config.py index dece2728d..cc905c2eb 100644 --- a/app/config.py +++ b/app/config.py @@ -87,6 +87,7 @@ class Config(object): "tts-benefits-studio@gsa.gov", ], } + FEATURE_GUIDANCE_ENABLED = getenv("FEATURE_GUIDANCE_ENABLED", "false") def _s3_credentials_from_env(bucket_prefix): diff --git a/tests/app/main/views/test_index.py b/tests/app/main/views/test_index.py index e10c1e6d9..cedc2e348 100644 --- a/tests/app/main/views/test_index.py +++ b/tests/app/main/views/test_index.py @@ -1,89 +1,8 @@ +import os from functools import partial import pytest -from bs4 import BeautifulSoup from flask import url_for -from freezegun import freeze_time - -from tests.conftest import SERVICE_ONE_ID, normalize_spaces - - -def test_non_logged_in_user_can_see_homepage( - client_request, mock_get_service_and_organization_counts, mocker -): - - mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") - client_request.logout() - page = client_request.get("main.index", _test_page_title=False) - - assert page.h1.text.strip() == ( - "Reach people where they are with government-powered text messages" - ) - - assert ( - page.select_one( - "a.usa-button.login-button.login-button--primary.margin-right-2" - ).text - == "Sign in with \n" - ) - assert page.select_one("meta[name=description]") is not None - # This area is hidden for the pilot - # assert normalize_spaces(page.select_one('#whos-using-notify').text) == ( - # 'Who’s using Notify.gov ' # Hiding this next area for the pilot - # # Hiding this next area for the pilot - # # 'See the list of services and organizations. ' - # 'There are 111 Organizations and 9,999 Services using Notify.' - # ) - - assert page.select_one("#whos-using-notify a") is None - - -def test_logged_in_user_redirects_to_choose_account( - client_request, - api_user_active, - mock_get_user, - mock_get_user_by_email, - mock_login, -): - client_request.get( - "main.index", - _expected_status=302, - ) - client_request.get( - "main.sign_in", - _expected_status=302, - _expected_redirect=url_for( - "main.show_accounts_or_dashboard", - next="EMAIL_IS_OK", - ), - ) - - -def test_robots(client_request): - client_request.get_url("/robots.txt", _expected_status=404) - - -@pytest.mark.parametrize( - ("endpoint", "kwargs"), - [ - ("sign_in", {}), - ("register", {}), - pytest.param("index", {}, marks=pytest.mark.xfail(raises=AssertionError)), - ], -) -@freeze_time("2012-12-12 12:12") # So we don’t go out of business hours -def test_hiding_pages_from_search_engines( - client_request, mock_get_service_and_organization_counts, endpoint, kwargs, mocker -): - - mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") - client_request.logout() - response = client_request.get_response(f"main.{endpoint}", **kwargs) - assert "X-Robots-Tag" in response.headers - assert response.headers["X-Robots-Tag"] == "noindex" - - page = BeautifulSoup(response.data.decode("utf-8"), "html.parser") - assert page.select_one("meta[name=robots]")["content"] == "noindex" @pytest.mark.parametrize( @@ -115,163 +34,46 @@ def test_hiding_pages_from_search_engines( ) def test_static_pages(client_request, mock_get_organization_by_domain, view, mocker): mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") + + # Function to check if a view is feature-flagged and should return 404 when disabled + def is_feature_flagged(view): + feature_guidance_enabled = ( + os.getenv("FEATURE_GUIDANCE_ENABLED", "false").lower() == "true" + ) + feature_flagged_views = [ + "guidance", + "clear_goals", + "rules_and_regulations", + "establish_trust", + "write_for_action", + "multiple_languages", + "benchmark_performance", + ] + return not feature_guidance_enabled and view in feature_flagged_views + request = partial(client_request.get, "main.{}".format(view)) - # Check the page loads when user is signed in - page = request() - assert page.select_one("meta[name=description]") + # If the guidance feature is disabled, expect a 404 for feature-flagged views + if is_feature_flagged(view): + page = request(_expected_status=404) + else: + # Check the page loads when user is signed in + page = request() + assert page.select_one("meta[name=description]") - # Check it still works when they don’t have a recent service - with client_request.session_transaction() as session: - session["service_id"] = None - request() + # Check it still works when they don’t have a recent service + with client_request.session_transaction() as session: + session["service_id"] = None + request() - # Check it redirects to the login screen when they sign out - client_request.logout() - with client_request.session_transaction() as session: - session["service_id"] = None - session["user_id"] = None - request( - _expected_status=302, - _expected_redirect="/sign-in?next={}".format(url_for("main.{}".format(view))), - ) - - -def test_guidance_pages_link_to_service_pages_when_signed_in(client_request, mocker): - - mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") - request = partial(client_request.get, "main.edit_and_format_messages") - selector = ".list-number li a" - - # Check the page loads when user is signed in - page = request() - assert page.select_one(selector)["href"] == url_for( - "main.choose_template", - service_id=SERVICE_ONE_ID, - ) - - # Check it still works when they don’t have a recent service - with client_request.session_transaction() as session: - session["service_id"] = None - page = request() - assert not page.select_one(selector) - - # Check it redirects to the login screen when they sign out - client_request.logout() - with client_request.session_transaction() as session: - session["service_id"] = None - session["user_id"] = None - page = request(_expected_status=302) - assert not page.select_one(selector) - - -@pytest.mark.parametrize( - ("view", "expected_view"), - [ - ("information_risk_management", "security"), - ("old_integration_testing", "integration_testing"), - ("old_roadmap", "roadmap"), - ("information_security", "using_notify"), - ("old_using_notify", "using_notify"), - ("delivery_and_failure", "message_status"), - ("callbacks", "documentation"), - ], -) -def test_old_static_pages_redirect(client_request, view, expected_view, mocker): - - mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") - client_request.logout() - client_request.get( - "main.{}".format(view), - _expected_status=301, - _expected_redirect=url_for( - "main.{}".format(expected_view), - ), - ) - - -def test_old_using_notify_page(client_request): - client_request.get("main.using_notify", _expected_status=410) - - -# def test_old_integration_testing_page( -# client_request, -# ): -# page = client_request.get( -# 'main.integration_testing', -# _expected_status=410, -# ) -# assert normalize_spaces(page.select_one('.grid-row').text) == ( -# 'Integration testing ' -# 'This information has moved. ' -# 'Refer to the documentation for the client library you are using.' -# ) -# assert page.select_one('.grid-row a')['href'] == url_for( -# 'main.documentation' -# ) - - -# def test_terms_page_has_correct_content(client_request): -# terms_page = client_request.get("main.terms") -# assert normalize_spaces(terms_page.select("main p")[0].text) == ( -# "These terms apply to your service’s use of Notify.gov. " -# "You must be the service manager to accept them." -# ) - - -def test_css_is_served_from_correct_path(client_request): - page = client_request.get("main.documentation") # easy static page - - for index, link in enumerate(page.select("link[rel=stylesheet]")): - assert link["href"].startswith( - [ - "https://static.example.com/css/styles.css?", - ][index] + # Check it redirects to the login screen when they sign out + client_request.logout() + with client_request.session_transaction() as session: + session["service_id"] = None + session["user_id"] = None + request( + _expected_status=302, + _expected_redirect="/sign-in?next={}".format( + url_for("main.{}".format(view)) + ), ) - - -# Commenting out until after the pilot when we'll decide on a logo -# def test_resources_that_use_asset_path_variable_have_correct_path(client_request): - -# page = client_request.get('main.documentation') # easy static page - -# logo_svg_fallback = page.select_one('.usa-flag-logo') - -# assert logo_svg_fallback['src'].startswith('https://static.example.com/images/us-notify-color.png') - - -@pytest.mark.parametrize( - ("current_date", "expected_rate"), - [ - ("2022-05-01", "1.72"), - ], -) -@pytest.mark.skip(reason="Currently hidden for TTS") -def test_sms_price( - client_request, - mock_get_service_and_organization_counts, - current_date, - expected_rate, - mocker, -): - - mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") - client_request.logout() - - with freeze_time(current_date): - home_page = client_request.get("main.index", _test_page_title=False) - pricing_page = client_request.get("main.pricing") - - assert normalize_spaces( - home_page.select(".product-page-section")[5].select(".grid-col-6")[1].text - ) == ( - f"Text messages " - f"Up to 40,000 free text messages a year, " - f"then {expected_rate} pence per message" - ) - - assert normalize_spaces(pricing_page.select_one("#text-messages + p + p").text) == ( - f"When a service has used its annual allowance, it costs " - f"{expected_rate} pence (plus VAT) for each text message you " - f"send." - )