From 27c187896c1ea57fbd90a5bedd51f0e154ed853b Mon Sep 17 00:00:00 2001 From: jameslinnell Date: Mon, 16 Mar 2026 10:26:01 +0000 Subject: [PATCH 1/3] [NDR-406] Initial commit --- ...dm_post_fhir_document_reference_handler.py | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/lambdas/tests/unit/handlers/test_pdm_post_fhir_document_reference_handler.py b/lambdas/tests/unit/handlers/test_pdm_post_fhir_document_reference_handler.py index 6d07a8c58b..e803fae920 100644 --- a/lambdas/tests/unit/handlers/test_pdm_post_fhir_document_reference_handler.py +++ b/lambdas/tests/unit/handlers/test_pdm_post_fhir_document_reference_handler.py @@ -83,3 +83,65 @@ def test_mtls_lambda_handler_success(valid_mtls_event, context, mock_service): valid_mtls_event["body"], valid_mtls_event["requestContext"], ) + + +def test_lambda_handler_missing_body(context): + event = {"requestContext": {}} + + response = lambda_handler(event, context) + + assert response["statusCode"] >= 400 # Lambda error + assert "resourceType" in json.loads(response["body"]) # FHIR error structure + + +# @patch("handler.PostFhirDocumentReferenceService") +# def test_lambda_handler_document_ref_exception(mock_service, event, context): +# mock_instance = mock_service.return_value +# +# # Fake FHIR error response builder +# fake_error_class = MagicMock() +# fake_error_class.value = {"fhir_coding": ["12345"]} +# +# mock_exception = DocumentRefException( +# status_code=400, +# error=fake_error_class, +# details="Invalid doc reference", +# ) +# +# # Raises exception when processing +# mock_instance.process_fhir_document_reference.side_effect = mock_exception +# +# response = lambda_handler(event, context) +# +# assert response["statusCode"] == 400 +# # Ensure body contains structured FHIR error +# assert "resourceType" in json.loads(response["body"]) +# fake_error_class.create_error_response.assert_called_once() + + +# @patch("handler.logger") +# @patch("handler.PostFhirDocumentReferenceService") +# def test_lambda_handler_logs_information(mock_service, mock_logger, event, context): +# mock_instance = mock_service.return_value +# mock_instance.process_fhir_document_reference.return_value = ( +# {"id": "log-test-id"}, +# "log-test-id", +# ) +# +# lambda_handler(event, context) +# +# mock_logger.info.assert_any_call("Processing FHIR document reference request") + + +# @patch("handler.PostFhirDocumentReferenceService") +# def test_lambda_handler_location_header_format(mock_service, event, context): +# mock_instance = mock_service.return_value +# mock_instance.process_fhir_document_reference.return_value = ( +# {"id": "XYZ-987"}, +# "XYZ-987", +# ) +# +# response = lambda_handler(event, context) +# +# assert response["headers"]["Location"] == f"{DOCUMENT_RETRIEVE_ENDPOINT}/XYZ-987" +# assert response["statusCode"] == 201 From 3f5f77c4da4c85d2a55f2d8c602963cfd12ced36 Mon Sep 17 00:00:00 2001 From: jameslinnell Date: Wed, 18 Mar 2026 13:44:44 +0000 Subject: [PATCH 2/3] [NDR-406] Handler tests --- ...dm_post_fhir_document_reference_handler.py | 91 ++++++++----------- 1 file changed, 40 insertions(+), 51 deletions(-) diff --git a/lambdas/tests/unit/handlers/test_pdm_post_fhir_document_reference_handler.py b/lambdas/tests/unit/handlers/test_pdm_post_fhir_document_reference_handler.py index e803fae920..7352146ff2 100644 --- a/lambdas/tests/unit/handlers/test_pdm_post_fhir_document_reference_handler.py +++ b/lambdas/tests/unit/handlers/test_pdm_post_fhir_document_reference_handler.py @@ -1,9 +1,12 @@ import json +from unittest.mock import patch import pytest +from enums.lambda_error import LambdaError from handlers.post_fhir_document_reference_handler import lambda_handler from tests.unit.conftest import APIM_API_URL +from utils.lambda_exceptions import DocumentRefException @pytest.fixture @@ -94,54 +97,40 @@ def test_lambda_handler_missing_body(context): assert "resourceType" in json.loads(response["body"]) # FHIR error structure -# @patch("handler.PostFhirDocumentReferenceService") -# def test_lambda_handler_document_ref_exception(mock_service, event, context): -# mock_instance = mock_service.return_value -# -# # Fake FHIR error response builder -# fake_error_class = MagicMock() -# fake_error_class.value = {"fhir_coding": ["12345"]} -# -# mock_exception = DocumentRefException( -# status_code=400, -# error=fake_error_class, -# details="Invalid doc reference", -# ) -# -# # Raises exception when processing -# mock_instance.process_fhir_document_reference.side_effect = mock_exception -# -# response = lambda_handler(event, context) -# -# assert response["statusCode"] == 400 -# # Ensure body contains structured FHIR error -# assert "resourceType" in json.loads(response["body"]) -# fake_error_class.create_error_response.assert_called_once() - - -# @patch("handler.logger") -# @patch("handler.PostFhirDocumentReferenceService") -# def test_lambda_handler_logs_information(mock_service, mock_logger, event, context): -# mock_instance = mock_service.return_value -# mock_instance.process_fhir_document_reference.return_value = ( -# {"id": "log-test-id"}, -# "log-test-id", -# ) -# -# lambda_handler(event, context) -# -# mock_logger.info.assert_any_call("Processing FHIR document reference request") - - -# @patch("handler.PostFhirDocumentReferenceService") -# def test_lambda_handler_location_header_format(mock_service, event, context): -# mock_instance = mock_service.return_value -# mock_instance.process_fhir_document_reference.return_value = ( -# {"id": "XYZ-987"}, -# "XYZ-987", -# ) -# -# response = lambda_handler(event, context) -# -# assert response["headers"]["Location"] == f"{DOCUMENT_RETRIEVE_ENDPOINT}/XYZ-987" -# assert response["statusCode"] == 201 +@patch("handlers.post_fhir_document_reference_handler.PostFhirDocumentReferenceService") +def test_lambda_handler_document_ref_exception(mock_service, event, context): + mock_instance = mock_service.return_value + + mock_exception = DocumentRefException( + status_code=400, + error=LambdaError.DocRefNoParse, + details="Invalid doc reference", + ) + + # Raises exception when processing + mock_instance.process_fhir_document_reference.side_effect = mock_exception + + response = lambda_handler(event, context) + + assert response["statusCode"] == 400 + # Ensure body contains structured FHIR error + body = json.loads(response["body"]) + assert "resourceType" in body + assert body["resourceType"] == "OperationOutcome" + + +@patch("handlers.post_fhir_document_reference_handler.PostFhirDocumentReferenceService") +def test_lambda_handler_location_header_format(mock_service, event, context): + mock_instance = mock_service.return_value + mock_instance.process_fhir_document_reference.return_value = ( + {"id": "XYZ-987"}, + "XYZ-987", + ) + + response = lambda_handler(event, context) + print(response) + + assert ( + response["headers"]["Location"] == f"{APIM_API_URL}/DocumentReference/XYZ-987" + ) + assert response["statusCode"] == 201 From 918f2a6e5f5d87220abeb23555d7ba486672ff04 Mon Sep 17 00:00:00 2001 From: jameslinnell Date: Wed, 18 Mar 2026 13:46:12 +0000 Subject: [PATCH 3/3] [NDR-406] Add ARGS to makefile, currently used to allow testing one file. --- Makefile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index f8093725b3..ced5646be8 100644 --- a/Makefile +++ b/Makefile @@ -21,6 +21,7 @@ CONTAINER ?= false VENV_PATH_PREFIX := $(if $(filter true,$(CONTAINER)),./.venv,./lambdas/venv) FORMAT_ALL ?= false CHECK ?= false +ARGS ?= "" .PHONY: \ install clean help format list requirements ruff build-and-deploy-sandbox \ @@ -169,10 +170,10 @@ endif test-unit: ifeq ($(CONTAINER), true) cd ./lambdas && \ - PYTHONPATH=. poetry run pytest tests/unit ../scripts/github/checklist_validator/tests + PYTHONPATH=. poetry run pytest $(if $(ARGS),$(ARGS),tests/unit ../scripts/github/checklist_validator/tests) else cd ./lambdas && \ - PYTHONPATH=.. ./venv/bin/python3 -m pytest tests/unit ../scripts/github/checklist_validator/tests + PYTHONPATH=.. ./venv/bin/python3 -m pytest $(if $(ARGS),$(ARGS),tests/unit ../scripts/github/checklist_validator/tests) endif test-unit-coverage: