Skip to content

Commit 9062a72

Browse files
[PRMT-260] ITOC users (PCSE persona) (#657)
1 parent e8dcc0a commit 9062a72

File tree

4 files changed

+44
-17
lines changed

4 files changed

+44
-17
lines changed

lambdas/services/login_service.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -170,11 +170,16 @@ def generate_repository_role(
170170
logger.info(f"Smartcard Role: {smartcard_role}")
171171

172172
if smartcard_role in self.token_handler_ssm_service.get_smartcard_role_pcse():
173-
if self.has_pcse_org_ods_code(
173+
if self.has_matching_org_ods_code(
174174
organisation, self.token_handler_ssm_service.get_pcse_ods_code()
175175
):
176176
logger.info("PCSE: smartcard ODS identified")
177177
return RepositoryRole.PCSE
178+
elif self.has_matching_org_ods_code(
179+
organisation, self.token_handler_ssm_service.get_itoc_ods_codes()
180+
):
181+
logger.info("ITOC PCSE: smartcard ODS/role identified")
182+
return RepositoryRole.PCSE
178183

179184
if (
180185
smartcard_role
@@ -196,8 +201,16 @@ def generate_repository_role(
196201
raise LoginException(401, LambdaError.LoginNoRole)
197202

198203
@staticmethod
199-
def has_pcse_org_ods_code(organisation: dict, ods_code: str) -> bool:
200-
return organisation["org_ods_code"].upper() == ods_code.upper()
204+
def has_matching_org_ods_code(
205+
organisation: dict, ods_code: str | list[str]
206+
) -> bool:
207+
org_ods_code = organisation["org_ods_code"].upper()
208+
codes = (
209+
[ods_code.upper()]
210+
if isinstance(ods_code, str)
211+
else [code.upper() for code in ods_code]
212+
)
213+
return org_ods_code in codes
201214

202215
def issue_auth_token(
203216
self,

lambdas/services/token_handler_ssm_service.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,11 @@ def get_pcse_ods_code(self) -> str:
121121
)
122122
raise LoginException(500, LambdaError.LoginPcseOdsCode)
123123

124-
def get_itoc_ods_codes(self) -> str:
124+
def get_itoc_ods_codes(self) -> list[str]:
125125
logger.info("starting ssm request to retrieve ITOC ODS codes")
126126
response = self.get_ssm_parameter(ITOC_ODS_CODES)
127127
if response:
128-
return response
128+
return response.split(",")
129129

130130
logger.error(
131131
LambdaError.LoginItocOdsCodes.to_str(),

lambdas/tests/unit/services/test_login_service.py

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -297,20 +297,34 @@ def test_generate_repository_role_pcse(set_env, mocker):
297297
mocker.patch("services.login_service.OidcService")
298298

299299
mocker.patch.object(
300-
TokenHandlerSSMService,
301-
"get_smartcard_role_gp_admin",
302-
return_value=["wrong_role_code"],
300+
TokenHandlerSSMService, "get_smartcard_role_pcse", return_value=[user_role_code]
303301
)
304302
mocker.patch.object(
305-
TokenHandlerSSMService,
306-
"get_smartcard_role_gp_clinical",
307-
return_value=["wrong_role_code"],
303+
TokenHandlerSSMService, "get_pcse_ods_code", return_value=ods_code
308304
)
305+
306+
login_service = LoginService()
307+
308+
expected = RepositoryRole.PCSE
309+
actual = login_service.generate_repository_role(org, user_role_code)
310+
assert expected == actual
311+
312+
313+
def test_generate_repository_role_pcse_itoc(set_env, mocker):
314+
ods_code = "ods_code"
315+
user_role_code = "role_code"
316+
org_role_code = "org_role_code"
317+
org = {"org_ods_code": ods_code, "role_code": org_role_code}
318+
mocker.patch("services.login_service.OidcService")
319+
309320
mocker.patch.object(
310321
TokenHandlerSSMService, "get_smartcard_role_pcse", return_value=[user_role_code]
311322
)
312323
mocker.patch.object(
313-
TokenHandlerSSMService, "get_pcse_ods_code", return_value=ods_code
324+
TokenHandlerSSMService, "get_pcse_ods_code", return_value="wrong_ods_code"
325+
)
326+
mocker.patch.object(
327+
TokenHandlerSSMService, "get_itoc_ods_codes", return_value=ods_code
314328
)
315329

316330
login_service = LoginService()
@@ -327,17 +341,17 @@ def test_generate_repository_role_no_role_raises_auth_error(set_env, mocker):
327341

328342
mocker.patch.object(
329343
TokenHandlerSSMService,
330-
"get_smartcard_role_gp_admin",
344+
"get_smartcard_role_pcse",
331345
return_value=["wrong_role_code"],
332346
)
333347
mocker.patch.object(
334348
TokenHandlerSSMService,
335-
"get_smartcard_role_gp_clinical",
349+
"get_smartcard_role_gp_admin",
336350
return_value=["wrong_role_code"],
337351
)
338352
mocker.patch.object(
339353
TokenHandlerSSMService,
340-
"get_smartcard_role_pcse",
354+
"get_smartcard_role_gp_clinical",
341355
return_value=["wrong_role_code"],
342356
)
343357

lambdas/tests/unit/services/test_token_handler_ssm_service.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@
9292
"Parameter": {
9393
"Name": ITOC_ODS_CODES,
9494
"Type": "SecureString",
95-
"Value": "R0012",
95+
"Value": "R0012,R0120",
9696
"Version": 123,
9797
"Selector": "string",
9898
"SourceResult": "string",
@@ -286,7 +286,7 @@ def test_get_pcse_ods_code_raises_login_exception(mock_service, mock_ssm):
286286

287287
def test_get_itoc_ods_codes(mock_service, mock_ssm):
288288
mock_ssm.get_parameter.return_value = MOCK_ITOC_ODS_CODE_RESPONSE
289-
expected = "R0012"
289+
expected = ["R0012", "R0120"]
290290

291291
actual = mock_service.get_itoc_ods_codes()
292292

0 commit comments

Comments
 (0)