core/tests/components/smartthings/test_select.py
Joost Lekkerkerker 1b8b348eff
Add select platform to SmartThings (#141115)
* Add select platform to SmartThings

* Add select platform to SmartThings
2025-03-22 18:03:50 +01:00

122 lines
3.3 KiB
Python

"""Test for the SmartThings select platform."""
from unittest.mock import AsyncMock
from pysmartthings import Attribute, Capability, Command
import pytest
from syrupy import SnapshotAssertion
from homeassistant.components.select import (
ATTR_OPTION,
DOMAIN as SELECT_DOMAIN,
SERVICE_SELECT_OPTION,
)
from homeassistant.components.smartthings import MAIN
from homeassistant.const import ATTR_ENTITY_ID, Platform
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ServiceValidationError
from homeassistant.helpers import entity_registry as er
from . import (
set_attribute_value,
setup_integration,
snapshot_smartthings_entities,
trigger_update,
)
from tests.common import MockConfigEntry
async def test_all_entities(
hass: HomeAssistant,
snapshot: SnapshotAssertion,
devices: AsyncMock,
mock_config_entry: MockConfigEntry,
entity_registry: er.EntityRegistry,
) -> None:
"""Test all entities."""
await setup_integration(hass, mock_config_entry)
snapshot_smartthings_entities(hass, entity_registry, snapshot, Platform.SELECT)
@pytest.mark.parametrize("device_fixture", ["da_wm_wd_000001"])
async def test_state_update(
hass: HomeAssistant,
devices: AsyncMock,
mock_config_entry: MockConfigEntry,
) -> None:
"""Test state update."""
await setup_integration(hass, mock_config_entry)
assert hass.states.get("select.dryer").state == "stop"
await trigger_update(
hass,
devices,
"02f7256e-8353-5bdd-547f-bd5b1647e01b",
Capability.DRYER_OPERATING_STATE,
Attribute.MACHINE_STATE,
"run",
)
assert hass.states.get("select.dryer").state == "run"
@pytest.mark.parametrize("device_fixture", ["da_wm_wd_000001"])
async def test_select_option(
hass: HomeAssistant,
devices: AsyncMock,
mock_config_entry: MockConfigEntry,
) -> None:
"""Test state update."""
set_attribute_value(
devices,
Capability.REMOTE_CONTROL_STATUS,
Attribute.REMOTE_CONTROL_ENABLED,
"true",
)
await setup_integration(hass, mock_config_entry)
await hass.services.async_call(
SELECT_DOMAIN,
SERVICE_SELECT_OPTION,
{ATTR_ENTITY_ID: "select.dryer", ATTR_OPTION: "run"},
blocking=True,
)
devices.execute_device_command.assert_called_once_with(
"02f7256e-8353-5bdd-547f-bd5b1647e01b",
Capability.DRYER_OPERATING_STATE,
Command.SET_MACHINE_STATE,
MAIN,
argument="run",
)
@pytest.mark.parametrize("device_fixture", ["da_wm_wd_000001"])
async def test_select_option_without_remote_control(
hass: HomeAssistant,
devices: AsyncMock,
mock_config_entry: MockConfigEntry,
) -> None:
"""Test state update."""
set_attribute_value(
devices,
Capability.REMOTE_CONTROL_STATUS,
Attribute.REMOTE_CONTROL_ENABLED,
"false",
)
await setup_integration(hass, mock_config_entry)
with pytest.raises(
ServiceValidationError,
match="Can only be updated when remote control is enabled",
):
await hass.services.async_call(
SELECT_DOMAIN,
SERVICE_SELECT_OPTION,
{ATTR_ENTITY_ID: "select.dryer", ATTR_OPTION: "run"},
blocking=True,
)
devices.execute_device_command.assert_not_called()