1+ import pytest
2+ import json
3+ import os
4+ from unittest .mock import patch
5+ from handlers .get_document_reference_handler import lambda_handler
6+ from utils .lambda_exceptions import GetDocumentRefException
7+ from enums .feature_flags import FeatureFlags
8+ from utils .lambda_response import ApiGatewayResponse
9+ from utils .lambda_exceptions import FeatureFlagsException
10+ from enums .lambda_error import LambdaError
11+ from utils .error_response import ErrorResponse
12+
13+
14+ @pytest .fixture
15+ def mock_feature_flag_service (mocker ):
16+ yield mocker .patch ("handlers.get_document_reference_handler.FeatureFlagService" ).return_value
17+
18+ @pytest .fixture
19+ def mock_get_document_service (mocker ):
20+ yield mocker .patch (
21+ "handlers.get_document_reference_handler.GetDocumentReferenceService"
22+ ).return_value
23+
24+ @pytest .fixture
25+ def mock_valid_nhs_number ():
26+ yield "4407064188"
27+
28+ @pytest .fixture
29+ def feature_flag ():
30+ yield FeatureFlags .UPLOAD_DOCUMENT_ITERATION_3_ENABLED
31+
32+ @pytest .fixture
33+ def mock_interaction_id ():
34+ yield "88888888-4444-4444-4444-121212121212"
35+
36+ @pytest .fixture
37+ def mocked_bad_env_vars ():
38+ env_vars = {
39+ #"LLOYD_GEORGE_DYNAMODB_NAME": "mock_dynamodb_name",
40+ "PRESIGNED_ASSUME_ROLE" : "mock_presigned_role" ,
41+ "APPCONFIG_APPLICATION" : "mock_value" ,
42+ "APPCONFIG_ENVIRONMENT" : "mock_value" ,
43+ "APPCONFIG_CONFIGURATION" : "mock_value" ,
44+ "EDGE_REFERENCE_TABLE" : "mock_value" ,
45+ "CLOUDFRONT_URL" : "mock_value" ,
46+ }
47+
48+ with patch .dict (os .environ , env_vars ):
49+ yield "LLOYD_GEORGE_DYNAMODB_NAME"
50+
51+
52+
53+ def test_handler_valid_request_returns_200 (
54+ valid_id_event_with_auth_header ,
55+ mock_feature_flag_service ,
56+ mock_get_document_service ,
57+ mock_valid_nhs_number ,
58+ context ,
59+ set_env ,
60+ feature_flag
61+ ):
62+ mock_document_id = "1"
63+ valid_id_event_with_auth_header ["pathParameters" ] = {"id" : mock_document_id }
64+ valid_id_event_with_auth_header ["queryStringParameters" ]["patientId" ] = mock_valid_nhs_number
65+ mock_presigned_s3_url = "https://mock.url/"
66+ mock_content_type = "application/pdf"
67+
68+ expected_body = {
69+ "url" : mock_presigned_s3_url ,
70+ "contentType" : mock_content_type
71+ }
72+
73+ expected_result = ApiGatewayResponse (
74+ status_code = 200 , body = json .dumps (expected_body ), methods = "GET"
75+ ).create_api_gateway_response ()
76+
77+ mock_get_document_service .get_document_url_by_id .return_value = expected_body
78+
79+ result = lambda_handler (valid_id_event_with_auth_header , context )
80+
81+ assert result == expected_result
82+ assert result ["body" ] == json .dumps (expected_body )
83+
84+ mock_feature_flag_service .validate_feature_flag .assert_called_once_with (
85+ feature_flag
86+ )
87+ mock_get_document_service .get_document_url_by_id .assert_called_once_with (
88+ mock_document_id ,
89+ mock_valid_nhs_number )
90+
91+ def test_missing_nhs_number_errors (
92+ valid_id_event_with_auth_header ,
93+ mock_feature_flag_service ,
94+ context ,
95+ set_env ,
96+ feature_flag ,
97+ ):
98+ valid_id_event_with_auth_header ["pathParameters" ] = {"id" : "1" }
99+ valid_id_event_with_auth_header ["queryStringParameters" ].pop ("patientId" )
100+
101+ expected_result = ApiGatewayResponse (
102+ status_code = 400 ,
103+ body = LambdaError .PatientIdNoKey .create_error_body (),
104+ methods = "GET" ,
105+ ).create_api_gateway_response ()
106+
107+ result = lambda_handler (valid_id_event_with_auth_header , context )
108+
109+ assert result == expected_result
110+
111+ def test_missing_document_id_errors (
112+ valid_id_event_with_auth_header ,
113+ mock_feature_flag_service ,
114+ mock_valid_nhs_number ,
115+ context ,
116+ set_env ,
117+ feature_flag ,
118+ mock_interaction_id
119+ ):
120+ valid_id_event_with_auth_header ["pathParameters" ] = {}
121+ valid_id_event_with_auth_header ["queryStringParameters" ]["patientId" ] = mock_valid_nhs_number
122+
123+ expected_error = GetDocumentRefException (400 , LambdaError .DocumentReferenceMissingParameters )
124+
125+ expected_result = ApiGatewayResponse (
126+ status_code = 400 ,
127+ body = ErrorResponse (
128+ err_code = expected_error .err_code ,
129+ message = expected_error .message ,
130+ interaction_id = mock_interaction_id
131+ ).create (),
132+ methods = "GET"
133+ ).create_api_gateway_response ()
134+
135+ mock_feature_flag_service .get_feature_flags_by_flag .return_value = {feature_flag : True }
136+
137+ result = lambda_handler (valid_id_event_with_auth_header , context )
138+
139+ assert result == expected_result
140+
141+ def test_env_vars_not_set_errors (
142+ valid_id_event_with_auth_header ,
143+ context ,
144+ mocked_bad_env_vars
145+ ):
146+ expected_result = ApiGatewayResponse (
147+ status_code = 500 ,
148+ body = LambdaError .EnvMissing .create_error_body ({"name" : mocked_bad_env_vars }),
149+ methods = "GET"
150+ ).create_api_gateway_response ()
151+
152+ result = lambda_handler (valid_id_event_with_auth_header , context )
153+
154+ assert result == expected_result
0 commit comments