From 2b4ed8a149fab6f5f4471aa0b15abac2b91bbd74 Mon Sep 17 00:00:00 2001 From: jameslinnell Date: Wed, 17 Sep 2025 17:07:33 +0100 Subject: [PATCH 1/4] Rename Fhir lambdas --- ...eference_handler.py => get_document_reference_handler_fhir.py} | 0 ...ference_handler.py => post_document_reference_handler_fhir.py} | 0 ...earch_handler.py => search_document_reference_handler_fhir.py} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename lambdas/handlers/{get_fhir_document_reference_handler.py => get_document_reference_handler_fhir.py} (100%) rename lambdas/handlers/{post_fhir_document_reference_handler.py => post_document_reference_handler_fhir.py} (100%) rename lambdas/handlers/{fhir_document_reference_search_handler.py => search_document_reference_handler_fhir.py} (100%) diff --git a/lambdas/handlers/get_fhir_document_reference_handler.py b/lambdas/handlers/get_document_reference_handler_fhir.py similarity index 100% rename from lambdas/handlers/get_fhir_document_reference_handler.py rename to lambdas/handlers/get_document_reference_handler_fhir.py diff --git a/lambdas/handlers/post_fhir_document_reference_handler.py b/lambdas/handlers/post_document_reference_handler_fhir.py similarity index 100% rename from lambdas/handlers/post_fhir_document_reference_handler.py rename to lambdas/handlers/post_document_reference_handler_fhir.py diff --git a/lambdas/handlers/fhir_document_reference_search_handler.py b/lambdas/handlers/search_document_reference_handler_fhir.py similarity index 100% rename from lambdas/handlers/fhir_document_reference_search_handler.py rename to lambdas/handlers/search_document_reference_handler_fhir.py From 5aeb780fb6de4613960c41bcd86ff997572a3ac8 Mon Sep 17 00:00:00 2001 From: jameslinnell Date: Thu, 18 Sep 2025 13:37:38 +0100 Subject: [PATCH 2/4] Update unit tests --- Makefile | 16 +++- ...=> get_document_reference_fhir_handler.py} | 0 ...> post_document_reference_fhir_handler.py} | 0 ...search_document_reference_fhir_handler.py} | 0 ...st_get_document_reference_fhir_handler.py} | 14 +-- ...t_post_document_reference_fhir_handler.py} | 4 +- ...search_document_reference_fhir_handler.py} | 34 +++---- .../base/test_aws_param_extension_service.py | 91 +++++++++++++++++++ 8 files changed, 128 insertions(+), 31 deletions(-) rename lambdas/handlers/{get_document_reference_handler_fhir.py => get_document_reference_fhir_handler.py} (100%) rename lambdas/handlers/{post_document_reference_handler_fhir.py => post_document_reference_fhir_handler.py} (100%) rename lambdas/handlers/{search_document_reference_handler_fhir.py => search_document_reference_fhir_handler.py} (100%) rename lambdas/tests/unit/handlers/{test_get_fhir_document_reference_handler.py => test_get_document_reference_fhir_handler.py} (96%) rename lambdas/tests/unit/handlers/{test_post_fhir_document_reference_handler.py => test_post_document_reference_fhir_handler.py} (97%) rename lambdas/tests/unit/handlers/{test_fhir_document_reference_search_handler.py => test_search_document_reference_fhir_handler.py} (93%) create mode 100755 lambdas/tests/unit/services/base/test_aws_param_extension_service.py diff --git a/Makefile b/Makefile index 4109619f67..cdea185fbf 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,9 @@ ZIP_COMMON_FILES = lambdas/utils lambdas/models lambdas/services lambdas/reposit default: help +help: ## This help message + @grep -E --no-filename '^[a-zA-Z-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-42s\033[0m %s\n", $$1, $$2}' + clean: clean-build clean-py clean-test clean-build: @@ -68,7 +71,7 @@ test-api-e2e-snapshots: test-bulk-upload-e2e: cd ./lambdas && ./venv/bin/python3 -m pytest tests/e2e/bulk_upload -vv -test-unit: +test-unit: ## Run unit tests. cd ./lambdas && ./venv/bin/python3 -m pytest tests/unit test-unit-coverage: @@ -80,7 +83,7 @@ test-unit-coverage-html: test-unit-collect: cd ./lambdas && ./venv/bin/python3 -m pytest tests/unit --collect-only -env: +env: ## build a virtual environment. rm -rf lambdas/venv || true python3 -m venv ./lambdas/venv ./lambdas/venv/bin/pip3 install --upgrade pip @@ -90,6 +93,9 @@ env: ./lambdas/venv/bin/pip3 install -r $(REPORTS_REQUIREMENTS) --no-cache-dir ./lambdas/venv/bin/pip3 install -r $(ALERTING_REQUIREMENTS) --no-cache-dir +destroy-env: ## Destroy a virtual environment. + deactivate + rm -rf lambdas/venv || true github_env: rm -rf lambdas/venv || true @@ -157,13 +163,13 @@ build: build-env-check: npm --prefix ./app run build-env-check -docker-up: +docker-up: ## Run docker container. docker-compose -f ./app/docker-compose.yml up -d -docker-up-rebuild: +docker-up-rebuild: ## Rebuild docker container. docker-compose -f ./app/docker-compose.yml up -d --build --force-recreate -docker-down: +docker-down: ## Destroy docker container. docker-compose -f ./app/docker-compose.yml down cypress-open: diff --git a/lambdas/handlers/get_document_reference_handler_fhir.py b/lambdas/handlers/get_document_reference_fhir_handler.py similarity index 100% rename from lambdas/handlers/get_document_reference_handler_fhir.py rename to lambdas/handlers/get_document_reference_fhir_handler.py diff --git a/lambdas/handlers/post_document_reference_handler_fhir.py b/lambdas/handlers/post_document_reference_fhir_handler.py similarity index 100% rename from lambdas/handlers/post_document_reference_handler_fhir.py rename to lambdas/handlers/post_document_reference_fhir_handler.py diff --git a/lambdas/handlers/search_document_reference_handler_fhir.py b/lambdas/handlers/search_document_reference_fhir_handler.py similarity index 100% rename from lambdas/handlers/search_document_reference_handler_fhir.py rename to lambdas/handlers/search_document_reference_fhir_handler.py diff --git a/lambdas/tests/unit/handlers/test_get_fhir_document_reference_handler.py b/lambdas/tests/unit/handlers/test_get_document_reference_fhir_handler.py similarity index 96% rename from lambdas/tests/unit/handlers/test_get_fhir_document_reference_handler.py rename to lambdas/tests/unit/handlers/test_get_document_reference_fhir_handler.py index a9e503c532..1935d1b90a 100644 --- a/lambdas/tests/unit/handlers/test_get_fhir_document_reference_handler.py +++ b/lambdas/tests/unit/handlers/test_get_document_reference_fhir_handler.py @@ -4,7 +4,7 @@ import pytest from enums.lambda_error import LambdaError from enums.snomed_codes import SnomedCodes -from handlers.get_fhir_document_reference_handler import ( +from handlers.get_document_reference_fhir_handler import ( extract_bearer_token, extract_document_parameters, get_id_and_snomed_from_path_parameters, @@ -45,8 +45,8 @@ @pytest.fixture def mock_oidc_service(mocker): - mocker.patch("handlers.get_fhir_document_reference_handler.SSMService") - mock_oidc = mocker.patch("handlers.get_fhir_document_reference_handler.OidcService") + mocker.patch("handlers.get_document_reference_fhir_handler.SSMService") + mock_oidc = mocker.patch("handlers.get_document_reference_fhir_handler.OidcService") mock_oidc_instance = mock_oidc.return_value mock_oidc_instance.fetch_userinfo.return_value = {"user": "info"} mock_oidc_instance.fetch_user_org_code.return_value = "TEST_ORG" @@ -57,7 +57,7 @@ def mock_oidc_service(mocker): @pytest.fixture def mock_config_service(mocker): mock_config = mocker.patch( - "handlers.get_fhir_document_reference_handler.DynamicConfigurationService" + "handlers.get_document_reference_fhir_handler.DynamicConfigurationService" ) mock_config_instance = mock_config.return_value return mock_config_instance @@ -66,7 +66,7 @@ def mock_config_service(mocker): @pytest.fixture def mock_document_service(mocker): mock_service = mocker.patch( - "handlers.get_fhir_document_reference_handler.GetFhirDocumentReferenceService" + "handlers.get_document_reference_fhir_handler.GetFhirDocumentReferenceService" ) mock_service_instance = mock_service.return_value mock_service_instance.handle_get_document_reference_request.return_value = ( @@ -78,7 +78,7 @@ def mock_document_service(mocker): @pytest.fixture def mock_search_patient_service(mocker): mock_service = mocker.patch( - "handlers.get_fhir_document_reference_handler.SearchPatientDetailsService" + "handlers.get_document_reference_fhir_handler.SearchPatientDetailsService" ) mock_service_instance = mock_service.return_value return mock_service_instance @@ -224,7 +224,7 @@ def test_lambda_handler_oidc_error( set_env, mock_config_service, mock_document_service, context, mocker ): mocker.patch( - "handlers.get_fhir_document_reference_handler.OidcService.set_up_oidc_parameters", + "handlers.get_document_reference_fhir_handler.OidcService.set_up_oidc_parameters", side_effect=GetFhirDocumentReferenceException(500, LambdaError.MockError), ) diff --git a/lambdas/tests/unit/handlers/test_post_fhir_document_reference_handler.py b/lambdas/tests/unit/handlers/test_post_document_reference_fhir_handler.py similarity index 97% rename from lambdas/tests/unit/handlers/test_post_fhir_document_reference_handler.py rename to lambdas/tests/unit/handlers/test_post_document_reference_fhir_handler.py index 171af31167..ed5ea662b9 100644 --- a/lambdas/tests/unit/handlers/test_post_fhir_document_reference_handler.py +++ b/lambdas/tests/unit/handlers/test_post_document_reference_fhir_handler.py @@ -2,7 +2,7 @@ import pytest from enums.lambda_error import LambdaError -from handlers.post_fhir_document_reference_handler import lambda_handler +from handlers.post_document_reference_fhir_handler import lambda_handler from utils.lambda_exceptions import CreateDocumentRefException @@ -87,7 +87,7 @@ def valid_mtls_event(): @pytest.fixture def mock_service(mocker): mock_service = mocker.patch( - "handlers.post_fhir_document_reference_handler.PostFhirDocumentReferenceService" + "handlers.post_document_reference_fhir_handler.PostFhirDocumentReferenceService" ) mock_service_instance = mock_service.return_value return mock_service_instance diff --git a/lambdas/tests/unit/handlers/test_fhir_document_reference_search_handler.py b/lambdas/tests/unit/handlers/test_search_document_reference_fhir_handler.py similarity index 93% rename from lambdas/tests/unit/handlers/test_fhir_document_reference_search_handler.py rename to lambdas/tests/unit/handlers/test_search_document_reference_fhir_handler.py index 55365e25e2..653ce26f7c 100644 --- a/lambdas/tests/unit/handlers/test_fhir_document_reference_search_handler.py +++ b/lambdas/tests/unit/handlers/test_search_document_reference_fhir_handler.py @@ -3,7 +3,7 @@ import pytest from enums.lambda_error import LambdaError -from handlers.fhir_document_reference_search_handler import ( +from handlers.search_document_reference_fhir_handler import ( extract_bearer_token, lambda_handler, parse_query_parameters, @@ -95,7 +95,7 @@ def missing_auth_event(): @pytest.fixture def mock_document_reference_search_service(): with patch( - "handlers.fhir_document_reference_search_handler.DocumentReferenceSearchService" + "handlers.search_document_reference_fhir_handler.DocumentReferenceSearchService" ) as mock_service: service_instance = mock_service.return_value yield service_instance @@ -104,7 +104,7 @@ def mock_document_reference_search_service(): @pytest.fixture def mock_oidc_service(): with patch( - "handlers.fhir_document_reference_search_handler.OidcService" + "handlers.search_document_reference_fhir_handler.OidcService" ) as mock_service: service_instance = mock_service.return_value yield service_instance @@ -113,7 +113,7 @@ def mock_oidc_service(): @pytest.fixture def mock_search_patient_service(): with patch( - "handlers.fhir_document_reference_search_handler.SearchPatientDetailsService" + "handlers.search_document_reference_fhir_handler.SearchPatientDetailsService" ) as mock_service: yield mock_service @@ -121,7 +121,7 @@ def mock_search_patient_service(): @pytest.fixture def mock_dynamic_config_service(): with patch( - "handlers.fhir_document_reference_search_handler.DynamicConfigurationService" + "handlers.search_document_reference_fhir_handler.DynamicConfigurationService" ) as mock_service: service_instance = mock_service.return_value yield service_instance @@ -371,11 +371,11 @@ def test_extract_bearer_token_missing(): assert e.value.status_code == 401 -@patch("handlers.fhir_document_reference_search_handler.OidcService") -@patch("handlers.fhir_document_reference_search_handler.SearchPatientDetailsService") -@patch("handlers.fhir_document_reference_search_handler.DynamicConfigurationService") -@patch("handlers.fhir_document_reference_search_handler.SSMService") -@patch("handlers.fhir_document_reference_search_handler.WebApplicationClient") +@patch("handlers.search_document_reference_fhir_handler.OidcService") +@patch("handlers.search_document_reference_fhir_handler.SearchPatientDetailsService") +@patch("handlers.search_document_reference_fhir_handler.DynamicConfigurationService") +@patch("handlers.search_document_reference_fhir_handler.SSMService") +@patch("handlers.search_document_reference_fhir_handler.WebApplicationClient") def test_validate_user_access_success( mock_web_client, mock_ssm, @@ -416,8 +416,8 @@ def test_validate_user_access_success( ) -@patch("handlers.fhir_document_reference_search_handler.OidcService") -@patch("handlers.fhir_document_reference_search_handler.DynamicConfigurationService") +@patch("handlers.search_document_reference_fhir_handler.OidcService") +@patch("handlers.search_document_reference_fhir_handler.DynamicConfigurationService") def test_validate_user_access_oidc_failure(mock_config_service, mock_oidc_service): # Setup mocks mock_oidc_instance = mock_oidc_service.return_value @@ -432,9 +432,9 @@ def test_validate_user_access_oidc_failure(mock_config_service, mock_oidc_servic assert e.value.status_code == 403 -@patch("handlers.fhir_document_reference_search_handler.OidcService") -@patch("handlers.fhir_document_reference_search_handler.SearchPatientDetailsService") -@patch("handlers.fhir_document_reference_search_handler.DynamicConfigurationService") +@patch("handlers.search_document_reference_fhir_handler.OidcService") +@patch("handlers.search_document_reference_fhir_handler.SearchPatientDetailsService") +@patch("handlers.search_document_reference_fhir_handler.DynamicConfigurationService") def test_validate_user_access_patient_search_failure( mock_config_service, mock_search_service, mock_oidc_service ): @@ -462,8 +462,8 @@ def test_validate_user_access_patient_search_failure( assert e.value.status_code == 403 -@patch("handlers.fhir_document_reference_search_handler.OidcService") -@patch("handlers.fhir_document_reference_search_handler.DynamicConfigurationService") +@patch("handlers.search_document_reference_fhir_handler.OidcService") +@patch("handlers.search_document_reference_fhir_handler.DynamicConfigurationService") def test_validate_user_access_authorization_failure( mock_config_service, mock_oidc_service ): diff --git a/lambdas/tests/unit/services/base/test_aws_param_extension_service.py b/lambdas/tests/unit/services/base/test_aws_param_extension_service.py new file mode 100755 index 0000000000..a4dad175b9 --- /dev/null +++ b/lambdas/tests/unit/services/base/test_aws_param_extension_service.py @@ -0,0 +1,91 @@ +from datetime import datetime + +from services.base.ssm_service import SSMService + +MOCK_SSM_PARAMETERS_RESPONSE = { + "Parameters": [ + { + "Name": "ssm_parameter_key", + "Type": "SecureString", + "Value": "string", + "Version": 123, + "Selector": "string", + "SourceResult": "string", + "LastModifiedDate": datetime(2015, 1, 1), + "ARN": "string", + "DataType": "string", + }, + { + "Name": "another_key", + "Type": "SecureString", + "Value": "string", + "Version": 123, + "Selector": "string", + "SourceResult": "string", + "LastModifiedDate": datetime(2015, 1, 1), + "ARN": "string", + "DataType": "string", + }, + ], +} + +MOCK_SSM_PARAMETER_RESPONSE = { + "Parameter": { + "Name": "ssm_parameter_key", + "Type": "String", + "Value": "string", + "Version": 123, + "Selector": "string", + "SourceResult": "string", + "LastModifiedDate": datetime(2015, 1, 1), + "ARN": "string", + "DataType": "string", + } +} + + +def test_get_ssm_parameter(mocker): + mocker.patch("boto3.client") + service = SSMService() + mock_get_parameter = mocker.patch.object(service.client, "get_parameter") + mock_get_parameter.return_value = MOCK_SSM_PARAMETER_RESPONSE + actual = service.get_ssm_parameter(parameter_key="ssm_parameter_key") + + mock_get_parameter.assert_called_once_with( + Name="ssm_parameter_key", WithDecryption=False + ) + assert actual == "string" + + +def test_get_ssm_parameters(mocker): + mocker.patch("boto3.client") + service = SSMService() + mock_get_parameters = mocker.patch.object(service.client, "get_parameters") + mock_get_parameters.return_value = MOCK_SSM_PARAMETERS_RESPONSE + actual = service.get_ssm_parameters( + parameters_keys=["ssm_parameter_key", "another_key"] + ) + expected = {"ssm_parameter_key": "string", "another_key": "string"} + + mock_get_parameters.assert_called_once_with( + Names=["ssm_parameter_key", "another_key"], WithDecryption=False + ) + assert actual == expected + + +def test_update_ssm_parameter(mocker): + mocker.patch("boto3.client") + service = SSMService() + mock_put_parameter = mocker.patch.object(service.client, "put_parameter") + service.update_ssm_parameter( + parameter_key="ssm_parameter_key", + parameter_value="parameter_value", + parameter_type="SecureString", + ) + + mock_put_parameter.assert_called_once_with( + Name="ssm_parameter_key", + Value="parameter_value", + Type="SecureString", + Overwrite=True, + ) From d73069ded64cfd92865b389968133476f956121b Mon Sep 17 00:00:00 2001 From: jameslinnell Date: Thu, 18 Sep 2025 15:48:42 +0100 Subject: [PATCH 3/4] Update lambda publish --- .../base-lambdas-reusable-deploy-all.yml | 104 +++++++++--------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/.github/workflows/base-lambdas-reusable-deploy-all.yml b/.github/workflows/base-lambdas-reusable-deploy-all.yml index 44bf1b2602..269cf6c6ba 100644 --- a/.github/workflows/base-lambdas-reusable-deploy-all.yml +++ b/.github/workflows/base-lambdas-reusable-deploy-all.yml @@ -1,4 +1,4 @@ -name: 'ZBASE Lambdas: Deploy all required Lambda functions' +name: "ZBASE Lambdas: Deploy all required Lambda functions" on: workflow_call: @@ -10,15 +10,15 @@ on: required: true type: string build_branch: - description: 'Feature branch to push to test?' + description: "Feature branch to push to test?" required: true - type: 'string' + type: "string" sandbox: - description: 'Which Sandbox to push to?' + description: "Which Sandbox to push to?" required: true - type: 'string' + type: "string" is_sandbox: - description: 'Is this deploying to a sandbox?' + description: "Is this deploying to a sandbox?" required: false default: false type: boolean @@ -58,7 +58,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: create_document_reference_handler lambda_aws_name: CreateDocRefLambda - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -72,7 +72,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: search_patient_details_handler lambda_aws_name: SearchPatientDetailsLambda - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -86,7 +86,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: document_reference_search_handler lambda_aws_name: SearchDocumentReferencesLambda - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -100,7 +100,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: delete_document_reference_handler lambda_aws_name: DeleteDocRefLambda - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -114,7 +114,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: delete_document_object_handler lambda_aws_name: DeleteDocumentObjectS3 - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -128,7 +128,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: document_manifest_job_handler lambda_aws_name: DocumentManifestJobLambda - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -142,7 +142,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: bulk_upload_metadata_handler lambda_aws_name: BulkUploadMetadataLambda - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -157,7 +157,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: token_handler lambda_aws_name: TokenRequestHandler - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -173,7 +173,7 @@ jobs: lambda_handler_name: token_handler lambda_handler_path: mocks lambda_aws_name: TokenRequestHandler - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -188,7 +188,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: login_redirect_handler lambda_aws_name: LoginRedirectHandler - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -204,7 +204,7 @@ jobs: lambda_handler_name: login_redirect_handler lambda_handler_path: mocks lambda_aws_name: LoginRedirectHandler - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -218,7 +218,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: authoriser_handler lambda_aws_name: AuthoriserLambda - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -232,7 +232,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: lloyd_george_record_stitch_handler lambda_aws_name: LloydGeorgeStitchLambda - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -246,7 +246,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: generate_lloyd_george_stitch_handler lambda_aws_name: GenerateLloydGeorgeStitch - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -260,7 +260,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: logout_handler lambda_aws_name: LogoutHandler - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -274,7 +274,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: bulk_upload_handler lambda_aws_name: BulkUploadLambda - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -288,7 +288,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: bulk_upload_report_handler lambda_aws_name: BulkUploadReportLambda - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -302,7 +302,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: back_channel_logout_handler lambda_aws_name: BackChannelLogoutHandler - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -316,10 +316,10 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: send_feedback_handler lambda_aws_name: SendFeedbackLambda - lambda_layer_names: 'core_lambda_layer,alerting_lambda_layer' + lambda_layer_names: "core_lambda_layer,alerting_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} - + deploy_nhs_oauth_token_generator_lambda: name: Deploy nhs_oauth_token_generator_lambda uses: ./.github/workflows/base-lambdas-reusable-deploy.yml @@ -330,7 +330,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: nhs_oauth_token_generator_handler lambda_aws_name: NhsOauthTokenGeneratorLambda - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -344,7 +344,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: feature_flags_handler lambda_aws_name: FeatureFlagsLambda - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -358,7 +358,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: virus_scan_result_handler lambda_aws_name: VirusScanResult - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -372,7 +372,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: document_status_check_handler lambda_aws_name: DocumentStatusCheckLambda - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -386,7 +386,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: update_upload_state_handler lambda_aws_name: UpdateUploadStateLambda - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -400,7 +400,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: data_collection_handler lambda_aws_name: DataCollectionLambda - lambda_layer_names: 'core_lambda_layer,data_lambda_layer' + lambda_layer_names: "core_lambda_layer,data_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -414,7 +414,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: statistical_report_handler lambda_aws_name: StatisticalReportLambda - lambda_layer_names: 'core_lambda_layer,data_lambda_layer' + lambda_layer_names: "core_lambda_layer,data_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -428,7 +428,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: generate_document_manifest_handler lambda_aws_name: GenerateDocumentManifest - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -442,7 +442,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: manage_nrl_pointer_handler lambda_aws_name: ManageNrlPointerLambda - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -454,9 +454,9 @@ jobs: python_version: ${{ inputs.python_version }} build_branch: ${{ inputs.build_branch}} sandbox: ${{ inputs.sandbox }} - lambda_handler_name: get_fhir_document_reference_handler - lambda_aws_name: GetDocumentReference - lambda_layer_names: 'core_lambda_layer' + lambda_handler_name: get_document_reference_fhir_handler + lambda_aws_name: GetDocumentReferenceFhir + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -483,7 +483,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: mns_notification_handler lambda_aws_name: MNSNotificationLambda - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -497,7 +497,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: get_report_by_ods_handler lambda_aws_name: GetReportByODS - lambda_layer_names: 'core_lambda_layer,reports_lambda_layer' + lambda_layer_names: "core_lambda_layer,reports_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -511,7 +511,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: access_audit_handler lambda_aws_name: AccessAuditLambda - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -525,7 +525,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: pdf_stitching_handler lambda_aws_name: PdfStitchingLambda - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -539,7 +539,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: bulk_upload_metadata_preprocessor_handler lambda_aws_name: BulkUploadMetadataPreprocessor - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -552,9 +552,9 @@ jobs: python_version: ${{ inputs.python_version }} build_branch: ${{ inputs.build_branch}} sandbox: ${{ inputs.sandbox }} - lambda_handler_name: post_fhir_document_reference_handler - lambda_aws_name: PostDocumentReferencesFHIR - lambda_layer_names: 'core_lambda_layer' + lambda_handler_name: post_document_reference_fhir_handler + lambda_aws_name: PostDocumentReferenceFhir + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -567,9 +567,9 @@ jobs: python_version: ${{ inputs.python_version }} build_branch: ${{ inputs.build_branch}} sandbox: ${{ inputs.sandbox }} - lambda_handler_name: fhir_document_reference_search_handler - lambda_aws_name: SearchDocumentReferencesFHIR - lambda_layer_names: 'core_lambda_layer' + lambda_handler_name: search_document_reference_fhir_handler + lambda_aws_name: SearchDocumentReferenceFhir + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -583,7 +583,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: im_alerting_handler lambda_aws_name: IMAlertingLambda - lambda_layer_names: 'alerting_lambda_layer' + lambda_layer_names: "alerting_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -597,7 +597,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: toggle_bulk_upload_handler lambda_aws_name: ToggleBulkUploadLambda - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} @@ -611,6 +611,6 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: document_reference_virus_scan_handler lambda_aws_name: DocumentReferenceVirusScanCheck - lambda_layer_names: 'core_lambda_layer' + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} From 9b3faa0ae5b398607c4762ede3abe8092e47e2ff Mon Sep 17 00:00:00 2001 From: jameslinnell Date: Mon, 22 Sep 2025 16:25:10 +0100 Subject: [PATCH 4/4] Remove unwanted file --- .../base/test_aws_param_extension_service.py | 91 ------------------- 1 file changed, 91 deletions(-) delete mode 100755 lambdas/tests/unit/services/base/test_aws_param_extension_service.py diff --git a/lambdas/tests/unit/services/base/test_aws_param_extension_service.py b/lambdas/tests/unit/services/base/test_aws_param_extension_service.py deleted file mode 100755 index a4dad175b9..0000000000 --- a/lambdas/tests/unit/services/base/test_aws_param_extension_service.py +++ /dev/null @@ -1,91 +0,0 @@ -from datetime import datetime - -from services.base.ssm_service import SSMService - -MOCK_SSM_PARAMETERS_RESPONSE = { - "Parameters": [ - { - "Name": "ssm_parameter_key", - "Type": "SecureString", - "Value": "string", - "Version": 123, - "Selector": "string", - "SourceResult": "string", - "LastModifiedDate": datetime(2015, 1, 1), - "ARN": "string", - "DataType": "string", - }, - { - "Name": "another_key", - "Type": "SecureString", - "Value": "string", - "Version": 123, - "Selector": "string", - "SourceResult": "string", - "LastModifiedDate": datetime(2015, 1, 1), - "ARN": "string", - "DataType": "string", - }, - ], -} - -MOCK_SSM_PARAMETER_RESPONSE = { - "Parameter": { - "Name": "ssm_parameter_key", - "Type": "String", - "Value": "string", - "Version": 123, - "Selector": "string", - "SourceResult": "string", - "LastModifiedDate": datetime(2015, 1, 1), - "ARN": "string", - "DataType": "string", - } -} - - -def test_get_ssm_parameter(mocker): - mocker.patch("boto3.client") - service = SSMService() - mock_get_parameter = mocker.patch.object(service.client, "get_parameter") - mock_get_parameter.return_value = MOCK_SSM_PARAMETER_RESPONSE - actual = service.get_ssm_parameter(parameter_key="ssm_parameter_key") - - mock_get_parameter.assert_called_once_with( - Name="ssm_parameter_key", WithDecryption=False - ) - assert actual == "string" - - -def test_get_ssm_parameters(mocker): - mocker.patch("boto3.client") - service = SSMService() - mock_get_parameters = mocker.patch.object(service.client, "get_parameters") - mock_get_parameters.return_value = MOCK_SSM_PARAMETERS_RESPONSE - actual = service.get_ssm_parameters( - parameters_keys=["ssm_parameter_key", "another_key"] - ) - expected = {"ssm_parameter_key": "string", "another_key": "string"} - - mock_get_parameters.assert_called_once_with( - Names=["ssm_parameter_key", "another_key"], WithDecryption=False - ) - assert actual == expected - - -def test_update_ssm_parameter(mocker): - mocker.patch("boto3.client") - service = SSMService() - mock_put_parameter = mocker.patch.object(service.client, "put_parameter") - service.update_ssm_parameter( - parameter_key="ssm_parameter_key", - parameter_value="parameter_value", - parameter_type="SecureString", - ) - - mock_put_parameter.assert_called_once_with( - Name="ssm_parameter_key", - Value="parameter_value", - Type="SecureString", - Overwrite=True, - )