From d86c867c2b0e6c06a9493d07b09621478aa0683f Mon Sep 17 00:00:00 2001 From: Hanne Moa Date: Mon, 18 Mar 2024 09:06:14 +0100 Subject: [PATCH] Handle garbage admstate from server Convert it to AdmState.UNKNOWN --- src/zinolib/event_types.py | 7 +++++++ tests/test_zinolib_controllers_zino1.py | 12 ++++++++++++ tests/test_zinolib_event_types.py | 12 ++++++++++++ 3 files changed, 31 insertions(+) diff --git a/src/zinolib/event_types.py b/src/zinolib/event_types.py index 9623229..be33803 100644 --- a/src/zinolib/event_types.py +++ b/src/zinolib/event_types.py @@ -45,6 +45,13 @@ class AdmState(StrEnum): OPEN = "open" WAITING = "waiting" WORKING = "working" + UNKNOWN = "unknown" + + @classmethod + def _missing_(cls, value): + # Python 3.12: "if not value in cls:" + if not value in cls._value2member_map_: + return cls.UNKNOWN class FlapState(StrEnum): diff --git a/tests/test_zinolib_controllers_zino1.py b/tests/test_zinolib_controllers_zino1.py index 4d98f4c..994c098 100644 --- a/tests/test_zinolib_controllers_zino1.py +++ b/tests/test_zinolib_controllers_zino1.py @@ -106,6 +106,18 @@ def init_manager(self): zino1 = FakeZino1EventManager.configure(None) return zino1 + def test_create_event_from_id_receiving_garbage_admstate_is_safely_handled(self): + global raw_attrlist + zino1 = self.init_manager() + good_attrlist = raw_attrlist[:] # copy + try: + raw_attrlist[0] = "state: garbage admstate" + event = zino1.create_event_from_id(139110) + self.assertEqual(event.adm_state, AdmState.UNKNOWN) + finally: + # reset to known good attrlist for other tests + raw_attrlist = good_attrlist + def test_create_event_from_id_may_get_garabage_data(self): def falsey(_): return False diff --git a/tests/test_zinolib_event_types.py b/tests/test_zinolib_event_types.py index d9b46bf..15e8838 100644 --- a/tests/test_zinolib_event_types.py +++ b/tests/test_zinolib_event_types.py @@ -252,3 +252,15 @@ def test_set_log_for_event(self): }] updated_event = event_manager.set_log_for_event(event, log_list) self.assertTrue(event_manager.events[event.id].log) + + +class AdmStateTest(unittest.TestCase): + + def test_golden_path(self): + for state in AdmState: + enum_state = AdmState(state) + self.assertEqual(enum_state.value, state) + + def test_garbage_input_should_be_converted_to_UNKNOWN(self): + value = AdmState("random garbage") + self.assertEqual(value, AdmState.UNKNOWN)