Skip to content

Commit 5f40cfb

Browse files
authored
Merge pull request #416 from ansforge/feat/cisu_version_conversion_strategy
feat(converter): cisu version conversion strategy (v3 <-> vactive)
2 parents 248fdf7 + 026624d commit 5f40cfb

9 files changed

Lines changed: 270 additions & 20 deletions
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
from typing import Any, Dict
2+
3+
from converter.conversion_mixin import ConversionMixin
4+
from converter.cisu_transcoders.constants import CISUConstants
5+
6+
7+
class BaseCISUVersionConverter(ConversionMixin):
8+
def __init__(self):
9+
raise ValueError(
10+
"BaseCISUVersionConverter is an abstract class and cannot be instantiated directly. Use a subclass instead."
11+
)
12+
13+
@classmethod
14+
def convert_v3_to_vactive(cls, edxl_json: Dict[str, Any]) -> Dict[str, Any]:
15+
raise NotImplementedError("convert_v3_to_vactive not implemented yet.")
16+
17+
@classmethod
18+
def convert_vactive_to_v3(cls, edxl_json: Dict[str, Any]) -> Dict[str, Any]:
19+
raise NotImplementedError("convert_vactive_to_v3 not implemented yet.")
20+
21+
@classmethod
22+
def get_message_type(cls) -> str:
23+
raise NotImplementedError(
24+
"Subclasses must implement this method to return the message type in RS specifications."
25+
)
26+
27+
@classmethod
28+
def convert(
29+
cls, source_version: str, target_version: str, edxl_json: Dict[str, Any]
30+
):
31+
if (
32+
source_version == CISUConstants.CISU_EXPECTED_MODEL_VERSION
33+
and target_version
34+
== CISUConstants.HEALTH_EXPECTED_VERSION_FOR_CISU_CONVERSION
35+
):
36+
return cls.convert_vactive_to_v3(edxl_json)
37+
elif (
38+
source_version == CISUConstants.HEALTH_EXPECTED_VERSION_FOR_CISU_CONVERSION
39+
and target_version == CISUConstants.CISU_EXPECTED_MODEL_VERSION
40+
):
41+
return cls.convert_v3_to_vactive(edxl_json)
42+
else:
43+
raise ValueError(
44+
f"CISU version conversion from '{source_version}' to '{target_version}' for message type '{cls.get_message_type()}' is currently not implemented."
45+
)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from converter.cisu_version_converters.identical_cisu_version_converter import (
2+
IdenticalCISUVersionConverter,
3+
)
4+
5+
6+
class CreateCaseVersionConverter(IdenticalCISUVersionConverter):
7+
@classmethod
8+
def get_message_type(cls) -> str:
9+
return "createCase"
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from typing import Dict, Any
2+
3+
from converter.cisu_version_converters.base_cisu_version_converter import (
4+
BaseCISUVersionConverter,
5+
)
6+
7+
8+
class IdenticalCISUVersionConverter(BaseCISUVersionConverter):
9+
@classmethod
10+
def convert_v3_to_vactive(cls, edxl_json) -> Dict[str, Any]:
11+
return edxl_json
12+
13+
@classmethod
14+
def convert_vactive_to_v3(cls, edxl_json: Dict[str, Any]) -> Dict[str, Any]:
15+
return edxl_json
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from converter.cisu_version_converters.identical_cisu_version_converter import (
2+
IdenticalCISUVersionConverter,
3+
)
4+
5+
6+
class ResourcesInfoCISUVersionConverter(IdenticalCISUVersionConverter):
7+
@classmethod
8+
def get_message_type(cls) -> str:
9+
return "resourcesInfoCisu"
Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,43 @@
11
import logging
2+
from converter.cisu_version_converters.create_case.rc_eda_version_converter import (
3+
CreateCaseVersionConverter,
4+
)
5+
from converter.cisu_version_converters.resources_info_cisu.resources_info_cisu_version_converter import (
6+
ResourcesInfoCISUVersionConverter,
7+
)
8+
from converter.utils import (
9+
extract_message_type_from_message_content,
10+
extract_message_content,
11+
)
12+
from converter.cisu_version_converters.identical_cisu_version_converter import (
13+
IdenticalCISUVersionConverter,
14+
)
215

316
logger = logging.getLogger(__name__)
417

518

619
def cisu_version_conversion_strategy(edxl_json, source_version, target_version):
720
logger.info(f"CISU Conversion initiated from {source_version} to {target_version}")
821

9-
raise NotImplementedError(
10-
"Conversion strategy 'cisu_version_conversion_strategy' not yet implemented."
11-
)
22+
message_content = extract_message_content(edxl_json)
23+
selected_strategy = select_conversion_strategy(message_content)
24+
25+
return selected_strategy.convert(source_version, target_version, edxl_json)
26+
27+
28+
def select_conversion_strategy(message_content):
29+
if "createCase" in message_content:
30+
return CreateCaseVersionConverter
31+
elif "resourcesInfoCisu" in message_content:
32+
return ResourcesInfoCISUVersionConverter
33+
elif "reference" in message_content:
34+
return IdenticalCISUVersionConverter
35+
elif "error" in message_content:
36+
return IdenticalCISUVersionConverter
37+
else:
38+
deducted_message_type = extract_message_type_from_message_content(
39+
message_content
40+
)
41+
raise ValueError(
42+
f"CISU Version conversion for message type '{deducted_message_type}' is not implemented."
43+
)
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import unittest
2+
3+
from converter.cisu_version_converters.create_case.rc_eda_version_converter import (
4+
CreateCaseVersionConverter,
5+
)
6+
from tests.constants import TestConstants
7+
from tests.test_helpers import TestHelper
8+
9+
10+
class TestCreateCaseVersionConverter(unittest.TestCase):
11+
def setUp(self):
12+
self.edxl_envelope_health_to_fire_path = (
13+
TestConstants.EDXL_HEALTH_TO_FIRE_ENVELOPE_PATH
14+
)
15+
self.edxl_envelope_fire_to_health_path = (
16+
TestConstants.EDXL_FIRE_TO_HEALTH_ENVELOPE_PATH
17+
)
18+
self.fixtures_folder_path = "tests/fixtures/"
19+
self.converter = CreateCaseVersionConverter
20+
21+
def test_v3_to_vactive(self):
22+
message = TestHelper.create_edxl_json_from_sample(
23+
self.edxl_envelope_health_to_fire_path,
24+
self.fixtures_folder_path + "RC-EDA/RC-EDA_exhaustive_fill.json",
25+
)
26+
converted_message = self.converter.convert_v3_to_vactive(message)
27+
assert converted_message == message
28+
29+
def test_vactive_to_v3(self):
30+
message = TestHelper.create_edxl_json_from_sample(
31+
self.edxl_envelope_fire_to_health_path,
32+
self.fixtures_folder_path + "RC-EDA/RC-EDA_exhaustive_fill.json",
33+
)
34+
converted_message = self.converter.convert_vactive_to_v3(message)
35+
assert converted_message == message
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import unittest
2+
3+
from converter.cisu_version_converters.resources_info_cisu.resources_info_cisu_version_converter import (
4+
ResourcesInfoCISUVersionConverter,
5+
)
6+
from tests.constants import TestConstants
7+
from tests.test_helpers import TestHelper
8+
9+
10+
class TestResourceInfoCisuVersionConverter(unittest.TestCase):
11+
def setUp(self):
12+
self.edxl_envelope_health_to_fire_path = (
13+
TestConstants.EDXL_HEALTH_TO_FIRE_ENVELOPE_PATH
14+
)
15+
self.edxl_envelope_fire_to_health_path = (
16+
TestConstants.EDXL_FIRE_TO_HEALTH_ENVELOPE_PATH
17+
)
18+
self.fixtures_folder_path = "tests/fixtures/"
19+
self.converter = ResourcesInfoCISUVersionConverter
20+
21+
def test_v3_to_vactive(self):
22+
message = TestHelper.create_edxl_json_from_sample(
23+
self.edxl_envelope_health_to_fire_path,
24+
self.fixtures_folder_path + "RC-RI/RC-RI_V3.0_exhaustive_fill.json",
25+
)
26+
converted_message = self.converter.convert_v3_to_vactive(message)
27+
assert converted_message == message
28+
29+
def test_vactive_to_v3(self):
30+
message = TestHelper.create_edxl_json_from_sample(
31+
self.edxl_envelope_fire_to_health_path,
32+
self.fixtures_folder_path + "RC-RI/RC-RI_V3.0_exhaustive_fill.json",
33+
)
34+
converted_message = self.converter.convert_vactive_to_v3(message)
35+
assert converted_message == message
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import unittest
2+
from unittest.mock import patch, ANY
3+
4+
from converter.cisu_transcoders.constants import CISUConstants
5+
from converter.conversion_strategy.cisu_version_conversion_strategy import (
6+
cisu_version_conversion_strategy,
7+
)
8+
from tests.constants import TestConstants
9+
from tests.test_helpers import TestHelper
10+
11+
V3 = CISUConstants.HEALTH_EXPECTED_VERSION_FOR_CISU_CONVERSION
12+
VACTIVE = CISUConstants.CISU_EXPECTED_MODEL_VERSION
13+
14+
15+
class TestCisuVersionConversionStrategy(unittest.TestCase):
16+
@staticmethod
17+
def run_v3_to_vactive_cisu_version_conversion_strategy(message_type: str) -> None:
18+
message_json_path = TestHelper.get_json_files(message_type)[0]["path"]
19+
edxl_json = TestHelper.create_edxl_json_from_sample(
20+
TestConstants.EDXL_HEALTH_TO_FIRE_ENVELOPE_PATH, message_json_path
21+
)
22+
cisu_version_conversion_strategy(edxl_json, V3, VACTIVE)
23+
24+
@staticmethod
25+
def run_vactive_to_v3_cisu_version_conversion_strategy(message_type: str) -> None:
26+
message_json_path = TestHelper.get_json_files(message_type)[0]["path"]
27+
edxl_json = TestHelper.create_edxl_json_from_sample(
28+
TestConstants.EDXL_FIRE_TO_HEALTH_ENVELOPE_PATH, message_json_path
29+
)
30+
cisu_version_conversion_strategy(edxl_json, VACTIVE, V3)
31+
32+
def test_cisu_version_conversion_strategy_raise_error_when_converting_unsupported_message_type(
33+
self,
34+
):
35+
edxl_json = {
36+
"content": [
37+
{
38+
"jsonContent": {
39+
"embeddedJsonContent": {
40+
"message": {"notSupportedMessageType": {}}
41+
}
42+
}
43+
}
44+
],
45+
"senderID": "senderId",
46+
"descriptor": {"explicitAddress": {"explicitAddressValue": "recipientId"}},
47+
}
48+
49+
with self.assertRaisesRegex(
50+
ValueError,
51+
"CISU Version conversion for message type 'notSupportedMessageType' is not implemented.",
52+
):
53+
cisu_version_conversion_strategy(edxl_json, V3, VACTIVE)
54+
55+
@patch(
56+
"converter.conversion_strategy.cisu_version_conversion_strategy.CreateCaseVersionConverter.convert"
57+
)
58+
def test_create_case_v3_to_vactive(self, mock_convert):
59+
self.run_v3_to_vactive_cisu_version_conversion_strategy(
60+
TestConstants.RC_EDA_TAG
61+
)
62+
63+
mock_convert.assert_called_once_with(V3, VACTIVE, ANY)
64+
65+
@patch(
66+
"converter.conversion_strategy.cisu_version_conversion_strategy.CreateCaseVersionConverter.convert"
67+
)
68+
def test_create_case_vactive_to_v3(self, mock_convert):
69+
self.run_vactive_to_v3_cisu_version_conversion_strategy(
70+
TestConstants.RC_EDA_TAG
71+
)
72+
73+
mock_convert.assert_called_once_with(VACTIVE, V3, ANY)
74+
75+
@patch(
76+
"converter.conversion_strategy.cisu_version_conversion_strategy.ResourcesInfoCISUVersionConverter.convert"
77+
)
78+
def test_resources_info_cisu_v3_to_vactive(self, mock_convert):
79+
self.run_v3_to_vactive_cisu_version_conversion_strategy(TestConstants.RC_RI_TAG)
80+
mock_convert.assert_called_once_with(V3, VACTIVE, ANY)
81+
82+
@patch(
83+
"converter.conversion_strategy.cisu_version_conversion_strategy.ResourcesInfoCISUVersionConverter.convert"
84+
)
85+
def test_resources_info_cisu_vactive_to_v3(self, mock_convert):
86+
self.run_vactive_to_v3_cisu_version_conversion_strategy(TestConstants.RC_RI_TAG)
87+
mock_convert.assert_called_once_with(VACTIVE, V3, ANY)

converter/tests/conversion_strategy/test_conversion_strategy.py

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import unittest
22
from unittest.mock import patch
3-
import pytest
43
from converter.conversion_strategy.conversion_strategy import conversion_strategy
54
from converter.constants import ConversionType
65

@@ -40,22 +39,6 @@ def test_conversion_strategy_with_health_conversion(
4039
edxl_json, source_version, target_version
4140
)
4241

43-
def test_conversion_strategy_with_cisu_version_conversion_raises_not_implemented(
44-
self,
45-
):
46-
edxl_json = {}
47-
source_version = "source_version"
48-
target_version = "target_version"
49-
conversion_type = ConversionType.CISUVersionConversion
50-
51-
with pytest.raises(
52-
NotImplementedError,
53-
match="Conversion strategy 'cisu_version_conversion_strategy' not yet implemented.",
54-
):
55-
conversion_strategy(
56-
edxl_json, source_version, target_version, conversion_type
57-
)
58-
5942
@patch(
6043
"converter.conversion_strategy.conversion_strategy.health_version_conversion_strategy"
6144
)

0 commit comments

Comments
 (0)