From 1a4e0c5453c98b1fe9a6189a1f5f48574c1e753d Mon Sep 17 00:00:00 2001 From: denpamusic Date: Sat, 25 Jan 2025 04:43:55 +0300 Subject: [PATCH] Improve parameter validation Refactor parameter validation to handle unchanged values and re-add tests for unchanged value scenarios. --- pyplumio/helpers/parameter.py | 7 ++++--- tests/helpers/test_parameter.py | 36 +++++++++++++++++++++++++++------ 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/pyplumio/helpers/parameter.py b/pyplumio/helpers/parameter.py index 00cdaf35..c629e947 100644 --- a/pyplumio/helpers/parameter.py +++ b/pyplumio/helpers/parameter.py @@ -187,9 +187,6 @@ def __copy__(self) -> Parameter: def validate(self, value: ParameterValue) -> int: """Validate a parameter value.""" value = _normalize_parameter_value(value) - if value == self.values.value: - raise ValueError("Parameter value is unchanged.") - if value < self.values.min_value or value > self.values.max_value: raise ValueError( f"Value must be between '{self.min_value}' and '{self.max_value}'" @@ -209,6 +206,10 @@ async def _try_set( self, value: Any, retries: int = 5, timeout: float = 5.0 ) -> bool: """Try to set a parameter value.""" + if value == self.values.value: + # Value is unchanged + return True + self._previous_value = self._values.value self._values.value = value self._pending_update = True diff --git a/tests/helpers/test_parameter.py b/tests/helpers/test_parameter.py index 69c9ebd7..3da414eb 100644 --- a/tests/helpers/test_parameter.py +++ b/tests/helpers/test_parameter.py @@ -113,9 +113,6 @@ async def test_number_validate(number: Number) -> None: """Test the number validation.""" assert number.validate(2) - with pytest.raises(ValueError): - number.validate(1) - with pytest.raises(ValueError): number.validate(6) @@ -135,9 +132,6 @@ async def test_switch_validate(switch: Switch) -> None: """Test the switch validation.""" assert switch.validate(STATE_ON) - with pytest.raises(ValueError): - assert switch.validate(STATE_OFF) - with pytest.raises(ValueError): switch.validate(2) @@ -264,6 +258,36 @@ def test_switch_repr(switch: Switch) -> None: ) +@patch("asyncio.Queue.put") +async def test_number_request_with_unchanged_value( + mock_put, number: Number, bypass_asyncio_sleep, caplog +) -> None: + """Test that a frame doesn't get dispatched if it's value is unchanged.""" + assert not number.pending_update + assert not await number.set(5, retries=3) + assert number.pending_update + assert mock_put.await_count == 3 # type: ignore [unreachable] + mock_put.reset_mock() + assert "Timed out while trying to set 'test_number' parameter" in caplog.text + await number.set(5) + mock_put.assert_not_awaited() + + +@patch("asyncio.Queue.put") +async def test_switch_request_with_unchanged_value( + mock_put, switch: Switch, bypass_asyncio_sleep, caplog +) -> None: + """Test that a frame doesn't get dispatched if it's value is unchanged.""" + assert not switch.pending_update + assert not await switch.set(True, retries=3) + assert switch.pending_update + assert mock_put.await_count == 3 # type: ignore [unreachable] + mock_put.reset_mock() + assert "Timed out while trying to set 'test_switch' parameter" in caplog.text + await switch.set(True) + mock_put.assert_not_awaited() + + @patch("pyplumio.helpers.parameter.Switch.set") async def test_switch_turn_on(mock_set, switch: Switch) -> None: """Test that switch can be turned on."""