2025-02-26 15:14:04 +01:00

193 lines
5.2 KiB
Python

"""Test for the SmartThings cover platform."""
from unittest.mock import AsyncMock
from pysmartthings import Attribute, Capability, Command, Status
import pytest
from syrupy import SnapshotAssertion
from homeassistant.components.cover import (
ATTR_CURRENT_POSITION,
ATTR_POSITION,
DOMAIN as COVER_DOMAIN,
)
from homeassistant.components.smartthings.const import MAIN
from homeassistant.const import (
ATTR_BATTERY_LEVEL,
ATTR_ENTITY_ID,
SERVICE_CLOSE_COVER,
SERVICE_OPEN_COVER,
SERVICE_SET_COVER_POSITION,
STATE_OPEN,
STATE_OPENING,
Platform,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er
from . import 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.COVER)
@pytest.mark.parametrize("device_fixture", ["c2c_shade"])
@pytest.mark.parametrize(
("action", "command"),
[
(SERVICE_OPEN_COVER, Command.OPEN),
(SERVICE_CLOSE_COVER, Command.CLOSE),
],
)
async def test_cover_open_close(
hass: HomeAssistant,
devices: AsyncMock,
mock_config_entry: MockConfigEntry,
action: str,
command: Command,
) -> None:
"""Test cover open and close command."""
await setup_integration(hass, mock_config_entry)
await hass.services.async_call(
COVER_DOMAIN,
action,
{ATTR_ENTITY_ID: "cover.curtain_1a"},
blocking=True,
)
devices.execute_device_command.assert_called_once_with(
"571af102-15db-4030-b76b-245a691f74a5",
Capability.WINDOW_SHADE,
command,
MAIN,
)
@pytest.mark.parametrize("device_fixture", ["c2c_shade"])
async def test_cover_set_position(
hass: HomeAssistant,
devices: AsyncMock,
mock_config_entry: MockConfigEntry,
) -> None:
"""Test cover set position command."""
await setup_integration(hass, mock_config_entry)
await hass.services.async_call(
COVER_DOMAIN,
SERVICE_SET_COVER_POSITION,
{ATTR_ENTITY_ID: "cover.curtain_1a", ATTR_POSITION: 25},
blocking=True,
)
devices.execute_device_command.assert_called_once_with(
"571af102-15db-4030-b76b-245a691f74a5",
Capability.SWITCH_LEVEL,
Command.SET_LEVEL,
MAIN,
argument=25,
)
@pytest.mark.parametrize("device_fixture", ["c2c_shade"])
async def test_cover_battery(
hass: HomeAssistant,
devices: AsyncMock,
mock_config_entry: MockConfigEntry,
) -> None:
"""Test battery extra state attribute."""
devices.get_device_status.return_value[MAIN][Capability.BATTERY] = {
Attribute.BATTERY: Status(50)
}
await setup_integration(hass, mock_config_entry)
state = hass.states.get("cover.curtain_1a")
assert state
assert state.attributes[ATTR_BATTERY_LEVEL] == 50
@pytest.mark.parametrize("device_fixture", ["c2c_shade"])
async def test_cover_battery_updating(
hass: HomeAssistant,
devices: AsyncMock,
mock_config_entry: MockConfigEntry,
) -> None:
"""Test battery extra state attribute."""
devices.get_device_status.return_value[MAIN][Capability.BATTERY] = {
Attribute.BATTERY: Status(50)
}
await setup_integration(hass, mock_config_entry)
state = hass.states.get("cover.curtain_1a")
assert state
assert state.attributes[ATTR_BATTERY_LEVEL] == 50
await trigger_update(
hass,
devices,
"571af102-15db-4030-b76b-245a691f74a5",
Capability.BATTERY,
Attribute.BATTERY,
49,
)
state = hass.states.get("cover.curtain_1a")
assert state
assert state.attributes[ATTR_BATTERY_LEVEL] == 49
@pytest.mark.parametrize("device_fixture", ["c2c_shade"])
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("cover.curtain_1a").state == STATE_OPEN
await trigger_update(
hass,
devices,
"571af102-15db-4030-b76b-245a691f74a5",
Capability.WINDOW_SHADE,
Attribute.WINDOW_SHADE,
"opening",
)
assert hass.states.get("cover.curtain_1a").state == STATE_OPENING
@pytest.mark.parametrize("device_fixture", ["c2c_shade"])
async def test_position_update(
hass: HomeAssistant,
devices: AsyncMock,
mock_config_entry: MockConfigEntry,
) -> None:
"""Test position update."""
await setup_integration(hass, mock_config_entry)
assert hass.states.get("cover.curtain_1a").attributes[ATTR_CURRENT_POSITION] == 100
await trigger_update(
hass,
devices,
"571af102-15db-4030-b76b-245a691f74a5",
Capability.SWITCH_LEVEL,
Attribute.LEVEL,
50,
)
assert hass.states.get("cover.curtain_1a").attributes[ATTR_CURRENT_POSITION] == 50