diff --git a/homeassistant/components/huawei_lte.py b/homeassistant/components/huawei_lte.py index 268289d2bf5146c4924a2fac1565c4850ca90b4b..33da6be56db4e2985d6600ba8fde5f96bb22d5c7 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 d73472a705b7a15534a2346aa60b5c0bd99a4c2a..f5a21999ab80bcada3dc4e3c604f03c2096f928f 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 0000000000000000000000000000000000000000..0fe803208ffb38f2353a1959caa3eba430c94e53 --- /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'}