diff --git a/.ds.baseline b/.ds.baseline index d8c1bbe1b..8a044ccea 100644 --- a/.ds.baseline +++ b/.ds.baseline @@ -527,7 +527,7 @@ "filename": "tests/app/main/views/test_register.py", "hashed_secret": "bdbb156d25d02fd7792865824201dda1c60f4473", "is_verified": false, - "line_number": 118, + "line_number": 111, "is_secret": false }, { @@ -535,7 +535,7 @@ "filename": "tests/app/main/views/test_register.py", "hashed_secret": "5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8", "is_verified": false, - "line_number": 188, + "line_number": 172, "is_secret": false }, { @@ -543,7 +543,7 @@ "filename": "tests/app/main/views/test_register.py", "hashed_secret": "bb5b7caa27d005d38039e3797c3ddb9bcd22c3c8", "is_verified": false, - "line_number": 259, + "line_number": 243, "is_secret": false } ], @@ -634,5 +634,5 @@ } ] }, - "generated_at": "2025-09-09T19:57:05Z" + "generated_at": "2025-09-17T19:16:00Z" } diff --git a/tests/app/main/views/test_manage_users.py b/tests/app/main/views/test_manage_users.py index 5d5e587f9..d19211faf 100644 --- a/tests/app/main/views/test_manage_users.py +++ b/tests/app/main/views/test_manage_users.py @@ -3,6 +3,8 @@ import uuid import pytest from flask import url_for +from hypothesis import HealthCheck, given, settings +from hypothesis import strategies as st import app from app.enums import ServicePermission @@ -1219,16 +1221,37 @@ def test_cancel_invited_user_cancels_user_invitations( ) +# @pytest.mark.usefixtures( +# "client_request", +# "mocker", +# ) +# def test_cancel_invited_user_doesnt_work_if_user_not_invited_to_this_service( +# client_request, +# mocker, +# ): +# @given(fuzzed_uuid=st.uuids()) +# def inner(fuzzed_uuid): +# mock_cancel = mocker.patch("app.invite_api_client.cancel_invited_user") +# client_request.get( +# "main.cancel_invited_user", +# service_id=SERVICE_ONE_ID, +# invited_user_id=fuzzed_uuid, +# _expected_status=404, +# ) +# assert mock_cancel.called is False + +# inner() + + def test_cancel_invited_user_doesnt_work_if_user_not_invited_to_this_service( client_request, - mock_get_invites_for_service, mocker, ): mock_cancel = mocker.patch("app.invite_api_client.cancel_invited_user") client_request.get( "main.cancel_invited_user", service_id=SERVICE_ONE_ID, - invited_user_id=sample_uuid(), + invited_user_id="6ce466d0-fd6a-11e5-82f5-e0accb9d11a6", _expected_status=404, ) assert mock_cancel.called is False diff --git a/tests/app/main/views/test_register.py b/tests/app/main/views/test_register.py index 7819f1c6e..30a06e8e6 100644 --- a/tests/app/main/views/test_register.py +++ b/tests/app/main/views/test_register.py @@ -3,7 +3,9 @@ import json from unittest.mock import ANY import pytest -from flask import url_for +from flask import current_app, url_for +from hypothesis import HealthCheck, given, settings +from hypothesis import strategies as st from app.enums import ServicePermission from app.main.views.register import ( @@ -78,15 +80,6 @@ def test_register_creates_new_user_and_redirects_to_continue_page( == "An email has been sent to notfound@example.gsa.gov." ) - # mock_send_verify_email.assert_called_with(ANY, user_data["email_address"]) - # mock_register_user.assert_called_with( - # user_data["name"], - # user_data["email_address"], - # user_data["mobile_number"], - # user_data["password"], - # user_data["auth_type"], - # ) - def test_register_continue_handles_missing_session_sensibly(client_request, mocker): @@ -139,33 +132,24 @@ def test_should_return_200_when_email_is_not_gov_uk( ) -@pytest.mark.parametrize( - "email_address", - [ - "notfound@example.gsa.gov", - "example@lsquo.si.edu", - ], +@settings(suppress_health_check=[HealthCheck.function_scoped_fixture]) +@given( + fuzzed_email_address=st.from_regex( + r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}", fullmatch=True + ) ) def test_should_add_user_details_to_session( client_request, mocker, - mock_send_verify_code, - mock_register_user, - mock_get_user_by_email_not_found, - mock_get_organizations_with_unusual_domains, - mock_email_is_not_already_in_use, - mock_send_verify_email, - mock_login, - email_address, + fuzzed_email_address, ): - mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() client_request.post( "main.register", _data={ "name": "Test Codes", - "email_address": email_address, + "email_address": fuzzed_email_address, "mobile_number": "+12023123123", "password": "validPassword!", }, @@ -451,12 +435,6 @@ def test_decode_state(encoded_invite_data): } -# @pytest.mark.parametrize( -# ("user_services", "user_organizations", "expected_status", "organization_checked"), -# [ -# ([SERVICE_ONE_ID], [], 200, False), - - @pytest.mark.parametrize( ("invite_data", "expected_is_org_invite", "expected_user_id"), [ diff --git a/tests/app/main/views/test_send.py b/tests/app/main/views/test_send.py index 43ad7518f..043965255 100644 --- a/tests/app/main/views/test_send.py +++ b/tests/app/main/views/test_send.py @@ -14,8 +14,6 @@ from zipfile import BadZipFile import pytest from flask import url_for -from hypothesis import HealthCheck, given, settings -from hypothesis import strategies as st from xlrd.biffh import XLRDError from xlrd.xldate import XLDateAmbiguous, XLDateError, XLDateNegative, XLDateTooLarge @@ -106,78 +104,6 @@ test_spreadsheet_files = glob(path.join("tests", "spreadsheet_files", "*")) test_non_spreadsheet_files = glob(path.join("tests", "non_spreadsheet_files", "*")) -@settings(max_examples=10, suppress_health_check=[HealthCheck.function_scoped_fixture]) -@given( - rows=st.integers(min_value=1, max_value=10), - rows_data=st.lists( - st.tuples( - st.text( - min_size=10, - max_size=15, - alphabet=st.characters(min_codepoint=ord("0"), max_codepoint=ord("9")), - ), - st.text( - min_size=1, - max_size=20, - alphabet=st.characters(whitelist_categories=["L", "N", "Zs"]), - ), - st.text( - min_size=1, - max_size=20, - alphabet=st.characters(whitelist_categories=["L", "N", "Zs"]), - ), - st.text( - min_size=1, - max_size=20, - alphabet=st.characters(whitelist_categories=["L", "N", "Zs"]), - ), - ), - min_size=1, - max_size=10, - ), -) -def test_fuzz_upload_csv_batch_sms_handles_bad_and_good_input( - rows, rows_data, client_request, mocker, fake_uuid -): - - mock_s3_set_metadata = mocker.patch( - "app.main.views.send.set_metadata_on_csv_upload" - ) - mock_s3_upload = mocker.patch("app.main.views.send.s3upload") - - mocker.patch( - "app.main.views.send.get_csv_metadata", - return_value={"original_file_name": "fuzz.csv"}, - ) - - output = io.StringIO() - writer = csv.writer(output) - writer.writerow(["phone_number", "name", "favourite colour", "fruit"]) - for row in rows_data[: min(rows, len(rows_data))]: - writer.writerow(row) - csv_content = output.getvalue() - - try: - client_request.post( - "main.send_messages", - service_id=SERVICE_ONE_ID, - template_id=fake_uuid, - _data={"file": (io.BytesIO(csv_content.encode("utf-8")), "fuzz.csv")}, - _content_type="multipart/form-data", - _follows_redirects=False, - ) - except Exception: - print("Generated CSV that caused 500:\n", csv_content) # noqa - raise - - assert mock_s3_upload.called - uploaded_data = mock_s3_upload.call_args[0][1]["data"].strip() - assert "phone number" in uploaded_data - mock_s3_set_metadata.assert_called_once_with( - SERVICE_ONE_ID, ANY, original_file_name="fuzz.csv" - ) - - def test_show_correct_title_and_description_for_email_sender_type( client_request, fake_uuid,