From 331ce47965fd9070eb644502e7aeb4c431fe3cbe Mon Sep 17 00:00:00 2001 From: Thomas-Boyle Date: Fri, 27 Mar 2026 15:23:53 +0000 Subject: [PATCH 1/2] Enhance API test steps by introducing a new function to populate expected MNS fields, improving data handling for SQS message validation. Updated context to include patient age and GP code. Adjusted message reading logic to allow for configurable wait times and polling limits based on action type. --- .../features/APITests/steps/common_steps.py | 21 ++++++++++++++++--- tests/e2e_automation/utilities/context.py | 1 + 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/tests/e2e_automation/features/APITests/steps/common_steps.py b/tests/e2e_automation/features/APITests/steps/common_steps.py index 0533e461b..805262c90 100644 --- a/tests/e2e_automation/features/APITests/steps/common_steps.py +++ b/tests/e2e_automation/features/APITests/steps/common_steps.py @@ -437,6 +437,11 @@ def normalize(value: str) -> str: return value.strip().upper() if value else "" +def populate_expected_mns_fields(context): + context.gp_code = get_gp_code_by_nhs_number(context.patient.identifier[0].value) + context.patient_age = calculate_age(context.patient.birthDate, context.immunization_object.occurrenceDateTime) + + def validate_sqs_message(context, message_body, action): check.is_true(message_body.specversion == "1.0") check.is_true(message_body.source == "uk.nhs.vaccinations-data-flow-management") @@ -511,13 +516,23 @@ def mns_event_will_be_triggered_with_correct_data_for_deleted_event(context): message_body = read_message(context, queue_type="notification", action="DELETE") print(f"Read deleted message from SQS: {message_body}") assert message_body is not None, "Expected a delete message but queue returned empty" + populate_expected_mns_fields(context) validate_sqs_message(context, message_body, "DELETE") def mns_event_will_be_triggered_with_correct_data(context, action): - message_body = read_message(context, queue_type="notification", action=action) + wait_time_seconds = 20 + max_empty_polls = 3 + if action.upper() == "CREATE": + max_empty_polls = 6 + message_body = read_message( + context, + queue_type="notification", + action=action, + wait_time_seconds=wait_time_seconds, + max_empty_polls=max_empty_polls, + ) print(f"Read {action}d message from SQS: {message_body}") assert message_body is not None, f"Expected a {action} message but queue returned empty" - context.gp_code = get_gp_code_by_nhs_number(context.patient.identifier[0].value) - context.patient_age = calculate_age(context.patient.birthDate, context.immunization_object.occurrenceDateTime) + populate_expected_mns_fields(context) validate_sqs_message(context, message_body, action) diff --git a/tests/e2e_automation/utilities/context.py b/tests/e2e_automation/utilities/context.py index 2ee7202e1..f3d734495 100644 --- a/tests/e2e_automation/utilities/context.py +++ b/tests/e2e_automation/utilities/context.py @@ -49,3 +49,4 @@ def __init__(self): self.delta_cache = None self.aws_account_id = None self.gp_code = None + self.patient_age = None From 46a1e5036aed0da34469ae83f46a79717d9558e8 Mon Sep 17 00:00:00 2001 From: Thomas-Boyle Date: Fri, 27 Mar 2026 17:11:22 +0000 Subject: [PATCH 2/2] Refactor expected MNS fields population in API tests to handle unset values gracefully. Added checks to prevent overwriting existing context attributes for GP code and patient age, and improved error handling for age calculation to avoid failures during teardown. --- .../features/APITests/steps/common_steps.py | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/tests/e2e_automation/features/APITests/steps/common_steps.py b/tests/e2e_automation/features/APITests/steps/common_steps.py index 805262c90..93c8fe7f4 100644 --- a/tests/e2e_automation/features/APITests/steps/common_steps.py +++ b/tests/e2e_automation/features/APITests/steps/common_steps.py @@ -438,8 +438,18 @@ def normalize(value: str) -> str: def populate_expected_mns_fields(context): - context.gp_code = get_gp_code_by_nhs_number(context.patient.identifier[0].value) - context.patient_age = calculate_age(context.patient.birthDate, context.immunization_object.occurrenceDateTime) + if getattr(context, "gp_code", None) is None: + context.gp_code = get_gp_code_by_nhs_number(context.patient.identifier[0].value) + + if getattr(context, "patient_age", None) is None: + try: + context.patient_age = calculate_age( + context.patient.birthDate, context.immunization_object.occurrenceDateTime + ) + except ValueError: + # Some negative update scenarios intentionally inject invalid DOB values. + # Keep patient_age unset here instead of failing teardown validation setup. + context.patient_age = None def validate_sqs_message(context, message_body, action): @@ -483,10 +493,11 @@ def validate_sqs_message(context, message_body, action): f"msn event for {action} Source application mismatch: expected {context.supplier_name}, got {message_body.filtering.sourceapplication}", ) - check.is_true( - message_body.filtering.subjectage == context.patient_age, - f"msn event for {action} Age mismatch: expected {context.patient_age}, got {message_body.filtering.subjectage}", - ) + if context.patient_age is not None: + check.is_true( + message_body.filtering.subjectage == context.patient_age, + f"msn event for {action} Age mismatch: expected {context.patient_age}, got {message_body.filtering.subjectage}", + ) check.is_true( message_body.filtering.immunisationtype == context.vaccine_type.upper(),