Add Homee general tests (#137128)

This commit is contained in:
Markus Adrario
2025-07-06 12:05:43 +02:00
committed by GitHub
parent 8d7e387b46
commit 1b11ac9123
7 changed files with 427 additions and 1 deletions

View File

@@ -0,0 +1,131 @@
"""Test Homee initialization."""
from unittest.mock import MagicMock
from pyHomee import HomeeAuthFailedException, HomeeConnectionFailedException
import pytest
from syrupy.assertion import SnapshotAssertion
from homeassistant.components.homee.const import DOMAIN
from homeassistant.config_entries import ConfigEntryState
from homeassistant.core import HomeAssistant
from homeassistant.helpers import device_registry as dr
from . import build_mock_node, setup_integration
from .conftest import HOMEE_ID
from tests.common import MockConfigEntry
@pytest.mark.parametrize(
"side_eff",
[
HomeeConnectionFailedException("connection timed out"),
HomeeAuthFailedException("wrong username or password"),
],
)
async def test_connection_errors(
hass: HomeAssistant,
mock_homee: MagicMock,
mock_config_entry: MockConfigEntry,
side_eff: Exception,
) -> None:
"""Test if connection errors on startup are handled correctly."""
mock_homee.get_access_token.side_effect = side_eff
mock_config_entry.add_to_hass(hass)
await hass.config_entries.async_setup(mock_config_entry.entry_id)
assert mock_config_entry.state is ConfigEntryState.SETUP_RETRY
async def test_connection_listener(
hass: HomeAssistant,
mock_homee: MagicMock,
mock_config_entry: MockConfigEntry,
caplog: pytest.LogCaptureFixture,
) -> None:
"""Test if loss of connection is sensed correctly."""
mock_homee.nodes = [build_mock_node("homee.json")]
mock_homee.get_node_by_id.return_value = mock_homee.nodes[0]
await setup_integration(hass, mock_config_entry)
await mock_homee.add_connection_listener.call_args_list[0][0][0](False)
await hass.async_block_till_done()
assert "Disconnected from Homee" in caplog.text
await mock_homee.add_connection_listener.call_args_list[0][0][0](True)
await hass.async_block_till_done()
assert "Reconnected to Homee" in caplog.text
async def test_general_data(
hass: HomeAssistant,
mock_homee: MagicMock,
mock_config_entry: MockConfigEntry,
device_registry: dr.DeviceRegistry,
snapshot: SnapshotAssertion,
) -> None:
"""Test if data is set correctly."""
mock_homee.nodes = [
build_mock_node("cover_with_position_slats.json"),
build_mock_node("homee.json"),
]
mock_homee.get_node_by_id = (
lambda node_id: mock_homee.nodes[0] if node_id == 3 else mock_homee.nodes[1]
)
await setup_integration(hass, mock_config_entry)
# Verify hub and device created correctly using snapshots.
hub = device_registry.async_get_device(identifiers={(DOMAIN, f"{HOMEE_ID}")})
device = device_registry.async_get_device(identifiers={(DOMAIN, f"{HOMEE_ID}-3")})
assert hub == snapshot
assert device == snapshot
async def test_software_version(
hass: HomeAssistant,
mock_homee: MagicMock,
mock_config_entry: MockConfigEntry,
device_registry: dr.DeviceRegistry,
) -> None:
"""Test sw_version for device with only AttributeType.SOFTWARE_VERSION."""
mock_homee.nodes = [build_mock_node("cover_without_position.json")]
await setup_integration(hass, mock_config_entry)
device = device_registry.async_get_device(identifiers={(DOMAIN, f"{HOMEE_ID}-3")})
assert device.sw_version == "1.45"
async def test_invalid_profile(
hass: HomeAssistant,
mock_homee: MagicMock,
mock_config_entry: MockConfigEntry,
device_registry: dr.DeviceRegistry,
) -> None:
"""Test unknown value passed to get_name_for_enum."""
mock_homee.nodes = [build_mock_node("cover_without_position.json")]
# This is a profile, that does not exist in the enum.
mock_homee.nodes[0].profile = 77
await setup_integration(hass, mock_config_entry)
device = device_registry.async_get_device(identifiers={(DOMAIN, f"{HOMEE_ID}-3")})
assert device.model is None
async def test_unload_entry(
hass: HomeAssistant,
mock_homee: MagicMock,
mock_config_entry: MockConfigEntry,
) -> None:
"""Test unloading of config entry."""
mock_homee.nodes = [build_mock_node("cover_with_position_slats.json")]
mock_homee.get_node_by_id.return_value = mock_homee.nodes[0]
await setup_integration(hass, mock_config_entry)
assert mock_config_entry.state is ConfigEntryState.LOADED
await hass.config_entries.async_unload(mock_config_entry.entry_id)
await hass.async_block_till_done()
assert mock_config_entry.state is ConfigEntryState.NOT_LOADED