mirror of
https://github.com/home-assistant/core.git
synced 2026-08-06 13:26:29 +01:00
110 lines
3.5 KiB
Python
110 lines
3.5 KiB
Python
"""Tests for midea __init__.py."""
|
|
|
|
from unittest.mock import patch
|
|
|
|
from midealocal.const import DeviceType, ProtocolVersion
|
|
|
|
from homeassistant.components.midea.const import CONF_KEY, CONF_SUBTYPE, DOMAIN
|
|
from homeassistant.config_entries import ConfigEntryState
|
|
from homeassistant.const import (
|
|
CONF_DEVICE_ID,
|
|
CONF_IP_ADDRESS,
|
|
CONF_MODEL,
|
|
CONF_NAME,
|
|
CONF_PORT,
|
|
CONF_PROTOCOL,
|
|
CONF_TOKEN,
|
|
CONF_TYPE,
|
|
)
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.setup import async_setup_component
|
|
|
|
from .conftest import DummyDevice
|
|
from .const import TEST_DEVICE_ID
|
|
|
|
from tests.common import MockConfigEntry
|
|
|
|
_ENTRY_DATA = {
|
|
CONF_DEVICE_ID: TEST_DEVICE_ID,
|
|
CONF_NAME: "m",
|
|
CONF_TYPE: DeviceType.AC,
|
|
CONF_IP_ADDRESS: "1.1.1.1",
|
|
CONF_PORT: 6444,
|
|
CONF_MODEL: "m",
|
|
CONF_PROTOCOL: ProtocolVersion.V2,
|
|
CONF_TOKEN: "",
|
|
CONF_KEY: "",
|
|
CONF_SUBTYPE: 0,
|
|
}
|
|
|
|
|
|
async def test_async_setup(hass: HomeAssistant) -> None:
|
|
"""Test the midea domain can be set up without any config entries."""
|
|
assert await async_setup_component(hass, DOMAIN, {})
|
|
|
|
|
|
async def test_unload_entry(hass: HomeAssistant) -> None:
|
|
"""Test async_unload_entry unloads platforms and closes the device."""
|
|
entry = MockConfigEntry(domain=DOMAIN, data=_ENTRY_DATA)
|
|
entry.add_to_hass(hass)
|
|
device = DummyDevice(DeviceType.AC)
|
|
with patch(
|
|
"homeassistant.components.midea.device_selector",
|
|
return_value=device,
|
|
):
|
|
await hass.config_entries.async_setup(entry.entry_id)
|
|
assert entry.state is ConfigEntryState.LOADED
|
|
assert device.daemon is True
|
|
assert await hass.config_entries.async_unload(entry.entry_id)
|
|
assert entry.state is ConfigEntryState.NOT_LOADED
|
|
assert ("close",) in device.calls
|
|
|
|
|
|
async def test_async_setup_entry_paths(hass: HomeAssistant) -> None:
|
|
"""Test async_setup_entry for success and no-device return."""
|
|
entry = MockConfigEntry(domain=DOMAIN, data=_ENTRY_DATA)
|
|
entry.add_to_hass(hass)
|
|
with patch(
|
|
"homeassistant.components.midea.device_selector",
|
|
return_value=DummyDevice(DeviceType.AC),
|
|
):
|
|
await hass.config_entries.async_setup(entry.entry_id)
|
|
assert entry.state is ConfigEntryState.LOADED
|
|
|
|
entry2 = MockConfigEntry(
|
|
domain=DOMAIN,
|
|
data={**_ENTRY_DATA, CONF_DEVICE_ID: TEST_DEVICE_ID + 1},
|
|
)
|
|
entry2.add_to_hass(hass)
|
|
with patch(
|
|
"homeassistant.components.midea.device_selector",
|
|
return_value=None,
|
|
):
|
|
await hass.config_entries.async_setup(entry2.entry_id)
|
|
assert entry2.state is ConfigEntryState.SETUP_ERROR
|
|
|
|
|
|
async def test_setup_entry_not_ready_on_connect_failure(
|
|
hass: HomeAssistant,
|
|
) -> None:
|
|
"""Test async_setup_entry raises ConfigEntryNotReady when connect returns False.
|
|
|
|
The real device.connect() already catches SocketException/AuthException
|
|
internally and reports failure by returning False; it never raises them.
|
|
It can also leave the socket open in that case (e.g. when authentication
|
|
fails), so the socket must be closed explicitly to avoid a ResourceWarning.
|
|
"""
|
|
entry = MockConfigEntry(domain=DOMAIN, data=_ENTRY_DATA)
|
|
entry.add_to_hass(hass)
|
|
device = DummyDevice(DeviceType.AC)
|
|
with (
|
|
patch(
|
|
"homeassistant.components.midea.device_selector",
|
|
return_value=device,
|
|
),
|
|
patch.object(device, "connect", return_value=False),
|
|
):
|
|
await hass.config_entries.async_setup(entry.entry_id)
|
|
assert entry.state is ConfigEntryState.SETUP_RETRY
|
|
assert ("close_socket",) in device.calls
|