Files
core/tests/components/switchbot_cloud/test_humidifier.py

222 lines
5.9 KiB
Python

"""Test for the switchbot_cloud humidifiers."""
from unittest.mock import patch
import pytest
import switchbot_api
from switchbot_api import Device
from syrupy.assertion import SnapshotAssertion
from homeassistant.components.humidifier import DOMAIN as HUMIDIFIER_DOMAIN
from homeassistant.components.switchbot_cloud import SwitchBotAPI
from homeassistant.components.switchbot_cloud.const import DOMAIN
from homeassistant.const import ATTR_ENTITY_ID, Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er
from . import HUMIDIFIER2_INFO, HUMIDIFIER_INFO, configure_integration
from tests.common import async_load_json_array_fixture, snapshot_platform
@pytest.mark.parametrize(
("device_info", "index"),
[
(HUMIDIFIER_INFO, 6),
(HUMIDIFIER2_INFO, 7),
],
)
async def test_humidifier(
hass: HomeAssistant,
entity_registry: er.EntityRegistry,
snapshot: SnapshotAssertion,
mock_list_devices,
mock_get_status,
device_info: Device,
index: int,
) -> None:
"""Test humidifier sensors."""
mock_list_devices.return_value = [device_info]
json_data = await async_load_json_array_fixture(hass, "status.json", DOMAIN)
mock_get_status.return_value = json_data[index]
with patch(
"homeassistant.components.switchbot_cloud.PLATFORMS", [Platform.HUMIDIFIER]
):
entry = await configure_integration(hass)
await snapshot_platform(hass, entity_registry, snapshot, entry.entry_id)
@pytest.mark.parametrize(
("service", "service_data", "expected_call_args"),
[
(
"turn_on",
{},
(
"humidifier-id-1",
switchbot_api.CommonCommands.ON,
"command",
"default",
),
),
(
"turn_off",
{},
(
"humidifier-id-1",
switchbot_api.CommonCommands.OFF,
"command",
"default",
),
),
(
"set_humidity",
{"humidity": 15},
(
"humidifier-id-1",
switchbot_api.HumidifierCommands.SET_MODE,
"command",
"101",
),
),
(
"set_humidity",
{"humidity": 60},
(
"humidifier-id-1",
switchbot_api.HumidifierCommands.SET_MODE,
"command",
"102",
),
),
(
"set_humidity",
{"humidity": 80},
(
"humidifier-id-1",
switchbot_api.HumidifierCommands.SET_MODE,
"command",
"103",
),
),
(
"set_mode",
{"mode": "auto"},
(
"humidifier-id-1",
switchbot_api.HumidifierCommands.SET_MODE,
"command",
"auto",
),
),
(
"set_mode",
{"mode": "normal"},
(
"humidifier-id-1",
switchbot_api.HumidifierCommands.SET_MODE,
"command",
"102",
),
),
],
)
async def test_humidifier_controller(
hass: HomeAssistant,
mock_list_devices,
mock_get_status,
service: str,
service_data: dict,
expected_call_args: tuple,
) -> None:
"""Test controlling the humidifier with mocked delay."""
mock_list_devices.return_value = [HUMIDIFIER_INFO]
mock_get_status.return_value = {"power": "OFF", "mode": 2}
await configure_integration(hass)
humidifier_id = "humidifier.humidifier_1"
with patch.object(SwitchBotAPI, "send_command") as mocked_send_command:
await hass.services.async_call(
HUMIDIFIER_DOMAIN,
service,
{**service_data, ATTR_ENTITY_ID: humidifier_id},
blocking=True,
)
mocked_send_command.assert_awaited_once_with(*expected_call_args)
@pytest.mark.parametrize(
("service", "service_data", "expected_call_args"),
[
(
"turn_on",
{},
(
"humidifier2-id-1",
switchbot_api.CommonCommands.ON,
"command",
"default",
),
),
(
"turn_off",
{},
(
"humidifier2-id-1",
switchbot_api.CommonCommands.OFF,
"command",
"default",
),
),
(
"set_humidity",
{"humidity": 50},
(
"humidifier2-id-1",
switchbot_api.HumidifierV2Commands.SET_MODE,
"command",
{"mode": 2, "humidity": 50},
),
),
(
"set_mode",
{"mode": "auto"},
(
"humidifier2-id-1",
switchbot_api.HumidifierV2Commands.SET_MODE,
"command",
{"mode": 7},
),
),
],
)
async def test_humidifier2_controller(
hass: HomeAssistant,
mock_list_devices,
mock_get_status,
service: str,
service_data: dict,
expected_call_args: tuple,
) -> None:
"""Test controlling the humidifier2 with mocked delay."""
mock_list_devices.return_value = [HUMIDIFIER2_INFO]
mock_get_status.return_value = {"power": "off", "mode": 2}
await configure_integration(hass)
humidifier_id = "humidifier.humidifier2_1"
with patch.object(SwitchBotAPI, "send_command") as mocked_send_command:
await hass.services.async_call(
HUMIDIFIER_DOMAIN,
service,
{**service_data, ATTR_ENTITY_ID: humidifier_id},
blocking=True,
)
mocked_send_command.assert_awaited_once_with(*expected_call_args)