1
0
mirror of https://github.com/home-assistant/core.git synced 2026-05-22 00:10:16 +01:00
Files
2026-05-19 20:49:43 +02:00

170 lines
5.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Tests for LG Netcast remote platform."""
from collections.abc import Generator
from unittest.mock import MagicMock, call, patch
from pylgnetcast import LG_COMMAND
import pytest
from homeassistant.components.remote import (
ATTR_COMMAND,
ATTR_DELAY_SECS,
ATTR_NUM_REPEATS,
DOMAIN as REMOTE_DOMAIN,
SERVICE_SEND_COMMAND,
)
from homeassistant.const import ATTR_ENTITY_ID
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ServiceValidationError
from . import MODEL_NAME, setup_lgnetcast
REMOTE_ENTITY_ID = f"{REMOTE_DOMAIN}.{MODEL_NAME.lower()}"
@pytest.fixture(autouse=True)
def mock_lg_netcast() -> Generator[MagicMock]:
"""Mock LG Netcast library."""
with patch(
"homeassistant.components.lg_netcast.LgNetCastClient"
) as mock_client_class:
yield mock_client_class
async def test_send_command(hass: HomeAssistant, mock_lg_netcast: MagicMock) -> None:
"""Test remote.send_command calls the client with the correct command code."""
await setup_lgnetcast(hass)
context_client = mock_lg_netcast.return_value.__enter__.return_value
await hass.services.async_call(
REMOTE_DOMAIN,
SERVICE_SEND_COMMAND,
{ATTR_ENTITY_ID: REMOTE_ENTITY_ID, ATTR_COMMAND: ["POWER"]},
blocking=True,
)
context_client.send_command.assert_called_once_with(LG_COMMAND.POWER)
async def test_send_command_invalid(
hass: HomeAssistant, mock_lg_netcast: MagicMock
) -> None:
"""Test send_command raises error for unknown command name."""
await setup_lgnetcast(hass)
with pytest.raises(ServiceValidationError, match="Unknown command"):
await hass.services.async_call(
REMOTE_DOMAIN,
SERVICE_SEND_COMMAND,
{ATTR_ENTITY_ID: REMOTE_ENTITY_ID, ATTR_COMMAND: ["NOT_A_REAL_COMMAND"]},
blocking=True,
)
async def test_send_multiple_commands(
hass: HomeAssistant, mock_lg_netcast: MagicMock
) -> None:
"""Test remote.send_command calls the client for each command in the list."""
await setup_lgnetcast(hass)
context_client = mock_lg_netcast.return_value.__enter__.return_value
await hass.services.async_call(
REMOTE_DOMAIN,
SERVICE_SEND_COMMAND,
{ATTR_ENTITY_ID: REMOTE_ENTITY_ID, ATTR_COMMAND: ["POWER", "NUMBER_0"]},
blocking=True,
)
assert context_client.send_command.call_count == 2
context_client.send_command.assert_has_calls(
[
call(LG_COMMAND.POWER),
call(LG_COMMAND.NUMBER_0),
]
)
async def test_send_multiple_commands_with_delay(
hass: HomeAssistant, mock_lg_netcast: MagicMock
) -> None:
"""Test remote.send_command sleeps between commands when delay_secs is set."""
await setup_lgnetcast(hass)
context_client = mock_lg_netcast.return_value.__enter__.return_value
with patch("homeassistant.components.lg_netcast.remote.time.sleep") as mock_sleep:
await hass.services.async_call(
REMOTE_DOMAIN,
SERVICE_SEND_COMMAND,
{
ATTR_ENTITY_ID: REMOTE_ENTITY_ID,
ATTR_COMMAND: ["POWER", "NUMBER_0", "NUMBER_1"],
ATTR_DELAY_SECS: 0.5,
},
blocking=True,
)
assert context_client.send_command.call_count == 3
context_client.send_command.assert_has_calls(
[
call(LG_COMMAND.POWER),
call(LG_COMMAND.NUMBER_0),
call(LG_COMMAND.NUMBER_1),
]
)
assert mock_sleep.call_count == 2
mock_sleep.assert_called_with(0.5)
async def test_send_command_repeats_with_delay(
hass: HomeAssistant, mock_lg_netcast: MagicMock
) -> None:
"""Test remote.send_command sleeps between repeats when delay_secs is set."""
await setup_lgnetcast(hass)
context_client = mock_lg_netcast.return_value.__enter__.return_value
with patch("homeassistant.components.lg_netcast.remote.time.sleep") as mock_sleep:
await hass.services.async_call(
REMOTE_DOMAIN,
SERVICE_SEND_COMMAND,
{
ATTR_ENTITY_ID: REMOTE_ENTITY_ID,
ATTR_COMMAND: ["POWER"],
ATTR_NUM_REPEATS: 3,
ATTR_DELAY_SECS: 0.5,
},
blocking=True,
)
assert context_client.send_command.call_count == 3
# sleep once before each repeat after the first (2 times), no sleep between commands since there's only one
assert mock_sleep.call_count == 2
mock_sleep.assert_called_with(0.5)
async def test_send_multiple_commands_repeats_with_delay(
hass: HomeAssistant, mock_lg_netcast: MagicMock
) -> None:
"""Test remote.send_command sleeps between commands and between repeats."""
await setup_lgnetcast(hass)
context_client = mock_lg_netcast.return_value.__enter__.return_value
with patch("homeassistant.components.lg_netcast.remote.time.sleep") as mock_sleep:
await hass.services.async_call(
REMOTE_DOMAIN,
SERVICE_SEND_COMMAND,
{
ATTR_ENTITY_ID: REMOTE_ENTITY_ID,
ATTR_COMMAND: ["POWER", "NUMBER_0"],
ATTR_NUM_REPEATS: 3,
ATTR_DELAY_SECS: 0.5,
},
blocking=True,
)
# 2 commands × 3 repeats = 6 total sends
assert context_client.send_command.call_count == 6
# 1 sleep between the 2 commands per repeat (3 repeats) + 1 sleep before each repeat after the first (2)
# = 3 + 2 = 5 sleeps total
assert mock_sleep.call_count == 5
mock_sleep.assert_called_with(0.5)