diff --git a/.ds.baseline b/.ds.baseline index 4ea306d6e..e82c0fc0e 100644 --- a/.ds.baseline +++ b/.ds.baseline @@ -295,7 +295,7 @@ "filename": "tests/app/service/test_rest.py", "hashed_secret": "5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8", "is_verified": false, - "line_number": 1288, + "line_number": 1290, "is_secret": false } ], @@ -374,5 +374,5 @@ } ] }, - "generated_at": "2025-09-05T01:27:41Z" + "generated_at": "2025-09-11T16:22:46Z" } diff --git a/tests/app/job/test_rest.py b/tests/app/job/test_rest.py index a1092fc10..e3acfbd36 100644 --- a/tests/app/job/test_rest.py +++ b/tests/app/job/test_rest.py @@ -80,7 +80,7 @@ uuid_str_strategy = st.one_of( @pytest.mark.usefixtures("client", "sample_scheduled_job") -@settings(max_examples=5) +@settings(max_examples=10) @given(fuzzed_job_id=uuid_str_strategy, fuzzed_service_id=uuid_str_strategy) def test_fuzz_cancel_job(fuzzed_job_id, fuzzed_service_id, request): client = request.getfixturevalue("client") diff --git a/tests/app/notifications/test_rest.py b/tests/app/notifications/test_rest.py index 13b23b4ce..28384b1d1 100644 --- a/tests/app/notifications/test_rest.py +++ b/tests/app/notifications/test_rest.py @@ -19,45 +19,43 @@ from tests.app.db import create_api_key, create_notification @pytest.mark.usefixtures( "client", "sample_service", "sample_template", "notify_db_session" ) +@settings(max_examples=10) +@given( + fuzzed_email_address=st.emails(), + fuzzed_personalisation=st.dictionaries( + keys=st.text(min_size=1, max_size=20), + values=st.text(min_size=0, max_size=100), + max_size=5, + ), + fuzzed_reference=st.one_of(st.none(), st.text(min_size=0, max_size=50)), +) def test_fuzz_send_email_notification( client, sample_service, sample_template, notify_db_session, sample_email_notification, + fuzzed_email_address, + fuzzed_personalisation, + fuzzed_reference, ): - @settings(max_examples=5) - @given( - st.emails(), - st.dictionaries( - keys=st.text(min_size=1, max_size=20), - values=st.text(min_size=0, max_size=100), - max_size=5, - ), - st.one_of(st.none(), st.text(min_size=0, max_size=50)), + + template_id = str(sample_template.id) + + payload = { + "template_id": template_id, + "email_address": fuzzed_email_address, + "personalisation": fuzzed_personalisation, + "reference": fuzzed_reference, + } + auth_header = create_service_authorization_header( + service_id=sample_email_notification.service_id ) - def inner(email_address, personalisation, reference): - - template_id = str(sample_template.id) - - payload = { - "template_id": template_id, - "email_address": email_address, - "personalisation": personalisation, - "reference": reference, - } - auth_header = create_service_authorization_header( - service_id=sample_email_notification.service_id - ) - response = client.post( - "/notifications/email", json=payload, headers=[auth_header] - ) - assert response.status_code in ( - 201, - 400, - ), f"Unexpected status: {response.status_code}, body: {response.json}" - - inner() + response = client.post("/notifications/email", json=payload, headers=[auth_header]) + assert response.status_code in ( + 201, + 400, + ), f"Unexpected status: {response.status_code}, body: {response.json}" @pytest.mark.parametrize("type", (NotificationType.EMAIL, NotificationType.SMS)) diff --git a/tests/app/service/test_rest.py b/tests/app/service/test_rest.py index 69cf9f56a..c3f5f160a 100644 --- a/tests/app/service/test_rest.py +++ b/tests/app/service/test_rest.py @@ -6,6 +6,8 @@ from unittest.mock import ANY, MagicMock, patch import pytest from flask import current_app, url_for from freezegun import freeze_time +from hypothesis import given, settings +from hypothesis import strategies as st from sqlalchemy import func, select from sqlalchemy.exc import SQLAlchemyError @@ -3132,6 +3134,40 @@ def test_update_service_sms_sender(client, notify_db_session): assert not resp_json["is_default"] +@pytest.mark.usefixtures("client", "notify_db_session") +@settings(max_examples=10) +@pytest.mark.parametrize("client", [True], indirect=True) +@given(sms_sender=st.text(min_size=0, max_size=50), is_default=st.booleans()) +def test_fuzz_update_service_sms_sender( + client, notify_db_session, sms_sender, is_default +): + service = create_service() + service_sms_sender = create_service_sms_sender( + service=service, sms_sender="1235", is_default=False + ) + data = { + "sms_sender": sms_sender, + "is_default": is_default, + } + response = client.post( + f"/service/{service.id}/sms-sender/{service_sms_sender.id}", + data=json.dumps(data), + headers=[ + ("Content-Type", "application/json"), + create_admin_authorization_header(), + ], + ) + assert response.status_code in [ + 200, + 400, + ], f"Unexpected status: {response.status_code}, body: {response.get_data(as_text=True)}" + + if response.status_code == 200: + resp_json = json.loads(response.get_data(as_text=True)) + assert resp_json["sms_sender"] == sms_sender + assert resp_json["is_default"] == is_default + + def test_update_service_sms_sender_switches_default(client, notify_db_session): service = create_service_with_defined_sms_sender(sms_sender_value="first") service_sms_sender = create_service_sms_sender(