Skip to content

Commit c451231

Browse files
[PRM-135] Review Feature Flags (#612)
* Removed feature flag (downloadOdsReportEnabled) * Renamed lloydGeorgeValidationStrictMode to lloydGeorgeValidationStrictModeEnabled * Renamed lloydGeorgeValidationStrictMode to lloydGeorgeValidationStrictModeEnabled * Removed unused declarations * removed trailing space * removed trailing space
1 parent 1e92763 commit c451231

File tree

10 files changed

+27
-96
lines changed

10 files changed

+27
-96
lines changed

app/cypress/support/feature_flags.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,4 @@ export const defaultFeatureFlags: FeatureFlags = {
66
uploadLloydGeorgeWorkflowEnabled: true,
77
uploadArfWorkflowEnabled: true,
88
uploadLambdaEnabled: true,
9-
downloadOdsReportEnabled: true,
109
};

app/src/helpers/test/testBuilders.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,6 @@ const buildConfig = (
159159
uploadLloydGeorgeWorkflowEnabled: false,
160160
uploadLambdaEnabled: false,
161161
uploadArfWorkflowEnabled: false,
162-
downloadOdsReportEnabled: true,
163162
...featureFlagsOverride,
164163
},
165164
};

app/src/pages/homePage/HomePage.tsx

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,10 @@ import { routes } from '../../types/generic/routes';
33
import useTitle from '../../helpers/hooks/useTitle';
44
import { REPORT_TYPE } from '../../types/generic/reports';
55
import { ReactComponent as RightCircleIcon } from '../../styles/right-chevron-circle.svg';
6-
import useConfig from '../../helpers/hooks/useConfig';
76

87
type Props = {};
98

109
const HomePage = (props: Props) => {
11-
const { featureFlags } = useConfig();
12-
1310
useTitle({ pageTitle: 'Access and store digital patient documents' });
1411

1512
return (
@@ -35,27 +32,25 @@ const HomePage = (props: Props) => {
3532
</Card.Content>
3633
</Card>
3734
</Card.GroupItem>
38-
{featureFlags.downloadOdsReportEnabled && (
39-
<Card.GroupItem width="one-half">
40-
<Card clickable cardType="primary">
41-
<Card.Content>
42-
<Card.Heading className="nhsuk-heading-m">
43-
<Card.Link
44-
data-testid="download-report-btn"
45-
href={`${routes.REPORT_DOWNLOAD}?reportType=${REPORT_TYPE.ODS_PATIENT_SUMMARY}`}
46-
>
47-
Download a report
48-
</Card.Link>
49-
</Card.Heading>
50-
<Card.Description>
51-
This report shows the list of Lloyd George records stored for
52-
your organisation.
53-
</Card.Description>
54-
<RightCircleIcon />
55-
</Card.Content>
56-
</Card>
57-
</Card.GroupItem>
58-
)}
35+
<Card.GroupItem width="one-half">
36+
<Card clickable cardType="primary">
37+
<Card.Content>
38+
<Card.Heading className="nhsuk-heading-m">
39+
<Card.Link
40+
data-testid="download-report-btn"
41+
href={`${routes.REPORT_DOWNLOAD}?reportType=${REPORT_TYPE.ODS_PATIENT_SUMMARY}`}
42+
>
43+
Download a report
44+
</Card.Link>
45+
</Card.Heading>
46+
<Card.Description>
47+
This report shows the list of Lloyd George records stored for your
48+
organisation.
49+
</Card.Description>
50+
<RightCircleIcon />
51+
</Card.Content>
52+
</Card>
53+
</Card.GroupItem>
5954
</Card.Group>
6055
</>
6156
);

app/src/pages/reportDownloadPage/ReportDownloadPage.tsx

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import { useEffect } from 'react';
77
import { getLastURLPath } from '../../helpers/utils/urlManipulations';
88
import DownloadReportSelectStage from '../../components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage';
99
import DownloadReportCompleteStage from '../../components/blocks/_downloadReport/downloadReportCompleteStage/DownloadReportCompleteStage';
10-
import useConfig from '../../helpers/hooks/useConfig';
1110

1211
type Props = {};
1312

@@ -19,27 +18,14 @@ const RedirectToHomePage = () => {
1918
return <></>;
2019
};
2120

22-
const RedirectToNotFound = () => {
23-
const navigate = useNavigate();
24-
useEffect(() => {
25-
navigate(routes.NOT_FOUND);
26-
});
27-
return <></>;
28-
};
29-
3021
const ReportDownloadPage = (props: Props) => {
3122
useTitle({ pageTitle: 'Download report' });
3223
const [searchParams] = useSearchParams();
33-
const { featureFlags } = useConfig();
3424

3525
const reportType = searchParams.get('reportType') as REPORT_TYPE;
3626

3727
const report = getReportByType(reportType);
3828

39-
if (!featureFlags.downloadOdsReportEnabled) {
40-
return <RedirectToNotFound />;
41-
}
42-
4329
if (!reportType || !report) {
4430
return <RedirectToHomePage />;
4531
}

app/src/types/generic/featureFlags.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@ export type FeatureFlags = {
22
uploadLloydGeorgeWorkflowEnabled: boolean;
33
uploadLambdaEnabled: boolean;
44
uploadArfWorkflowEnabled: boolean;
5-
downloadOdsReportEnabled: boolean;
65
};
76

87
export const defaultFeatureFlags: FeatureFlags = {
98
uploadLloydGeorgeWorkflowEnabled: false,
109
uploadLambdaEnabled: false,
1110
uploadArfWorkflowEnabled: false,
12-
downloadOdsReportEnabled: false,
1311
};

lambdas/enums/feature_flags.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@ class FeatureFlags(Enum):
66
UPLOAD_LAMBDA_ENABLED = "uploadLambdaEnabled"
77
UPLOAD_ARF_WORKFLOW_ENABLED = "uploadArfWorkflowEnabled"
88
USE_SMARTCARD_AUTH = "useSmartcardAuth"
9-
LLOYD_GEORGE_VALIDATION_STRICT_MODE = "lloydGeorgeValidationStrictMode"
10-
ODS_REPORT_LAMBDA_ENABLED = "downloadOdsReportEnabled"
9+
LLOYD_GEORGE_VALIDATION_STRICT_MODE_ENABLED = (
10+
"lloydGeorgeValidationStrictModeEnabled"
11+
)

lambdas/handlers/bulk_upload_handler.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ def lambda_handler(event, _context):
2020
logger.info("Received event. Starting bulk upload process")
2121
feature_flag_service = FeatureFlagService()
2222
validation_strict_mode_flag_object = feature_flag_service.get_feature_flags_by_flag(
23-
FeatureFlags.LLOYD_GEORGE_VALIDATION_STRICT_MODE.value
23+
FeatureFlags.LLOYD_GEORGE_VALIDATION_STRICT_MODE_ENABLED.value
2424
)
2525
validation_strict_mode = validation_strict_mode_flag_object[
26-
FeatureFlags.LLOYD_GEORGE_VALIDATION_STRICT_MODE.value
26+
FeatureFlags.LLOYD_GEORGE_VALIDATION_STRICT_MODE_ENABLED.value
2727
]
2828

2929
if validation_strict_mode:

lambdas/handlers/get_report_by_ods_handler.py

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,14 @@
11
import json
22

3-
from enums.feature_flags import FeatureFlags
43
from enums.file_type import FileType
5-
from enums.lambda_error import LambdaError
64
from enums.logging_app_interaction import LoggingAppInteraction
7-
from services.feature_flags_service import FeatureFlagService
85
from services.ods_report_service import OdsReportService
96
from utils.audit_logging_setup import LoggingService
107
from utils.decorators.ensure_env_var import ensure_environment_variables
118
from utils.decorators.handle_lambda_exceptions import handle_lambda_exceptions
129
from utils.decorators.override_error_check import override_error_check
1310
from utils.decorators.set_audit_arg import set_request_context_for_logging
1411
from utils.exceptions import OdsErrorException
15-
from utils.lambda_exceptions import FeatureFlagsException
1612
from utils.lambda_response import ApiGatewayResponse
1713
from utils.request_context import request_context
1814

@@ -33,13 +29,6 @@ def lambda_handler(event, context):
3329
request_context.app_interaction = LoggingAppInteraction.ODS_REPORT.value
3430

3531
if "httpMethod" in event:
36-
feature_flag_service = FeatureFlagService()
37-
flag_name = FeatureFlags.ODS_REPORT_LAMBDA_ENABLED.value
38-
lambda_enabled_flag = feature_flag_service.get_feature_flags_by_flag(flag_name)
39-
if not lambda_enabled_flag.get(flag_name):
40-
logger.info("Feature flag not enabled, event will not be processed")
41-
raise FeatureFlagsException(500, LambdaError.FeatureFlagDisabled)
42-
4332
return handle_api_gateway_request(event)
4433
else:
4534
return handle_manual_trigger(event)

lambdas/tests/unit/handlers/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,6 @@ def mock_upload_lambda_disabled(mocker):
117117
def mock_validation_strict_disabled(mocker):
118118
mock_function = mocker.patch.object(FeatureFlagService, "get_feature_flags_by_flag")
119119
mock_upload_lambda_feature_flag = mock_function.return_value = {
120-
"lloydGeorgeValidationStrictMode": False
120+
"lloydGeorgeValidationStrictModeEnabled": False
121121
}
122122
yield mock_upload_lambda_feature_flag

lambdas/tests/unit/handlers/test_get_report_by_ods_handler.py

Lines changed: 2 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,11 @@
22
import logging
33

44
import pytest
5-
from enums.lambda_error import LambdaError
65
from handlers.get_report_by_ods_handler import (
76
handle_api_gateway_request,
87
handle_manual_trigger,
98
lambda_handler,
109
)
11-
from services.feature_flags_service import FeatureFlagService
12-
from tests.unit.conftest import MOCK_INTERACTION_ID
1310
from utils.exceptions import OdsErrorException
1411
from utils.lambda_response import ApiGatewayResponse
1512
from utils.request_context import request_context
@@ -26,32 +23,14 @@ def mock_service(mocker):
2623
return mock_service
2724

2825

29-
@pytest.fixture
30-
def mock_lambda_enabled(mocker):
31-
mock_function = mocker.patch.object(FeatureFlagService, "get_feature_flags_by_flag")
32-
mock_upload_lambda_feature_flag = mock_function.return_value = {
33-
"downloadOdsReportEnabled": True
34-
}
35-
return mock_upload_lambda_feature_flag
36-
37-
38-
@pytest.fixture
39-
def mock_lambda_disabled(mocker):
40-
mock_function = mocker.patch.object(FeatureFlagService, "get_feature_flags_by_flag")
41-
mock_upload_lambda_feature_flag = mock_function.return_value = {
42-
"downloadOdsReportEnabled": False
43-
}
44-
return mock_upload_lambda_feature_flag
45-
46-
4726
@pytest.fixture
4827
def mock_jwt_encode(mocker):
4928
decoded_token = {"selected_organisation": {"org_ods_code": "ODS123"}}
5029
yield mocker.patch("jwt.decode", return_value=decoded_token)
5130

5231

5332
def test_lambda_handler_api_gateway_request(
54-
mock_service, set_env, context, mock_jwt_encode, mock_lambda_enabled
33+
mock_service, set_env, context, mock_jwt_encode
5534
):
5635
event = {"httpMethod": "GET", "headers": {"Authorization": "mock_token"}}
5736
mock_service.get_nhs_numbers_by_ods.return_value = "example.com/presigned-url"
@@ -70,9 +49,7 @@ def test_lambda_handler_api_gateway_request(
7049
)
7150

7251

73-
def test_lambda_handler_manual_trigger(
74-
mock_service, set_env, context, mock_lambda_enabled
75-
):
52+
def test_lambda_handler_manual_trigger(mock_service, set_env, context):
7653
event = {"odsCode": "ODS123,ODS456"}
7754
mock_service.get_nhs_numbers_by_ods.return_value = None
7855
expected = ApiGatewayResponse(
@@ -91,19 +68,6 @@ def test_lambda_handler_manual_trigger(
9168
)
9269

9370

94-
def test_lambda_handler_feature_flag_disabled(
95-
mock_service, set_env, context, mock_lambda_disabled
96-
):
97-
request_context.request_id = MOCK_INTERACTION_ID
98-
expected = ApiGatewayResponse(
99-
500, LambdaError.FeatureFlagDisabled.create_error_body(), "GET"
100-
).create_api_gateway_response()
101-
102-
actual = lambda_handler({"httpMethod": "GET"}, context)
103-
104-
assert expected == actual
105-
106-
10771
@pytest.mark.parametrize(
10872
["event", "output"],
10973
[

0 commit comments

Comments
 (0)