mirror of
https://github.com/home-assistant/core.git
synced 2026-08-07 05:46:41 +01:00
151 lines
4.7 KiB
Python
151 lines
4.7 KiB
Python
"""Tests for midea entity behavior via loaded platforms."""
|
|
|
|
from collections.abc import Callable
|
|
|
|
from midealocal.devices.ac import DeviceAttributes as ACAttributes
|
|
import pytest
|
|
|
|
from homeassistant.components.midea.const import DOMAIN
|
|
from homeassistant.core import CoreState, HomeAssistant
|
|
from homeassistant.helpers import device_registry as dr
|
|
|
|
from . import setup_integration
|
|
from .conftest import DummyDevice, default_ac_device, entity_entries
|
|
from .const import TEST_DEVICE_ID, TEST_MAC_ADDRESS, TEST_MODEL, TEST_SERIAL_NUMBER
|
|
|
|
from tests.common import MockConfigEntry
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
(
|
|
"update",
|
|
"status",
|
|
"availability",
|
|
"expected_current_temp",
|
|
"expected_unavailable",
|
|
),
|
|
[
|
|
pytest.param(
|
|
{ACAttributes.indoor_temperature: 24.0},
|
|
{"available": True},
|
|
True,
|
|
24.0,
|
|
False,
|
|
id="temperature_update",
|
|
),
|
|
pytest.param(
|
|
{},
|
|
{"available": False},
|
|
False,
|
|
None,
|
|
True,
|
|
id="availability_update",
|
|
),
|
|
pytest.param(
|
|
{ACAttributes.indoor_temperature: 24.0},
|
|
{"power": True, ACAttributes.indoor_temperature: 24.0},
|
|
True,
|
|
24.0,
|
|
False,
|
|
id="attribute_update_without_available_key",
|
|
),
|
|
],
|
|
)
|
|
async def test_entity_updates_from_device_callback(
|
|
hass: HomeAssistant,
|
|
mock_config_entry: Callable[[DummyDevice], MockConfigEntry],
|
|
update: dict[str, float],
|
|
status: dict[str, bool | float],
|
|
availability: bool,
|
|
expected_current_temp: float | None,
|
|
expected_unavailable: bool,
|
|
) -> None:
|
|
"""Test entity callback updates state and availability."""
|
|
device = default_ac_device()
|
|
config_entry = mock_config_entry(device)
|
|
await setup_integration(hass, config_entry, device)
|
|
|
|
entity_entry = entity_entries(hass, config_entry)[f"{TEST_DEVICE_ID}_climate"]
|
|
|
|
assert (state := hass.states.get(entity_entry.entity_id))
|
|
assert state.attributes["current_temperature"] == 21.0
|
|
assert state.state != "unavailable"
|
|
|
|
device.attributes.update(update)
|
|
device.available = availability
|
|
device.notify_update(status)
|
|
await hass.async_block_till_done()
|
|
|
|
assert (state := hass.states.get(entity_entry.entity_id))
|
|
assert state.attributes.get("current_temperature") == expected_current_temp
|
|
assert (state.state == "unavailable") is expected_unavailable
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("mac", "serial_number", "expected_connections", "expected_serial_number"),
|
|
[
|
|
pytest.param(
|
|
TEST_MAC_ADDRESS,
|
|
TEST_SERIAL_NUMBER,
|
|
{(dr.CONNECTION_NETWORK_MAC, TEST_MAC_ADDRESS)},
|
|
TEST_SERIAL_NUMBER,
|
|
id="populated",
|
|
),
|
|
pytest.param(
|
|
"",
|
|
"",
|
|
set(),
|
|
None,
|
|
id="absent",
|
|
),
|
|
],
|
|
)
|
|
async def test_device_info_optional_metadata(
|
|
hass: HomeAssistant,
|
|
device_registry: dr.DeviceRegistry,
|
|
mock_config_entry: Callable[[DummyDevice], MockConfigEntry],
|
|
mac: str,
|
|
serial_number: str,
|
|
expected_connections: set[tuple[str, str]],
|
|
expected_serial_number: str | None,
|
|
) -> None:
|
|
"""Test device registry entry reflects optional mac and serial number."""
|
|
device = default_ac_device()
|
|
device.mac = mac
|
|
device.serial_number = serial_number
|
|
config_entry = mock_config_entry(device)
|
|
await setup_integration(hass, config_entry, device)
|
|
|
|
assert (
|
|
device_entry := device_registry.async_get_device(
|
|
identifiers={(DOMAIN, str(TEST_DEVICE_ID))}
|
|
)
|
|
) is not None
|
|
|
|
assert device_entry.model_id == device.device_type.name
|
|
assert device_entry.hw_version == TEST_MODEL
|
|
assert device_entry.connections == expected_connections
|
|
assert device_entry.serial_number == expected_serial_number
|
|
|
|
|
|
async def test_entity_callback_ignored_while_hass_stopping(
|
|
hass: HomeAssistant,
|
|
mock_config_entry: Callable[[DummyDevice], MockConfigEntry],
|
|
) -> None:
|
|
"""Test update callback does not schedule updates while Home Assistant stops."""
|
|
device = default_ac_device()
|
|
config_entry = mock_config_entry(device)
|
|
await setup_integration(hass, config_entry, device)
|
|
|
|
entity_entry = entity_entries(hass, config_entry)[f"{TEST_DEVICE_ID}_climate"]
|
|
|
|
assert hass.states.get(entity_entry.entity_id) is not None
|
|
|
|
device.attributes[ACAttributes.indoor_temperature] = 25.0
|
|
hass.set_state(CoreState.stopping)
|
|
device.notify_update({"available": True})
|
|
await hass.async_block_till_done()
|
|
|
|
assert (state := hass.states.get(entity_entry.entity_id))
|
|
assert state.attributes["current_temperature"] == 21.0
|