From 7f5b474c8a6a65aa762c0b9287a219b80bd0c6d7 Mon Sep 17 00:00:00 2001 From: Andrew Kay Date: Thu, 4 Sep 2025 08:20:25 -0500 Subject: [PATCH] Fix aggregate execution error message --- oec/interface.py | 13 +++++++++---- tests/test_interface.py | 23 ++++++++++++++++++++++- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/oec/interface.py b/oec/interface.py index 9930721..22ec5c3 100644 --- a/oec/interface.py +++ b/oec/interface.py @@ -13,10 +13,15 @@ logger = logging.getLogger(__name__) class ExecuteError(Exception): def __init__(self, errors, responses): - if len(errors) == 1: - message = str(errors[0]) - else: - message = f'{len(errors)} occurred' + if not errors: + raise ValueError('Errors required') + + message = str(errors[0]) or repr(errors[0]) + + if len(errors) == 2: + message += ' and 1 other error' + elif len(errors) > 2: + message += f' and {len(errors) - 1} other errors' super().__init__(message) diff --git a/tests/test_interface.py b/tests/test_interface.py index c6f1a6f..8e2e5f9 100644 --- a/tests/test_interface.py +++ b/tests/test_interface.py @@ -1,7 +1,7 @@ import unittest from unittest.mock import Mock, patch -from coax import ReadAddressCounterHi, ReadAddressCounterLo, ProtocolError +from coax import ReadAddressCounterHi, ReadAddressCounterLo, ProtocolError, ReceiveTimeout, ReceiveError import context @@ -105,3 +105,24 @@ class InterfaceWrapperExecuteTestCase(unittest.TestCase): self.assertIsInstance(error.errors[0], ProtocolError) self.assertEqual(len(error.responses), 2) + +class ExecuteErrorTestCase(unittest.TestCase): + def test_single_str_error(self): + error = ExecuteError([ReceiveError('ReceiveErrorMessage')], []) + + self.assertEqual(str(error), 'ReceiveErrorMessage') + + def test_single_repr_error(self): + error = ExecuteError([ReceiveTimeout()], []) + + self.assertEqual(str(error), 'ReceiveTimeout()') + + def test_multiple_errors_first_str_error(self): + error = ExecuteError([ReceiveError('ReceiveErrorMessage'), ReceiveTimeout()], []) + + self.assertEqual(str(error), 'ReceiveErrorMessage and 1 other error') + + def test_multiple_errors_first_repr_error(self): + error = ExecuteError([ReceiveTimeout(), ReceiveError('ReceiveErrorMessage')], []) + + self.assertEqual(str(error), 'ReceiveTimeout() and 1 other error')