mirror of
https://github.com/home-assistant/core.git
synced 2025-07-13 16:27:08 +00:00
Add tests for Fritz!Tools sensors (#67776)
This commit is contained in:
parent
94c5dbfd16
commit
3d64d1b76b
@ -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
|
||||||
|
@ -308,14 +308,13 @@ class FritzBoxSensor(FritzBoxBaseEntity, SensorEntity):
|
|||||||
"""Update data."""
|
"""Update data."""
|
||||||
_LOGGER.debug("Updating FRITZ!Box sensors")
|
_LOGGER.debug("Updating FRITZ!Box sensors")
|
||||||
|
|
||||||
try:
|
|
||||||
status: FritzStatus = self._avm_wrapper.fritz_status
|
status: FritzStatus = self._avm_wrapper.fritz_status
|
||||||
self._attr_available = True
|
try:
|
||||||
|
self._attr_native_value = (
|
||||||
|
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)
|
|
||||||
|
@ -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",
|
||||||
|
151
tests/components/fritz/test_sensor.py
Normal file
151
tests/components/fritz/test_sensor.py
Normal 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
|
Loading…
x
Reference in New Issue
Block a user