Skip to content

Commit ebd93b2

Browse files
committed
Add feature flag for document review iteration 3 and update related services
1 parent 5dfb610 commit ebd93b2

File tree

4 files changed

+149
-9
lines changed

4 files changed

+149
-9
lines changed

lambdas/enums/feature_flags.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ class FeatureFlags(StrEnum):
1010
"lloydGeorgeValidationStrictModeEnabled"
1111
)
1212
UPLOAD_DOCUMENT_ITERATION_2_ENABLED = "uploadDocumentIteration2Enabled"
13+
UPLOAD_DOCUMENT_ITERATION_3_ENABLED = "uploadDocumentIteration3Enabled"

lambdas/services/document_upload_review_service.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def update_document_review_custodian(
2626
self,
2727
patient_documents: list[DocumentUploadReviewReference],
2828
updated_ods_code: str,
29-
) -> None:
29+
):
3030
review_update_field = {"custodian"}
3131
if not patient_documents:
3232
return

lambdas/services/process_mns_message_service.py

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from botocore.exceptions import ClientError
44
from enums.death_notification_status import DeathNotificationStatus
5+
from enums.feature_flags import FeatureFlags
56
from enums.mns_notification_types import MNSNotificationTypes
67
from enums.patient_ods_inactive_status import PatientOdsInactiveStatus
78
from models.document_reference import DocumentReference
@@ -10,6 +11,7 @@
1011
from services.base.sqs_service import SQSService
1112
from services.document_reference_service import DocumentReferenceService
1213
from services.document_upload_review_service import DocumentUploadReviewService
14+
from services.feature_flags_service import FeatureFlagService
1315
from utils.audit_logging_setup import LoggingService
1416
from utils.exceptions import PdsErrorException
1517
from utils.utilities import get_pds_service
@@ -24,6 +26,8 @@ def __init__(self):
2426
self.pds_service = get_pds_service()
2527
self.sqs_service = SQSService()
2628
self.queue = os.getenv("MNS_NOTIFICATION_QUEUE_URL")
29+
self.feature_flag_service = FeatureFlagService()
30+
self.is_review_feature_enabled = self.check_if_review_feature_enabled()
2731

2832
def handle_mns_notification(self, message: MNSSQSMessage):
2933
try:
@@ -114,11 +118,14 @@ def get_all_patient_documents(
114118
nhs_number
115119
)
116120
)
117-
review_documents = (
118-
self.document_review_service.fetch_documents_from_table_with_nhs_number(
119-
nhs_number
121+
if self.is_review_feature_enabled:
122+
review_documents = (
123+
self.document_review_service.fetch_documents_from_table_with_nhs_number(
124+
nhs_number
125+
)
120126
)
121-
)
127+
else:
128+
review_documents = []
122129
return lg_documents, review_documents
123130

124131
def update_all_patient_documents(
@@ -132,7 +139,18 @@ def update_all_patient_documents(
132139
self.lg_document_service.update_patient_ods_code(
133140
lg_documents, updated_ods_code
134141
)
135-
if review_documents:
142+
if review_documents and self.is_review_feature_enabled:
136143
self.document_review_service.update_document_review_custodian(
137144
review_documents, updated_ods_code
138145
)
146+
147+
def check_if_review_feature_enabled(self) -> bool:
148+
upload_lambda_enabled_flag_object = (
149+
self.feature_flag_service.get_feature_flags_by_flag(
150+
FeatureFlags.UPLOAD_DOCUMENT_ITERATION_3_ENABLED
151+
)
152+
)
153+
154+
return upload_lambda_enabled_flag_object[
155+
FeatureFlags.UPLOAD_DOCUMENT_ITERATION_3_ENABLED
156+
]

lambdas/tests/unit/services/test_process_mns_message_service.py

Lines changed: 124 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
import pytest
44
from botocore.exceptions import ClientError
5+
from enums.feature_flags import FeatureFlags
56
from enums.patient_ods_inactive_status import PatientOdsInactiveStatus
67
from models.document_reference import DocumentReference
78
from models.document_review import DocumentUploadReviewReference
89
from models.sqs.mns_sqs_message import MNSSQSMessage
10+
from services.feature_flags_service import FeatureFlagService
911
from services.process_mns_message_service import MNSNotificationService
1012
from tests.unit.conftest import TEST_CURRENT_GP_ODS, TEST_NHS_NUMBER
1113
from tests.unit.handlers.test_mns_notification_handler import (
@@ -18,7 +20,20 @@
1820

1921

2022
@pytest.fixture
21-
def mns_service(mocker, set_env, monkeypatch):
23+
def mns_service(mocker, set_env, monkeypatch, mock_upload_document_iteration_3_enabled):
24+
monkeypatch.setenv("PDS_FHIR_IS_STUBBED", "False")
25+
service = MNSNotificationService()
26+
mocker.patch.object(service, "pds_service")
27+
mocker.patch.object(service, "document_review_service")
28+
mocker.patch.object(service, "lg_document_service")
29+
mocker.patch.object(service, "sqs_service")
30+
yield service
31+
32+
33+
@pytest.fixture
34+
def mns_service_feature_disabled(
35+
mocker, set_env, monkeypatch, mock_upload_document_iteration_3_disabled
36+
):
2237
monkeypatch.setenv("PDS_FHIR_IS_STUBBED", "False")
2338
service = MNSNotificationService()
2439
mocker.patch.object(service, "pds_service")
@@ -69,6 +84,24 @@ def mock_document_review_references(mocker):
6984
return reviews
7085

7186

87+
@pytest.fixture
88+
def mock_upload_document_iteration_3_enabled(mocker):
89+
mock_function = mocker.patch.object(FeatureFlagService, "get_feature_flags_by_flag")
90+
mock_feature_flag = mock_function.return_value = {
91+
FeatureFlags.UPLOAD_DOCUMENT_ITERATION_3_ENABLED: True
92+
}
93+
yield mock_feature_flag
94+
95+
96+
@pytest.fixture
97+
def mock_upload_document_iteration_3_disabled(mocker):
98+
mock_function = mocker.patch.object(FeatureFlagService, "get_feature_flags_by_flag")
99+
mock_feature_flag = mock_function.return_value = {
100+
FeatureFlags.UPLOAD_DOCUMENT_ITERATION_3_ENABLED: False
101+
}
102+
yield mock_feature_flag
103+
104+
72105
MOCK_UPDATE_TIME = "2024-01-01 12:00:00"
73106
NEW_ODS_CODE = "NEW123"
74107

@@ -249,7 +282,6 @@ def test_handle_death_notification_formal_no_documents(mns_service, mocker):
249282
mns_service.update_all_patient_documents.assert_not_called()
250283

251284

252-
253285
def test_get_updated_gp_ods(mns_service):
254286
expected_ods = NEW_ODS_CODE
255287
patient_details_mock = MagicMock()
@@ -343,7 +375,6 @@ def test_update_all_patient_documents_with_only_review_documents(
343375
)
344376

345377

346-
347378
def test_handle_gp_change_notification_with_only_lg_documents(
348379
mns_service, mock_document_references, mocker
349380
):
@@ -496,3 +527,93 @@ def test_handle_death_notification_removed_with_only_review_documents(
496527
mns_service.update_all_patient_documents.assert_called_once_with(
497528
[], mock_document_review_references, NEW_ODS_CODE
498529
)
530+
531+
532+
def test_get_all_patient_documents_when_feature_disabled(
533+
mns_service_feature_disabled, mocker
534+
):
535+
"""Test that review documents are not fetched when feature flag is disabled"""
536+
expected_lg_docs = [MagicMock(spec=DocumentReference)]
537+
538+
mns_service_feature_disabled.lg_document_service.fetch_documents_from_table_with_nhs_number.return_value = (
539+
expected_lg_docs
540+
)
541+
542+
lg_docs, review_docs = mns_service_feature_disabled.get_all_patient_documents(
543+
TEST_NHS_NUMBER
544+
)
545+
546+
assert lg_docs == expected_lg_docs
547+
assert review_docs == []
548+
mns_service_feature_disabled.lg_document_service.fetch_documents_from_table_with_nhs_number.assert_called_once_with(
549+
TEST_NHS_NUMBER
550+
)
551+
mns_service_feature_disabled.document_review_service.fetch_documents_from_table_with_nhs_number.assert_not_called()
552+
553+
554+
def test_update_all_patient_documents_when_feature_disabled(
555+
mns_service_feature_disabled,
556+
mock_document_references,
557+
mock_document_review_references,
558+
mocker,
559+
):
560+
"""Test that review documents are not updated when feature flag is disabled"""
561+
mns_service_feature_disabled.update_all_patient_documents(
562+
mock_document_references, mock_document_review_references, NEW_ODS_CODE
563+
)
564+
565+
mns_service_feature_disabled.lg_document_service.update_patient_ods_code.assert_called_once_with(
566+
mock_document_references, NEW_ODS_CODE
567+
)
568+
mns_service_feature_disabled.document_review_service.update_document_review_custodian.assert_not_called()
569+
570+
571+
def test_handle_gp_change_notification_when_feature_disabled(
572+
mns_service_feature_disabled, mock_document_references, mocker
573+
):
574+
"""Test GP change notification handling when feature flag is disabled"""
575+
mocker.patch.object(mns_service_feature_disabled, "get_all_patient_documents")
576+
mns_service_feature_disabled.get_all_patient_documents.return_value = (
577+
mock_document_references,
578+
[],
579+
)
580+
mocker.patch.object(mns_service_feature_disabled, "get_updated_gp_ods")
581+
mns_service_feature_disabled.get_updated_gp_ods.return_value = NEW_ODS_CODE
582+
mocker.patch.object(mns_service_feature_disabled, "update_all_patient_documents")
583+
584+
mns_service_feature_disabled.handle_gp_change_notification(gp_change_message)
585+
586+
mns_service_feature_disabled.get_all_patient_documents.assert_called_once_with(
587+
gp_change_message.subject.nhs_number
588+
)
589+
mns_service_feature_disabled.get_updated_gp_ods.assert_called_once_with(
590+
gp_change_message.subject.nhs_number
591+
)
592+
mns_service_feature_disabled.update_all_patient_documents.assert_called_once_with(
593+
mock_document_references, [], NEW_ODS_CODE
594+
)
595+
596+
597+
def test_handle_death_notification_formal_when_feature_disabled(
598+
mns_service_feature_disabled, mock_document_references, mocker
599+
):
600+
"""Test formal death notification when feature flag is disabled"""
601+
mocker.patch.object(mns_service_feature_disabled, "get_all_patient_documents")
602+
mocker.patch.object(mns_service_feature_disabled, "get_updated_gp_ods")
603+
mocker.patch.object(mns_service_feature_disabled, "update_all_patient_documents")
604+
mns_service_feature_disabled.get_all_patient_documents.return_value = (
605+
mock_document_references,
606+
[],
607+
)
608+
609+
mns_service_feature_disabled.handle_death_notification(death_notification_message)
610+
611+
mns_service_feature_disabled.get_all_patient_documents.assert_called_once_with(
612+
death_notification_message.subject.nhs_number
613+
)
614+
mns_service_feature_disabled.update_all_patient_documents.assert_called_once_with(
615+
mock_document_references,
616+
[],
617+
PatientOdsInactiveStatus.DECEASED,
618+
)
619+
mns_service_feature_disabled.get_updated_gp_ods.assert_not_called()

0 commit comments

Comments
 (0)