Skip to content

Commit d719a41

Browse files
authored
[NDR-314] Move PDM tests. (#884)
1 parent c2a2ed6 commit d719a41

12 files changed

+1562
-307
lines changed

Makefile

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ default: help
2222
help: ## This is a help message
2323
@grep -E --no-filename '^[a-zA-Z-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-42s\033[0m %s\n", $$1, $$2}'
2424

25+
aws-login: ## Login to AWS. Usage: make aws-login AWS_PROFILE=<AWS_PROFILE>
26+
aws sso login --profile $(PROFILE) && export AWS_PROFILE=$(PROFILE)
27+
2528
clean: clean-build clean-py clean-test
2629

2730
clean-build:
@@ -96,14 +99,19 @@ test-unit-collect:
9699
cd ./lambdas && ./venv/bin/python3 -m pytest tests/unit --collect-only
97100

98101
env:
99-
rm -rf lambdas/venv || true
100-
python3 -m venv ./lambdas/venv
101-
./lambdas/venv/bin/pip3 install --upgrade pip
102-
./lambdas/venv/bin/pip3 install -r $(TEST_REQUIREMENTS) --no-cache-dir
103-
./lambdas/venv/bin/pip3 install -r $(CORE_REQUIREMENTS) --no-cache-dir
104-
./lambdas/venv/bin/pip3 install -r $(DATA_REQUIREMENTS) --no-cache-dir
105-
./lambdas/venv/bin/pip3 install -r $(REPORTS_REQUIREMENTS) --no-cache-dir
106-
./lambdas/venv/bin/pip3 install -r $(ALERTING_REQUIREMENTS) --no-cache-dir
102+
@echo "Removing old venv."
103+
@rm -rf lambdas/venv || true
104+
@echo "Building new venv and installing requirements."
105+
@python3 -m venv ./lambdas/venv
106+
@./lambdas/venv/bin/pip3 install --upgrade pip
107+
@./lambdas/venv/bin/pip3 install -r $(TEST_REQUIREMENTS) --no-cache-dir
108+
@./lambdas/venv/bin/pip3 install -r $(CORE_REQUIREMENTS) --no-cache-dir
109+
@./lambdas/venv/bin/pip3 install -r $(DATA_REQUIREMENTS) --no-cache-dir
110+
@./lambdas/venv/bin/pip3 install -r $(REPORTS_REQUIREMENTS) --no-cache-dir
111+
@./lambdas/venv/bin/pip3 install -r $(ALERTING_REQUIREMENTS) --no-cache-dir
112+
@echo " "
113+
@echo " "
114+
@echo "Now activate your venv."
107115

108116
github_env:
109117
rm -rf lambdas/venv || true

lambdas/tests/unit/handlers/test_get_fhir_document_reference_handler.py

Lines changed: 0 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -33,32 +33,6 @@
3333
"requestContext": {},
3434
}
3535

36-
MOCK_MTLS_VALID_EVENT = {
37-
"httpMethod": "GET",
38-
"headers": {},
39-
"pathParameters": {"id": f"{SNOMED_CODE}~{TEST_UUID}"},
40-
"body": None,
41-
"requestContext": {
42-
"accountId": "123456789012",
43-
"apiId": "abc123",
44-
"domainName": "api.example.com",
45-
"identity": {
46-
"sourceIp": "1.2.3.4",
47-
"userAgent": "curl/7.64.1",
48-
"clientCert": {
49-
"clientCertPem": "-----BEGIN CERTIFICATE-----...",
50-
"subjectDN": "CN=ndrclient.main.int.pdm.national.nhs.uk,O=NHS,C=UK",
51-
"issuerDN": "CN=NHS Root CA,O=NHS,C=UK",
52-
"serialNumber": "12:34:56",
53-
"validity": {
54-
"notBefore": "May 10 00:00:00 2024 GMT",
55-
"notAfter": "May 10 00:00:00 2025 GMT",
56-
},
57-
},
58-
},
59-
},
60-
}
61-
6236
MOCK_INVALID_EVENT_ID_MALFORMED = deepcopy(MOCK_CIS2_VALID_EVENT)
6337
MOCK_INVALID_EVENT_ID_MALFORMED["pathParameters"]["id"] = f"~{TEST_UUID}"
6438

@@ -171,40 +145,12 @@ def test_lambda_handler_happy_path_with_application_login(
171145
)
172146

173147

174-
def test_lambda_handler_happy_path_with_mtls_pdm_login(
175-
set_env,
176-
mock_document_service,
177-
mock_search_patient_service,
178-
context,
179-
):
180-
mock_document_service.create_document_reference_fhir_response.return_value = (
181-
"test_document_reference"
182-
)
183-
184-
response = lambda_handler(MOCK_MTLS_VALID_EVENT, context)
185-
186-
assert response["statusCode"] == 200
187-
assert response["body"] == "test_document_reference"
188-
# Verify correct method calls
189-
mock_document_service.handle_get_document_reference_request.assert_called_once_with(
190-
SNOMED_CODE, TEST_UUID
191-
)
192-
mock_document_service.create_document_reference_fhir_response.assert_called_once_with(
193-
MOCK_DOCUMENT_REFERENCE
194-
)
195-
196-
197148
def test_extract_bearer_token(context):
198149
context.function_name = "GetDocumentReference"
199150
token = extract_bearer_token(MOCK_CIS2_VALID_EVENT, context)
200151
assert token == f"Bearer {TEST_UUID}"
201152

202153

203-
def test_extract_bearer_token_when_pdm(context):
204-
token = extract_bearer_token(MOCK_MTLS_VALID_EVENT, context)
205-
assert token is None
206-
207-
208154
def test_extract_missing_bearer_token(context):
209155
context.function_name = "GetDocumentReference"
210156
event_without_auth = {"headers": {}}
@@ -220,12 +166,6 @@ def test_extract_document_parameters_valid():
220166
assert snomed_code == SNOMED_CODE
221167

222168

223-
def test_extract_document_parameters_valid_pdm():
224-
document_id, snomed_code = extract_document_parameters(MOCK_MTLS_VALID_EVENT)
225-
assert document_id == TEST_UUID
226-
assert snomed_code == SNOMED_CODE
227-
228-
229169
def test_extract_document_parameters_invalid():
230170
with pytest.raises(GetFhirDocumentReferenceException) as e:
231171
extract_document_parameters(MOCK_INVALID_EVENT_ID_MALFORMED)
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
import pytest
2+
from enums.snomed_codes import SnomedCodes
3+
from handlers.get_fhir_document_reference_handler import (
4+
extract_document_parameters,
5+
lambda_handler,
6+
)
7+
from models.document_reference import DocumentReference
8+
from tests.unit.conftest import TEST_UUID
9+
from tests.unit.helpers.data.dynamo.dynamo_responses import MOCK_SEARCH_RESPONSE
10+
from utils.lambda_handler_utils import extract_bearer_token
11+
12+
SNOMED_CODE = SnomedCodes.PATIENT_DATA.value.code
13+
14+
MOCK_MTLS_VALID_EVENT = {
15+
"httpMethod": "GET",
16+
"headers": {},
17+
"pathParameters": {"id": f"{SNOMED_CODE}~{TEST_UUID}"},
18+
"body": None,
19+
"requestContext": {
20+
"accountId": "123456789012",
21+
"apiId": "abc123",
22+
"domainName": "api.example.com",
23+
"identity": {
24+
"sourceIp": "1.2.3.4",
25+
"userAgent": "curl/7.64.1",
26+
"clientCert": {
27+
"clientCertPem": "-----BEGIN CERTIFICATE-----...",
28+
"subjectDN": "CN=ndrclient.main.int.pdm.national.nhs.uk,O=NHS,C=UK",
29+
"issuerDN": "CN=NHS Root CA,O=NHS,C=UK",
30+
"serialNumber": "12:34:56",
31+
"validity": {
32+
"notBefore": "May 10 00:00:00 2024 GMT",
33+
"notAfter": "May 10 00:00:00 2025 GMT",
34+
},
35+
},
36+
},
37+
},
38+
}
39+
40+
MOCK_DOCUMENT_REFERENCE = DocumentReference.model_validate(
41+
MOCK_SEARCH_RESPONSE["Items"][0]
42+
)
43+
44+
45+
@pytest.fixture
46+
def mock_config_service(mocker):
47+
mock_config = mocker.patch(
48+
"handlers.get_fhir_document_reference_handler.DynamicConfigurationService"
49+
)
50+
mock_config_instance = mock_config.return_value
51+
return mock_config_instance
52+
53+
54+
@pytest.fixture
55+
def mock_document_service(mocker):
56+
mock_service = mocker.patch(
57+
"handlers.get_fhir_document_reference_handler.GetFhirDocumentReferenceService"
58+
)
59+
mock_service_instance = mock_service.return_value
60+
mock_service_instance.handle_get_document_reference_request.return_value = (
61+
MOCK_DOCUMENT_REFERENCE
62+
)
63+
return mock_service_instance
64+
65+
66+
def test_lambda_handler_happy_path_with_mtls_pdm_login(
67+
set_env,
68+
mock_document_service,
69+
context,
70+
):
71+
mock_document_service.create_document_reference_fhir_response.return_value = (
72+
"test_document_reference"
73+
)
74+
75+
response = lambda_handler(MOCK_MTLS_VALID_EVENT, context)
76+
77+
assert response["statusCode"] == 200
78+
assert response["body"] == "test_document_reference"
79+
# Verify correct method calls
80+
mock_document_service.handle_get_document_reference_request.assert_called_once_with(
81+
SNOMED_CODE, TEST_UUID
82+
)
83+
mock_document_service.create_document_reference_fhir_response.assert_called_once_with(
84+
MOCK_DOCUMENT_REFERENCE
85+
)
86+
87+
88+
def test_extract_bearer_token_when_pdm(context):
89+
token = extract_bearer_token(MOCK_MTLS_VALID_EVENT, context)
90+
assert token is None
91+
92+
93+
def test_extract_document_parameters_valid_pdm():
94+
document_id, snomed_code = extract_document_parameters(MOCK_MTLS_VALID_EVENT)
95+
assert document_id == TEST_UUID
96+
assert snomed_code == SNOMED_CODE
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import json
2+
3+
import pytest
4+
from handlers.post_fhir_document_reference_handler import lambda_handler
5+
6+
7+
@pytest.fixture
8+
def valid_mtls_event():
9+
return {
10+
"body": json.dumps(
11+
{
12+
"resourceType": "DocumentReference",
13+
"subject": {
14+
"identifier": {
15+
"system": "https://fhir.nhs.uk/Id/nhs-number",
16+
"value": "9000000009",
17+
}
18+
},
19+
}
20+
),
21+
"headers": json.dumps(
22+
{
23+
"Accept": "text/json",
24+
"Host": "example.com",
25+
}
26+
),
27+
"requestContext": json.dumps(
28+
{
29+
"accountId": "123456789012",
30+
"apiId": "abc123",
31+
"domainName": "api.example.com",
32+
"identity": {
33+
"sourceIp": "1.2.3.4",
34+
"userAgent": "curl/7.64.1",
35+
"clientCert": {
36+
"clientCertPem": "-----BEGIN CERTIFICATE-----...",
37+
"subjectDN": "CN=ndrclient.main.int.pdm.national.nhs.uk,O=NHS,C=UK",
38+
"issuerDN": "CN=NHS Root CA,O=NHS,C=UK",
39+
"serialNumber": "12:34:56",
40+
"validity": {
41+
"notBefore": "May 10 00:00:00 2024 GMT",
42+
"notAfter": "May 10 00:00:00 2025 GMT",
43+
},
44+
},
45+
},
46+
}
47+
),
48+
}
49+
50+
51+
@pytest.fixture
52+
def mock_service(mocker):
53+
mock_service = mocker.patch(
54+
"handlers.post_fhir_document_reference_handler.PostFhirDocumentReferenceService"
55+
)
56+
mock_service_instance = mock_service.return_value
57+
return mock_service_instance
58+
59+
60+
def test_mtls_lambda_handler_success(valid_mtls_event, context, mock_service):
61+
"""Test successful lambda execution."""
62+
mock_response = {"resourceType": "DocumentReference", "id": "test-id"}
63+
64+
mock_service.process_fhir_document_reference.return_value = json.dumps(
65+
mock_response
66+
)
67+
68+
result = lambda_handler(valid_mtls_event, context)
69+
70+
assert result["statusCode"] == 200
71+
assert json.loads(result["body"]) == mock_response
72+
73+
mock_service.process_fhir_document_reference.assert_called_once_with(
74+
valid_mtls_event["body"], valid_mtls_event["requestContext"]
75+
)

lambdas/tests/unit/handlers/test_post_fhir_document_reference_handler.py

Lines changed: 1 addition & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -5,42 +5,9 @@
55
from handlers.post_fhir_document_reference_handler import lambda_handler
66
from utils.lambda_exceptions import DocumentRefException
77

8-
@pytest.fixture
9-
def valid_event():
10-
return {
11-
"body": json.dumps(
12-
{
13-
"resourceType": "DocumentReference",
14-
"subject": {
15-
"identifier": {
16-
"system": "https://fhir.nhs.uk/Id/nhs-number",
17-
"value": "9000000009",
18-
}
19-
},
20-
}
21-
),
22-
"headers": json.dumps(
23-
{
24-
"Accept": "text/json",
25-
"Host": "example.com",
26-
}
27-
),
28-
"requestContext": json.dumps(
29-
{
30-
"accountId": "123456789012",
31-
"apiId": "abc123",
32-
"domainName": "api.example.com",
33-
"identity": {
34-
"sourceIp": "1.2.3.4",
35-
"userAgent": "curl/7.64.1",
36-
},
37-
}
38-
),
39-
}
40-
418

429
@pytest.fixture
43-
def valid_mtls_event():
10+
def valid_event():
4411
return {
4512
"body": json.dumps(
4613
{
@@ -67,16 +34,6 @@ def valid_mtls_event():
6734
"identity": {
6835
"sourceIp": "1.2.3.4",
6936
"userAgent": "curl/7.64.1",
70-
"clientCert": {
71-
"clientCertPem": "-----BEGIN CERTIFICATE-----...",
72-
"subjectDN": "CN=ndrclient.main.int.pdm.national.nhs.uk,O=NHS,C=UK",
73-
"issuerDN": "CN=NHS Root CA,O=NHS,C=UK",
74-
"serialNumber": "12:34:56",
75-
"validity": {
76-
"notBefore": "May 10 00:00:00 2024 GMT",
77-
"notAfter": "May 10 00:00:00 2025 GMT",
78-
},
79-
},
8037
},
8138
}
8239
),
@@ -124,21 +81,3 @@ def test_lambda_handler_exception_handling(valid_event, context, mock_service):
12481
mock_service.process_fhir_document_reference.assert_called_once_with(
12582
valid_event["body"], valid_event["requestContext"]
12683
)
127-
128-
129-
def test_mtls_lambda_handler_success(valid_mtls_event, context, mock_service):
130-
"""Test successful lambda execution."""
131-
mock_response = {"resourceType": "DocumentReference", "id": "test-id"}
132-
133-
mock_service.process_fhir_document_reference.return_value = json.dumps(
134-
mock_response
135-
)
136-
137-
result = lambda_handler(valid_mtls_event, context)
138-
139-
assert result["statusCode"] == 200
140-
assert json.loads(result["body"]) == mock_response
141-
142-
mock_service.process_fhir_document_reference.assert_called_once_with(
143-
valid_mtls_event["body"], valid_mtls_event["requestContext"]
144-
)

0 commit comments

Comments
 (0)