Skip to content

Commit 157d209

Browse files
committed
improve coverage
1 parent 8e7baeb commit 157d209

File tree

6 files changed

+92
-9
lines changed

6 files changed

+92
-9
lines changed

lambdas/filenameprocessor/src/constants.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
EXTENDED_ATTRIBUTES_FILE_PREFIX = "Vaccination_Extended_Attributes"
2525
EXTENDED_ATTRIBUTES_VACC_TYPE = "COVID"
2626
DPS_DESTINATION_PREFIX = "dps_destination"
27-
EA_ARCHIVE_PREFIX = "extended-attributes-archive"
28-
VALID_EA_VERSIONS = "V1_5"
27+
EXTENDED_ATTRIBUTES_ARCHIVE_PREFIX = "extended-attributes-archive"
28+
VALID_EA_VERSIONS = ["V1_5"]
2929
ERROR_TYPE_TO_STATUS_CODE_MAP = {
3030
VaccineTypePermissionsError: 403,
3131
InvalidFileKeyError: 400, # Includes invalid ODS code, therefore unable to identify supplier

lambdas/filenameprocessor/src/file_name_processor.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@
2020
from constants import (
2121
DPS_DESTINATION_BUCKET_NAME,
2222
DPS_DESTINATION_PREFIX,
23-
EA_ARCHIVE_PREFIX,
2423
ERROR_TYPE_TO_STATUS_CODE_MAP,
2524
EXPECTED_BUCKET_OWNER_ACCOUNT,
25+
EXTENDED_ATTRIBUTES_ARCHIVE_PREFIX,
2626
EXTENDED_ATTRIBUTES_FILE_PREFIX,
2727
SOURCE_BUCKET_NAME,
2828
FileNotProcessedReason,
@@ -272,7 +272,7 @@ def handle_extended_attributes_file(
272272
EXPECTED_BUCKET_OWNER_ACCOUNT,
273273
)
274274

275-
move_file(bucket_name, file_key, f"{EA_ARCHIVE_PREFIX}/{file_key}")
275+
move_file(bucket_name, file_key, f"{EXTENDED_ATTRIBUTES_ARCHIVE_PREFIX}/{file_key}")
276276

277277
upsert_audit_table(
278278
message_id,
@@ -306,7 +306,7 @@ def handle_extended_attributes_file(
306306
extended_attribute_identifier = "unknown"
307307

308308
# Move file to archive
309-
move_file(bucket_name, file_key, f"{EA_ARCHIVE_PREFIX}/{file_key}")
309+
move_file(bucket_name, file_key, f"{EXTENDED_ATTRIBUTES_ARCHIVE_PREFIX}/{file_key}")
310310

311311
upsert_audit_table(
312312
message_id,

lambdas/filenameprocessor/src/file_validation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def validate_extended_attributes_file_key(file_key: str) -> str:
5757
if not (
5858
vaccine_type in valid_vaccine_types
5959
and file_type == EXTENDED_ATTRIBUTES_FILE_PREFIX.upper()
60-
and version == VALID_EA_VERSIONS
60+
and version in VALID_EA_VERSIONS
6161
and supplier # Note that if supplier could be identified, this also implies that ODS code is valid
6262
and is_valid_datetime(timestamp)
6363
and (

lambdas/filenameprocessor/src/supplier_permissions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def validate_vaccine_type_permissions(vaccine_type: str, supplier: str) -> list:
2222
return supplier_permissions
2323

2424

25-
def validate_permissions_for_extended_attributes_files(vaccine_type: str, supplier: str) -> list:
25+
def validate_permissions_for_extended_attributes_files(vaccine_type: str, supplier: str) -> tuple[str]:
2626
"""
2727
Checks that the supplier has COVID vaccine type and its CUD permissions.
2828
Raises an exception if the supplier does not have at least one permission for the vaccine type.

lambdas/filenameprocessor/tests/test_supplier_permissions.py

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@
88
# Ensure environment variables are mocked before importing from src files
99
with patch.dict("os.environ", MOCK_ENVIRONMENT_DICT):
1010
from models.errors import VaccineTypePermissionsError
11-
from supplier_permissions import validate_vaccine_type_permissions
11+
from supplier_permissions import (
12+
validate_permissions_for_extended_attributes_files,
13+
validate_vaccine_type_permissions,
14+
)
1215

1316

1417
class TestSupplierPermissions(TestCase):
@@ -63,3 +66,84 @@ def test_validate_vaccine_type_permissions(self):
6366
str(context.exception),
6467
f"Initial file validation failed: TEST_SUPPLIER does not have permissions for {vaccine_type}",
6568
)
69+
70+
def test_validate_permissions_for_extended_attributes_files_success(self):
71+
"""Supplier with COVID CUD permissions should be accepted and identifier returned."""
72+
with patch(
73+
"supplier_permissions.get_supplier_permissions_from_cache",
74+
return_value=["COVID.CUDS", "FLU.CRUDS"],
75+
):
76+
result = validate_permissions_for_extended_attributes_files("COVID", "X8E5B")
77+
self.assertEqual(result, "X8E5B_COVID")
78+
79+
def test_validate_permissions_for_extended_attributes_files_fail_no_covid(self):
80+
"""Supplier without any COVID permissions should raise VaccineTypePermissionsError."""
81+
with patch(
82+
"supplier_permissions.get_supplier_permissions_from_cache",
83+
return_value=["FLU.CRUDS"],
84+
):
85+
with self.assertRaises(VaccineTypePermissionsError) as context:
86+
validate_permissions_for_extended_attributes_files("COVID", "X8E5B")
87+
self.assertEqual(
88+
str(context.exception),
89+
"Initial file validation failed: X8E5B does not have permissions for COVID",
90+
)
91+
92+
def test_validate_permissions_for_extended_attributes_files_fail_partial_ops(self):
93+
"""Supplier with only partial COVID permissions (e.g., C only) should raise error as CUD required."""
94+
# Note: Implementation checks only the first matching COVID entry's operation string.
95+
# Therefore, entries like COVID.CRUD (which includes C, U, D letters) will pass.
96+
# The following cases should fail because the first COVID entry lacks at least one of C/U/D.
97+
partial_permission_cases = [
98+
["COVID.C"],
99+
["COVID.U"],
100+
["COVID.D"],
101+
["COVID.CU"],
102+
["COVID.UD"],
103+
["COVID.CD"],
104+
["COVID.S"], # status only
105+
]
106+
107+
for permissions in partial_permission_cases:
108+
with self.subTest(permissions=permissions):
109+
with patch(
110+
"supplier_permissions.get_supplier_permissions_from_cache",
111+
return_value=permissions,
112+
):
113+
with self.assertRaises(VaccineTypePermissionsError) as context:
114+
validate_permissions_for_extended_attributes_files("COVID", "X8E5B")
115+
self.assertEqual(
116+
str(context.exception),
117+
"Initial file validation failed: X8E5B does not have permissions for COVID",
118+
)
119+
120+
def test_validate_permissions_for_extended_attributes_files_multiple_entries(self):
121+
"""Multiple COVID permission entries should pass only if the first matching COVID entry contains CUD."""
122+
# Case: First entry has CUDS -> success
123+
with patch(
124+
"supplier_permissions.get_supplier_permissions_from_cache",
125+
return_value=["COVID.CUDS", "COVID.C"],
126+
):
127+
result = validate_permissions_for_extended_attributes_files("COVID", "RAVS")
128+
self.assertEqual(result, "RAVS_COVID")
129+
130+
# Case: First entry lacks CUD (even if later one has CUDS) -> fail
131+
with patch(
132+
"supplier_permissions.get_supplier_permissions_from_cache",
133+
return_value=["COVID.C", "COVID.CUDS"],
134+
):
135+
with self.assertRaises(VaccineTypePermissionsError) as context:
136+
validate_permissions_for_extended_attributes_files("COVID", "RAVS")
137+
self.assertEqual(
138+
str(context.exception),
139+
"Initial file validation failed: RAVS does not have permissions for COVID",
140+
)
141+
142+
def test_validate_permissions_for_extended_attributes_files_crud_passes(self):
143+
"""COVID.CRUD contains C, U, D letters and should be accepted by the current implementation."""
144+
with patch(
145+
"supplier_permissions.get_supplier_permissions_from_cache",
146+
return_value=["COVID.CRUD"],
147+
):
148+
result = validate_permissions_for_extended_attributes_files("COVID", "X8E5B")
149+
self.assertEqual(result, "X8E5B_COVID")

lambdas/filenameprocessor/tests/utils_for_tests/mock_environment_variables.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ class Sqs:
3636
MOCK_ENVIRONMENT_DICT = {
3737
"SOURCE_BUCKET_NAME": BucketNames.SOURCE,
3838
"ACK_BUCKET_NAME": BucketNames.DESTINATION,
39-
"MOCK_MOTO_ACCOUNT_ID": "123456789012",
4039
"QUEUE_URL": "https://sqs.eu-west-2.amazonaws.com/123456789012/imms-batch-file-created-queue.fifo",
4140
"REDIS_HOST": "localhost",
4241
"REDIS_PORT": "6379",

0 commit comments

Comments
 (0)