core/tests/components/netatmo/test_sensor.py

258 lines
8.1 KiB
Python

"""The tests for the Netatmo sensor platform."""
from unittest.mock import AsyncMock
import pytest
from syrupy import SnapshotAssertion
from homeassistant.components.netatmo import sensor
from homeassistant.const import Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er
from .common import selected_platforms, snapshot_platform_entities
from tests.common import MockConfigEntry
@pytest.mark.usefixtures("entity_registry_enabled_by_default")
async def test_entity(
hass: HomeAssistant,
config_entry: MockConfigEntry,
netatmo_auth: AsyncMock,
snapshot: SnapshotAssertion,
entity_registry: er.EntityRegistry,
) -> None:
"""Test entities."""
await snapshot_platform_entities(
hass,
config_entry,
Platform.SENSOR,
entity_registry,
snapshot,
)
async def test_indoor_sensor(
hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None:
"""Test indoor sensor setup."""
with selected_platforms([Platform.SENSOR]):
assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()
prefix = "sensor.parents_bedroom_"
assert hass.states.get(f"{prefix}temperature").state == "20.3"
assert hass.states.get(f"{prefix}humidity").state == "63"
assert hass.states.get(f"{prefix}carbon_dioxide").state == "494"
assert hass.states.get(f"{prefix}atmospheric_pressure").state == "1014.5"
async def test_weather_sensor(
hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None:
"""Test weather sensor unreachable."""
with selected_platforms([Platform.SENSOR]):
assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()
prefix = "sensor.villa_outdoor_"
assert hass.states.get(f"{prefix}temperature").state == "unavailable"
async def test_public_weather_sensor(
hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None:
"""Test public weather sensor setup."""
with selected_platforms([Platform.SENSOR]):
assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()
assert len(hass.states.async_all()) > 0
prefix = "sensor.home_max_"
assert hass.states.get(f"{prefix}temperature").state == "27.4"
assert hass.states.get(f"{prefix}humidity").state == "76"
assert hass.states.get(f"{prefix}atmospheric_pressure").state == "1014.4"
prefix = "sensor.home_min_"
assert hass.states.get(f"{prefix}temperature").state == "19.8"
assert hass.states.get(f"{prefix}humidity").state == "56"
assert hass.states.get(f"{prefix}atmospheric_pressure").state == "1005.4"
prefix = "sensor.home_avg_"
assert hass.states.get(f"{prefix}temperature").state == "22.7"
assert hass.states.get(f"{prefix}humidity").state == "63.2"
assert hass.states.get(f"{prefix}atmospheric_pressure").state == "1010.4"
entities_before_change = len(hass.states.async_all())
valid_option = {
"lat_ne": 32.91336,
"lon_ne": -117.187429,
"lat_sw": 32.83336,
"lon_sw": -117.26743,
"show_on_map": True,
"area_name": "Home avg",
"mode": "max",
}
result = await hass.config_entries.options.async_init(config_entry.entry_id)
result = await hass.config_entries.options.async_configure(
result["flow_id"], user_input={"new_area": "Home avg"}
)
result = await hass.config_entries.options.async_configure(
result["flow_id"], user_input=valid_option
)
result = await hass.config_entries.options.async_configure(
result["flow_id"], user_input={}
)
await hass.async_block_till_done()
assert len(hass.states.async_all()) == entities_before_change
assert hass.states.get(f"{prefix}temperature").state == "27.4"
@pytest.mark.parametrize(
("strength", "expected"),
[(50, "Full"), (60, "High"), (80, "Medium"), (90, "Low")],
)
async def test_process_wifi(strength: int, expected: str) -> None:
"""Test wifi strength translation."""
assert sensor.process_wifi(strength) == expected
@pytest.mark.parametrize(
("strength", "expected"),
[(50, "Full"), (70, "High"), (80, "Medium"), (90, "Low")],
)
async def test_process_rf(strength: int, expected: str) -> None:
"""Test radio strength translation."""
assert sensor.process_rf(strength) == expected
@pytest.mark.parametrize(
("health", "expected"),
[(4, "unhealthy"), (3, "poor"), (2, "fair"), (1, "fine"), (0, "healthy")],
)
async def test_process_health(health: int, expected: str) -> None:
"""Test health index translation."""
assert sensor.process_health(health) == expected
@pytest.mark.parametrize(
("uid", "name", "expected"),
[
("12:34:56:03:1b:e4-reachable", "villa_garden_reachable", "True"),
("12:34:56:03:1b:e4-rf_status", "villa_garden_radio", "Full"),
(
"12:34:56:80:bb:26-wifi_status",
"villa_wifi_strength",
"High",
),
(
"12:34:56:80:bb:26-temp_trend",
"villa_temperature_trend",
"stable",
),
(
"12:34:56:80:bb:26-pressure_trend",
"villa_pressure_trend",
"up",
),
("12:34:56:80:c1:ea-sum_rain_1", "villa_rain_rain_last_hour", "0"),
("12:34:56:80:c1:ea-sum_rain_24", "villa_rain_rain_today", "6.9"),
("12:34:56:03:1b:e4-windangle", "netatmoindoor_garden_direction", "sw"),
(
"12:34:56:03:1b:e4-windangle_value",
"netatmoindoor_garden_angle",
"217",
),
("12:34:56:03:1b:e4-gustangle", "mystation_garden_gust_direction", "s"),
(
"12:34:56:03:1b:e4-gustangle",
"netatmoindoor_garden_gust_direction",
"s",
),
(
"12:34:56:03:1b:e4-gustangle_value",
"netatmoindoor_garden_gust_angle",
"206",
),
(
"12:34:56:03:1b:e4-guststrength",
"netatmoindoor_garden_gust_strength",
"9",
),
(
"12:34:56:03:1b:e4-rf_status",
"netatmoindoor_garden_rf_strength",
"Full",
),
(
"12:34:56:26:68:92-health_idx",
"baby_bedroom_health",
"fine",
),
(
"12:34:56:26:68:92-wifi_status",
"baby_bedroom_wifi",
"High",
),
("Home-max-windangle_value", "home_max_wind_angle", "17"),
("Home-max-gustangle_value", "home_max_gust_angle", "217"),
("Home-max-guststrength", "home_max_gust_strength", "31"),
("Home-max-sum_rain_1", "home_max_sum_rain_1", "0.2"),
],
)
async def test_weather_sensor_enabling(
hass: HomeAssistant,
entity_registry: er.EntityRegistry,
config_entry: MockConfigEntry,
uid: str,
name: str,
expected: str,
netatmo_auth: AsyncMock,
) -> None:
"""Test enabling of by default disabled sensors."""
with selected_platforms([Platform.SENSOR]):
states_before = len(hass.states.async_all())
assert hass.states.get(f"sensor.{name}") is None
entity_registry.async_get_or_create(
"sensor",
"netatmo",
uid,
suggested_object_id=name,
disabled_by=None,
)
assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()
assert len(hass.states.async_all()) > states_before
assert hass.states.get(f"sensor.{name}").state == expected
async def test_climate_battery_sensor(
hass: HomeAssistant, config_entry: MockConfigEntry, netatmo_auth: AsyncMock
) -> None:
"""Test climate device battery sensor."""
with selected_platforms([Platform.CLIMATE, Platform.SENSOR]):
assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()
prefix = "sensor.livingroom_"
assert hass.states.get(f"{prefix}battery").state == "75"