Skip to content

Commit 42a24cf

Browse files
committed
Re-add removed test
Also add some support metods to check if a value is a valid XML Enum value
1 parent a828e22 commit 42a24cf

4 files changed

Lines changed: 42 additions & 7 deletions

File tree

deebot_client/commands/xml/fan_speed.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@ def _handle_xml(cls, event_bus: EventBus, xml: Element) -> HandlingResult:
2727
2828
:return: A message response
2929
"""
30-
if xml.attrib.get("ret") != "ok" or not (speed := xml.attrib.get("speed")):
30+
if (
31+
xml.attrib.get("ret") != "ok"
32+
or not (speed := xml.attrib.get("speed"))
33+
or not FanSpeedLevel.is_valid_xml_value(speed)
34+
):
3135
return HandlingResult.analyse()
3236

3337
event_bus.notify(FanSpeedEvent(FanSpeedLevel.from_xml(speed)))

deebot_client/util/enum.py

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,26 @@ def __new__(cls, value: str, xml_value: str | None = None) -> Self:
1919
return obj
2020

2121
@classmethod
22-
def from_xml(cls, value: str | None) -> Self:
23-
"""Convert from xml value."""
22+
def _from_xml(cls, value: str | None) -> Self | None:
23+
"""Convert from xml value, returning None if the value is not supported."""
2424
if value:
2525
for member in cls:
2626
if member.xml_value == value:
2727
return member
28+
return None
29+
30+
@classmethod
31+
def is_valid_xml_value(cls, value: str | None) -> bool:
32+
"""Convert from xml value."""
33+
result = cls._from_xml(value)
34+
return result is not None
35+
36+
@classmethod
37+
def from_xml(cls, value: str | None) -> Self:
38+
"""Convert from xml value."""
39+
result = cls._from_xml(value)
40+
if result is not None:
41+
return result
2842

2943
msg = f"{value} is not a valid {cls.__name__}"
3044
raise ValueError(msg)
@@ -43,12 +57,26 @@ def __new__(cls, value: int, xml_value: str | None = None) -> Self:
4357
return obj
4458

4559
@classmethod
46-
def from_xml(cls, value: str | None) -> Self:
47-
"""Convert from xml value."""
60+
def _from_xml(cls, value: str | None) -> Self | None:
61+
"""Convert from xml value, returning None if the value is not supported."""
4862
if value:
4963
for member in cls:
5064
if member.xml_value == value:
5165
return member
66+
return None
67+
68+
@classmethod
69+
def is_valid_xml_value(cls, value: str | None) -> bool:
70+
"""Convert from xml value."""
71+
result = cls._from_xml(value)
72+
return result is not None
73+
74+
@classmethod
75+
def from_xml(cls, value: str | None) -> Self:
76+
"""Convert from xml value."""
77+
result = cls._from_xml(value)
78+
if result is not None:
79+
return result
5280

5381
msg = f"{value} is not a valid {cls.__name__}"
5482
raise ValueError(msg)

tests/commands/xml/test_fan_speed.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ async def test_get_fan_speed(speed: str, expected_event: Event) -> None:
4141

4242
@pytest.mark.parametrize(
4343
"xml",
44-
["<ctl ret='error'/>"],
45-
ids=["error"],
44+
["<ctl ret='error'/>", "<ctl ret='ok' />", "<ctl ret='ok' speed='invalid'/>"],
45+
ids=["error", "no_state", "invalid_speed"],
4646
)
4747
async def test_get_fan_speed_error(xml: str) -> None:
4848
json = get_request_xml(xml)

tests/util/test_enum.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ class _TestStrEnumWithXml(StrEnumWithXml):
1313

1414
def assert_self_conversion(self) -> None:
1515
assert self == _TestStrEnumWithXml(self.value)
16+
assert _TestStrEnumWithXml.is_valid_xml_value(self.xml_value) is True
1617
assert self == _TestStrEnumWithXml.from_xml(self.xml_value)
1718

1819

@@ -22,6 +23,7 @@ class _TestIntEnumWithXml(IntEnumWithXml):
2223

2324
def assert_self_conversion(self) -> None:
2425
assert self == _TestIntEnumWithXml(self.value)
26+
assert _TestIntEnumWithXml.is_valid_xml_value(self.xml_value) is True
2527
assert self == _TestIntEnumWithXml.from_xml(self.xml_value)
2628

2729

@@ -49,5 +51,6 @@ def test_EnumWithXml_conversion(
4951
def test_EnumWithXml_invalid_value(
5052
test_enum_cls: type[T], invalid_value: str | None
5153
) -> None:
54+
assert test_enum_cls.is_valid_xml_value(invalid_value) is False
5255
with pytest.raises(ValueError, match=str(invalid_value)):
5356
test_enum_cls.from_xml(invalid_value)

0 commit comments

Comments
 (0)