Add tests for Fritz!Tools sensors (#67776)

This commit is contained in:
Michael 2022-03-30 01:54:16 +02:00 committed by GitHub
parent 94c5dbfd16
commit 3d64d1b76b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 165 additions and 9 deletions

View File

@ -400,7 +400,6 @@ omit =
homeassistant/components/fritz/common.py homeassistant/components/fritz/common.py
homeassistant/components/fritz/const.py homeassistant/components/fritz/const.py
homeassistant/components/fritz/device_tracker.py homeassistant/components/fritz/device_tracker.py
homeassistant/components/fritz/sensor.py
homeassistant/components/fritz/services.py homeassistant/components/fritz/services.py
homeassistant/components/fritz/switch.py homeassistant/components/fritz/switch.py
homeassistant/components/fritzbox_callmonitor/__init__.py homeassistant/components/fritzbox_callmonitor/__init__.py

View File

@ -308,14 +308,13 @@ class FritzBoxSensor(FritzBoxBaseEntity, SensorEntity):
"""Update data.""" """Update data."""
_LOGGER.debug("Updating FRITZ!Box sensors") _LOGGER.debug("Updating FRITZ!Box sensors")
status: FritzStatus = self._avm_wrapper.fritz_status
try: try:
status: FritzStatus = self._avm_wrapper.fritz_status self._attr_native_value = (
self._attr_available = True self._last_device_value
) = self.entity_description.value_fn(status, self._last_device_value)
except FritzConnectionException: except FritzConnectionException:
_LOGGER.error("Error getting the state from the FRITZ!Box", exc_info=True) _LOGGER.error("Error getting the state from the FRITZ!Box", exc_info=True)
self._attr_available = False self._attr_available = False
return return
self._attr_available = True
self._attr_native_value = (
self._last_device_value
) = self.entity_description.value_fn(status, self._last_device_value)

View File

@ -1,6 +1,6 @@
"""Common stuff for AVM Fritz!Box tests.""" """Common stuff for AVM Fritz!Box tests."""
import logging import logging
from unittest.mock import patch from unittest.mock import MagicMock, patch
from fritzconnection.core.processor import Service from fritzconnection.core.processor import Service
from fritzconnection.lib.fritzhosts import FritzHosts from fritzconnection.lib.fritzhosts import FritzHosts
@ -25,7 +25,7 @@ class FritzConnectionMock: # pylint: disable=too-few-public-methods
"""FritzConnection mocking.""" """FritzConnection mocking."""
def __init__(self, services): def __init__(self, services):
"""Inint Mocking class.""" """Init Mocking class."""
self.modelname = MOCK_MODELNAME self.modelname = MOCK_MODELNAME
self.call_action = self._call_action self.call_action = self._call_action
self._services = services self._services = services
@ -36,6 +36,13 @@ class FritzConnectionMock: # pylint: disable=too-few-public-methods
LOGGER.debug("-" * 80) LOGGER.debug("-" * 80)
LOGGER.debug("FritzConnectionMock - services: %s", self.services) LOGGER.debug("FritzConnectionMock - services: %s", self.services)
def call_action_side_effect(self, side_effect=None) -> None:
"""Set or unset a side_effect for call_action."""
if side_effect is not None:
self.call_action = MagicMock(side_effect=side_effect)
else:
self.call_action = self._call_action
def _call_action(self, service: str, action: str, **kwargs): def _call_action(self, service: str, action: str, **kwargs):
LOGGER.debug( LOGGER.debug(
"_call_action service: %s, action: %s, **kwargs: %s", "_call_action service: %s, action: %s, **kwargs: %s",

View File

@ -0,0 +1,151 @@
"""Tests for Shelly button platform."""
from __future__ import annotations
from datetime import timedelta
from typing import Any
from fritzconnection.core.exceptions import FritzConnectionException
from homeassistant.components.fritz.const import DOMAIN
from homeassistant.components.fritz.sensor import SENSOR_TYPES
from homeassistant.components.sensor import (
ATTR_STATE_CLASS,
DEVICE_CLASS_TIMESTAMP,
DOMAIN as SENSOR_DOMAIN,
STATE_CLASS_MEASUREMENT,
STATE_CLASS_TOTAL_INCREASING,
)
from homeassistant.config_entries import ConfigEntryState
from homeassistant.const import (
ATTR_DEVICE_CLASS,
ATTR_ICON,
ATTR_STATE,
ATTR_UNIT_OF_MEASUREMENT,
STATE_UNAVAILABLE,
)
from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component
import homeassistant.util.dt as dt_util
from .const import MOCK_USER_DATA
from tests.common import MockConfigEntry, async_fire_time_changed
SENSOR_STATES: dict[str, dict[str, Any]] = {
"sensor.mock_title_external_ip": {
ATTR_STATE: "1.2.3.4",
ATTR_ICON: "mdi:earth",
},
"sensor.mock_title_device_uptime": {
# ATTR_STATE: "2022-02-05T17:46:04+00:00",
ATTR_DEVICE_CLASS: DEVICE_CLASS_TIMESTAMP,
},
"sensor.mock_title_connection_uptime": {
# ATTR_STATE: "2022-03-06T11:27:16+00:00",
ATTR_DEVICE_CLASS: DEVICE_CLASS_TIMESTAMP,
},
"sensor.mock_title_upload_throughput": {
ATTR_STATE: "3.4",
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
ATTR_UNIT_OF_MEASUREMENT: "kB/s",
ATTR_ICON: "mdi:upload",
},
"sensor.mock_title_download_throughput": {
ATTR_STATE: "67.6",
ATTR_STATE_CLASS: STATE_CLASS_MEASUREMENT,
ATTR_UNIT_OF_MEASUREMENT: "kB/s",
ATTR_ICON: "mdi:download",
},
"sensor.mock_title_max_connection_upload_throughput": {
ATTR_STATE: "2105.0",
ATTR_UNIT_OF_MEASUREMENT: "kbit/s",
ATTR_ICON: "mdi:upload",
},
"sensor.mock_title_max_connection_download_throughput": {
ATTR_STATE: "10087.0",
ATTR_UNIT_OF_MEASUREMENT: "kbit/s",
ATTR_ICON: "mdi:download",
},
"sensor.mock_title_gb_sent": {
ATTR_STATE: "1.7",
ATTR_STATE_CLASS: STATE_CLASS_TOTAL_INCREASING,
ATTR_UNIT_OF_MEASUREMENT: "GB",
ATTR_ICON: "mdi:upload",
},
"sensor.mock_title_gb_received": {
ATTR_STATE: "5.2",
ATTR_STATE_CLASS: STATE_CLASS_TOTAL_INCREASING,
ATTR_UNIT_OF_MEASUREMENT: "GB",
ATTR_ICON: "mdi:download",
},
"sensor.mock_title_link_upload_throughput": {
ATTR_STATE: "51805.0",
ATTR_UNIT_OF_MEASUREMENT: "kbit/s",
ATTR_ICON: "mdi:upload",
},
"sensor.mock_title_link_download_throughput": {
ATTR_STATE: "318557.0",
ATTR_UNIT_OF_MEASUREMENT: "kbit/s",
ATTR_ICON: "mdi:download",
},
"sensor.mock_title_link_upload_noise_margin": {
ATTR_STATE: "9.0",
ATTR_UNIT_OF_MEASUREMENT: "dB",
ATTR_ICON: "mdi:upload",
},
"sensor.mock_title_link_download_noise_margin": {
ATTR_STATE: "8.0",
ATTR_UNIT_OF_MEASUREMENT: "dB",
ATTR_ICON: "mdi:download",
},
"sensor.mock_title_link_upload_power_attenuation": {
ATTR_STATE: "7.0",
ATTR_UNIT_OF_MEASUREMENT: "dB",
ATTR_ICON: "mdi:upload",
},
"sensor.mock_title_link_download_power_attenuation": {
ATTR_STATE: "12.0",
ATTR_UNIT_OF_MEASUREMENT: "dB",
ATTR_ICON: "mdi:download",
},
}
async def test_sensor_setup(hass: HomeAssistant, fc_class_mock, fh_class_mock):
"""Test setup of Fritz!Tools sesnors."""
entry = MockConfigEntry(domain=DOMAIN, data=MOCK_USER_DATA)
entry.add_to_hass(hass)
assert await async_setup_component(hass, DOMAIN, {})
await hass.async_block_till_done()
assert entry.state == ConfigEntryState.LOADED
sensors = hass.states.async_all(SENSOR_DOMAIN)
assert len(sensors) == len(SENSOR_TYPES)
for sensor in sensors:
assert SENSOR_STATES.get(sensor.entity_id) is not None
for key, val in SENSOR_STATES[sensor.entity_id].items():
if key == ATTR_STATE:
assert sensor.state == val
else:
assert sensor.attributes.get(key) == val
async def test_sensor_update_fail(hass: HomeAssistant, fc_class_mock, fh_class_mock):
"""Test failed update of Fritz!Tools sesnors."""
entry = MockConfigEntry(domain=DOMAIN, data=MOCK_USER_DATA)
entry.add_to_hass(hass)
assert await async_setup_component(hass, DOMAIN, {})
await hass.async_block_till_done()
fc_class_mock().call_action_side_effect(FritzConnectionException)
async_fire_time_changed(hass, dt_util.utcnow() + timedelta(seconds=300))
await hass.async_block_till_done()
sensors = hass.states.async_all(SENSOR_DOMAIN)
for sensor in sensors:
assert sensor.state == STATE_UNAVAILABLE