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