From 9d8f847b8e7f01bcf162836fd4e922db00ce86d6 Mon Sep 17 00:00:00 2001 From: Issam Kadar Date: Thu, 9 Apr 2026 16:44:34 +0200 Subject: [PATCH 1/4] feat/converter : validate RS-SR resource exists in RS-RI before conversion --- .../resources_info/resources_info_cisu_constants.py | 1 + .../resources_status/resources_status_constants.py | 1 + .../resources_status/resources_status_converter.py | 12 ++++++++++++ 3 files changed, 14 insertions(+) diff --git a/converter/converter/cisu/resources_info/resources_info_cisu_constants.py b/converter/converter/cisu/resources_info/resources_info_cisu_constants.py index 0f046fdd9..9d8f7b97a 100644 --- a/converter/converter/cisu/resources_info/resources_info_cisu_constants.py +++ b/converter/converter/cisu/resources_info/resources_info_cisu_constants.py @@ -4,6 +4,7 @@ class ResourcesInfoCISUConstants: VEHICLE_TYPE_PATH = "$.vehicleType" CASE_ID_FIELD = "caseId" + RESOURCE_ID_KEY = "resourceId" PATIENT_ID_KEY = "patientId" POSITION_KEY = "position" diff --git a/converter/converter/cisu/resources_status/resources_status_constants.py b/converter/converter/cisu/resources_status/resources_status_constants.py index 8f2b157c2..a3499341c 100644 --- a/converter/converter/cisu/resources_status/resources_status_constants.py +++ b/converter/converter/cisu/resources_status/resources_status_constants.py @@ -1,3 +1,4 @@ class ResourcesStatusConstants: RESOURCE_STATUS_PATH = "$.resourceStatus" CASE_ID = "$.caseId" + RESOURCE_ID = "$.resourceId" diff --git a/converter/converter/cisu/resources_status/resources_status_converter.py b/converter/converter/cisu/resources_status/resources_status_converter.py index 27aade0c1..3b02bfac7 100644 --- a/converter/converter/cisu/resources_status/resources_status_converter.py +++ b/converter/converter/cisu/resources_status/resources_status_converter.py @@ -8,6 +8,9 @@ from converter.cisu.resources_info.resources_info_cisu_converter import ( ResourcesInfoCISUConverter, ) +from converter.cisu.resources_info.resources_info_cisu_constants import ( + ResourcesInfoCISUConstants, +) from converter.cisu.resources_status.resources_status_constants import ( ResourcesStatusConstants, ) @@ -36,7 +39,16 @@ def from_rs_to_cisu( if rs_ri_msg is None: raise ValueError(f"No RS-RI found for caseId: {case_id!r}") + resource_id = get_field_value(current_use_case, ResourcesStatusConstants.RESOURCE_ID) rs_ri = rs_ri_msg.payload + rs_ri_content = ResourcesInfoCISUConverter.copy_rs_input_use_case_content(rs_ri) + resources = get_field_value(rs_ri_content, ResourcesInfoCISUConstants.RESOURCE_PATH) or [] + resource_ids_in_rs_ri = {r.get(ResourcesInfoCISUConstants.RESOURCE_ID_KEY) for r in resources} + + if resource_id not in resource_ids_in_rs_ri: + raise ValueError( + f"Resource '{resource_id}' from RS-SR not found in RS-RI for caseId '{case_id}'" + ) rs_sr_use_cases = [ cls.copy_rs_input_use_case_content(pm.payload) for pm in persisted_rs_sr From 253be2cf1acdd460181dca7433c07ac107e55a03 Mon Sep 17 00:00:00 2001 From: Issam Kadar Date: Thu, 9 Apr 2026 16:47:34 +0200 Subject: [PATCH 2/4] feat/converter : add test that assert raise error when rs-sr with unknown resourceId in persisted rs-ri --- .../cisu/test_resources_status_converter.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/converter/tests/cisu/test_resources_status_converter.py b/converter/tests/cisu/test_resources_status_converter.py index 38978c9ab..5651ab487 100644 --- a/converter/tests/cisu/test_resources_status_converter.py +++ b/converter/tests/cisu/test_resources_status_converter.py @@ -1,5 +1,6 @@ import pytest from unittest.mock import patch +import pytest from converter.cisu.resources_status.resources_status_converter import ( ResourcesStatusConverter, @@ -75,3 +76,21 @@ def test_from_rs_to_cisu_no_rs_ri(): ): with pytest.raises(ValueError, match="No RS-RI found for caseId"): ResourcesStatusConverter.from_rs_to_cisu(rs_sr_new) + + +def test_from_rs_to_cisu_resource_not_in_rs_ri(): + unknown_resource_id = "fr.fire.sis076.cgo-076.resource.UNKNOWN_VLM" + rs_sr = make_rs_sr(_CASE_ID, unknown_resource_id, "ARRIVEE") + rs_ri = make_rs_ri(_CASE_ID) # RS-RI only has VLM1 and VLM2 + + with ( + patch( + "converter.cisu.resources_status.resources_status_converter.get_last_rs_ri_by_case_id", + return_value=persisted(rs_ri), + ), + pytest.raises( + ValueError, + match=f"Resource '{unknown_resource_id}' from RS-SR not found in RS-RI for caseId '{_CASE_ID}'", + ), + ): + ResourcesStatusConverter.from_rs_to_cisu(rs_sr) From 7c9ca3bf0d8f5a31ed717e6e6cd89f244d25ef63 Mon Sep 17 00:00:00 2001 From: Issam Kadar Date: Fri, 10 Apr 2026 11:04:38 +0200 Subject: [PATCH 3/4] feat/tnr : format code --- .../resources_status/resources_status_converter.py | 13 ++++++++++--- .../tests/cisu/test_resources_status_converter.py | 9 ++++----- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/converter/converter/cisu/resources_status/resources_status_converter.py b/converter/converter/cisu/resources_status/resources_status_converter.py index 3b02bfac7..5a4add0aa 100644 --- a/converter/converter/cisu/resources_status/resources_status_converter.py +++ b/converter/converter/cisu/resources_status/resources_status_converter.py @@ -39,11 +39,18 @@ def from_rs_to_cisu( if rs_ri_msg is None: raise ValueError(f"No RS-RI found for caseId: {case_id!r}") - resource_id = get_field_value(current_use_case, ResourcesStatusConstants.RESOURCE_ID) + resource_id = get_field_value( + current_use_case, ResourcesStatusConstants.RESOURCE_ID + ) rs_ri = rs_ri_msg.payload rs_ri_content = ResourcesInfoCISUConverter.copy_rs_input_use_case_content(rs_ri) - resources = get_field_value(rs_ri_content, ResourcesInfoCISUConstants.RESOURCE_PATH) or [] - resource_ids_in_rs_ri = {r.get(ResourcesInfoCISUConstants.RESOURCE_ID_KEY) for r in resources} + resources = ( + get_field_value(rs_ri_content, ResourcesInfoCISUConstants.RESOURCE_PATH) + or [] + ) + resource_ids_in_rs_ri = { + r.get(ResourcesInfoCISUConstants.RESOURCE_ID_KEY) for r in resources + } if resource_id not in resource_ids_in_rs_ri: raise ValueError( diff --git a/converter/tests/cisu/test_resources_status_converter.py b/converter/tests/cisu/test_resources_status_converter.py index 5651ab487..e6b61c543 100644 --- a/converter/tests/cisu/test_resources_status_converter.py +++ b/converter/tests/cisu/test_resources_status_converter.py @@ -1,6 +1,5 @@ import pytest from unittest.mock import patch -import pytest from converter.cisu.resources_status.resources_status_converter import ( ResourcesStatusConverter, @@ -80,13 +79,13 @@ def test_from_rs_to_cisu_no_rs_ri(): def test_from_rs_to_cisu_resource_not_in_rs_ri(): unknown_resource_id = "fr.fire.sis076.cgo-076.resource.UNKNOWN_VLM" - rs_sr = make_rs_sr(_CASE_ID, unknown_resource_id, "ARRIVEE") - rs_ri = make_rs_ri(_CASE_ID) # RS-RI only has VLM1 and VLM2 + rs_sr = make_rs_sr_from_sample(_CASE_ID, unknown_resource_id, "ARRIVEE") + rs_ri = make_rs_ri_from_sample(_CASE_ID) with ( patch( - "converter.cisu.resources_status.resources_status_converter.get_last_rs_ri_by_case_id", - return_value=persisted(rs_ri), + _PATCH_GET_RS_MESSAGES, + return_value=persisted_rs_ri_and_rs_sr(rs_ri, []), ), pytest.raises( ValueError, From 478a2f2077ca54903823032a8b03b31f6ec1e44d Mon Sep 17 00:00:00 2001 From: Issam Kadar Date: Wed, 15 Apr 2026 15:15:36 +0200 Subject: [PATCH 4/4] feat/converter : refacto --- .../resources_status_converter.py | 38 +++++++++++-------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/converter/converter/cisu/resources_status/resources_status_converter.py b/converter/converter/cisu/resources_status/resources_status_converter.py index 5a4add0aa..9bad91d53 100644 --- a/converter/converter/cisu/resources_status/resources_status_converter.py +++ b/converter/converter/cisu/resources_status/resources_status_converter.py @@ -39,10 +39,31 @@ def from_rs_to_cisu( if rs_ri_msg is None: raise ValueError(f"No RS-RI found for caseId: {case_id!r}") + rs_ri = rs_ri_msg.payload + cls.check_resource_belongs_to_case(rs_ri, current_use_case) + + rs_sr_use_cases = [ + cls.copy_rs_input_use_case_content(pm.payload) for pm in persisted_rs_sr + ] + rs_sr_use_cases.append(current_use_case) + + output_json = ResourcesInfoCISUConverter.copy_rs_input_content(rs_ri) + rs_ri_use_case = ResourcesInfoCISUConverter.copy_rs_input_use_case_content( + rs_ri + ) + enriched = enrich_rs_ri_with_rs_srs(rs_ri_use_case, rs_sr_use_cases) + + return ResourcesInfoCISUConverter.convert_single_rs_ri(output_json, enriched) + + @classmethod + def check_resource_belongs_to_case( + cls, rs_ri: Dict[str, Any], rs_sr_use_case: Dict[str, Any] + ) -> None: + case_id = get_field_value(rs_sr_use_case, ResourcesStatusConstants.CASE_ID) resource_id = get_field_value( - current_use_case, ResourcesStatusConstants.RESOURCE_ID + rs_sr_use_case, ResourcesStatusConstants.RESOURCE_ID ) - rs_ri = rs_ri_msg.payload + rs_ri_content = ResourcesInfoCISUConverter.copy_rs_input_use_case_content(rs_ri) resources = ( get_field_value(rs_ri_content, ResourcesInfoCISUConstants.RESOURCE_PATH) @@ -56,16 +77,3 @@ def from_rs_to_cisu( raise ValueError( f"Resource '{resource_id}' from RS-SR not found in RS-RI for caseId '{case_id}'" ) - - rs_sr_use_cases = [ - cls.copy_rs_input_use_case_content(pm.payload) for pm in persisted_rs_sr - ] - rs_sr_use_cases.append(current_use_case) - - output_json = ResourcesInfoCISUConverter.copy_rs_input_content(rs_ri) - rs_ri_use_case = ResourcesInfoCISUConverter.copy_rs_input_use_case_content( - rs_ri - ) - enriched = enrich_rs_ri_with_rs_srs(rs_ri_use_case, rs_sr_use_cases) - - return ResourcesInfoCISUConverter.convert_single_rs_ri(output_json, enriched)