From e054e4da1bc89e505d066c8f749bc599e50d1c64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20Skytt=C3=A4?= <ville.skytta@iki.fi> Date: Sat, 15 Sep 2018 10:42:36 +0300 Subject: [PATCH] Small huawei_lte improvements (#16626) * Add bunch of RouterData tests * Avoid raising AttributeError from RouterData.__getitem__ * Use new style string formatting * Use {key: value} instead of dict(key=value) --- homeassistant/components/huawei_lte.py | 8 +++- homeassistant/components/sensor/huawei_lte.py | 2 +- tests/components/huawei_lte.py | 48 +++++++++++++++++++ 3 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 tests/components/huawei_lte.py diff --git a/homeassistant/components/huawei_lte.py b/homeassistant/components/huawei_lte.py index 268289d2bf5..33da6be56db 100644 --- a/homeassistant/components/huawei_lte.py +++ b/homeassistant/components/huawei_lte.py @@ -55,8 +55,12 @@ class RouterData: such as device_information, device_signal etc, and the remaining path points to a value in the member's data structure. """ - cat, *path_ = path.split(".") - return reduce(operator.getitem, path_, getattr(self, cat)) + root, *rest = path.split(".") + try: + data = getattr(self, root) + except AttributeError as err: + raise KeyError from err + return reduce(operator.getitem, rest, data) @Throttle(MIN_TIME_BETWEEN_UPDATES) def update(self) -> None: diff --git a/homeassistant/components/sensor/huawei_lte.py b/homeassistant/components/sensor/huawei_lte.py index d73472a705b..f5a21999ab8 100644 --- a/homeassistant/components/sensor/huawei_lte.py +++ b/homeassistant/components/sensor/huawei_lte.py @@ -113,7 +113,7 @@ class HuaweiLteSensor(Entity): @property def unique_id(self) -> str: """Return unique ID for sensor.""" - return "%s_%s" % ( + return "{}_{}".format( self.path, self.data["device_information.SerialNumber"], ) diff --git a/tests/components/huawei_lte.py b/tests/components/huawei_lte.py new file mode 100644 index 00000000000..0fe803208ff --- /dev/null +++ b/tests/components/huawei_lte.py @@ -0,0 +1,48 @@ +"""Huawei LTE component tests.""" +import pytest + +from homeassistant.components import huawei_lte + + +@pytest.fixture(autouse=True) +def routerdata(): + """Set up a router data for testing.""" + rd = huawei_lte.RouterData(None) + rd.device_information = { + 'SoftwareVersion': '1.0', + 'nested': {'foo': 'bar'}, + } + return rd + + +async def test_routerdata_get_nonexistent_root(routerdata): + """Test that accessing a nonexistent root element raises KeyError.""" + with pytest.raises(KeyError): # NOT AttributeError + routerdata["nonexistent_root.foo"] + + +async def test_routerdata_get_nonexistent_leaf(routerdata): + """Test that accessing a nonexistent leaf element raises KeyError.""" + with pytest.raises(KeyError): + routerdata["device_information.foo"] + + +async def test_routerdata_get_nonexistent_leaf_path(routerdata): + """Test that accessing a nonexistent long path raises KeyError.""" + with pytest.raises(KeyError): + routerdata["device_information.long.path.foo"] + + +async def test_routerdata_get_simple(routerdata): + """Test that accessing a short, simple path works.""" + assert routerdata["device_information.SoftwareVersion"] == "1.0" + + +async def test_routerdata_get_longer(routerdata): + """Test that accessing a longer path works.""" + assert routerdata["device_information.nested.foo"] == "bar" + + +async def test_routerdata_get_dict(routerdata): + """Test that returning an intermediate dict works.""" + assert routerdata["device_information.nested"] == {'foo': 'bar'} -- GitLab