more fuzz services

This commit is contained in:
Kenneth Kehl
2025-09-11 09:23:03 -07:00
parent 6974921abf
commit 80c772fc9d
4 changed files with 68 additions and 34 deletions

View File

@@ -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"
}

View File

@@ -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")

View File

@@ -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))

View File

@@ -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(