From 1057db1d73397eca4f2aa400ad69724be9b711da Mon Sep 17 00:00:00 2001 From: vitor-aignosi Date: Thu, 12 Jun 2025 09:06:31 -0300 Subject: [PATCH] SIENTIAPDE-1100 Improve error handling in OPC activities; raise exceptions instead of logging errors and add data type validation in OpcRepository --- laborious/activities/opc.py | 2 +- laborious/utils/repository/opc_repository.py | 9 +++++++ tests/laborious/activities/test_opc.py | 26 ++++++++++++-------- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/laborious/activities/opc.py b/laborious/activities/opc.py index 11cd77c..ee3b905 100644 --- a/laborious/activities/opc.py +++ b/laborious/activities/opc.py @@ -63,7 +63,7 @@ class OPC(BaseActivity): level=NotificationLevel.ERROR, attachment_content=trace ) - self.logger.error(trace) + raise e @activity.defn(name='write_opc_data') async def write_opc_data(self, input_data: dict[str, Any]): diff --git a/laborious/utils/repository/opc_repository.py b/laborious/utils/repository/opc_repository.py index cafcc41..4f46b71 100644 --- a/laborious/utils/repository/opc_repository.py +++ b/laborious/utils/repository/opc_repository.py @@ -218,6 +218,15 @@ class OpcRepository(): self.error_count += 1 return + if data_type not in data_type_map: + self.notification_handler.build_and_send_notification( + notification_id=f"OPC_WRITE_DATA_TYPE_ERROR_{self.name}", + message=f"Unsupported data type: {data_type}", + block="opc_repository", + level=NotificationLevel.ERROR + ) + return + data = data_type_map[data_type]['converter'](value) self.logger.info(f'Writing {data} - {type(data)} to {node}') ua_data = DataValue( diff --git a/tests/laborious/activities/test_opc.py b/tests/laborious/activities/test_opc.py index d012778..3c50733 100644 --- a/tests/laborious/activities/test_opc.py +++ b/tests/laborious/activities/test_opc.py @@ -112,16 +112,22 @@ def test_write_data_success(opc, tag, data_type, data): def test_write_data_exception(opc): opc.opc_repository['server1'].write_data.side_effect = Exception( "Test error") - opc.write_data(server='server1', tag='tag1', data=50, - data_type='int', tag_type='prediction') - opc.notification_handler.build_and_send_notification.assert_called_once_with( - notification_id="WRITE_OPC_PREDICTION_ERROR", - message="Error writing data to OPC server: Test error", - block="write_opc_data", - level=NotificationLevel.ERROR, - attachment_content=ANY - ) - opc.logger.error.assert_called_once() + + try: + opc.write_data(server='server1', tag='tag1', data=50, + data_type='int', tag_type='prediction') + + except Exception: + opc.notification_handler.build_and_send_notification.assert_called_once_with( + notification_id="WRITE_OPC_PREDICTION_ERROR", + message="Error writing data to OPC server: Test error", + block="write_opc_data", + level=NotificationLevel.ERROR, + attachment_content=ANY + ) + + else: + assert False, "Expected an exception to be raised" @mark.asyncio