1
0
mirror of https://github.com/home-assistant/core.git synced 2026-05-18 22:40:15 +01:00
Files
renovate[bot] b0c2e57649 Update infrared-protocols to 3.1.0 (#169968)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: abmantis <amfcalt@gmail.com>
2026-05-07 18:26:33 +01:00

149 lines
4.3 KiB
Python

"""Tests for SLZB-Ultima infrared entity."""
from unittest.mock import MagicMock
from infrared_protocols.commands import Command
from pysmlight.exceptions import SmlightError
from pysmlight.models import IRPayload
import pytest
from homeassistant.components.infrared import async_send_command
from homeassistant.const import STATE_UNKNOWN, Platform
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError
from .conftest import setup_integration
from tests.common import MockConfigEntry
class MockCommand(Command):
"""Mock InfraredCommand."""
def __init__(self) -> None:
"""Initialize with fixed 38kHz modulation."""
super().__init__(modulation=38000)
def get_raw_timings(self) -> list[int]:
"""Return some fake timings."""
return [9000, -4500, 560, -1690]
@pytest.fixture
def platforms() -> list[Platform]:
"""Platforms, which should be loaded during the test."""
return [Platform.INFRARED]
async def test_infrared_setup_ultima(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_ultima_client: MagicMock,
) -> None:
"""Test infrared entity is created for Ultima devices."""
await setup_integration(hass, mock_config_entry)
state = hass.states.get("infrared.mock_title_ir_emitter")
assert state is not None
async def test_infrared_not_created_non_ultima(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_smlight_client: MagicMock,
) -> None:
"""Test infrared entity is not created for non-Ultima devices."""
await setup_integration(hass, mock_config_entry)
state = hass.states.get("infrared.mock_title_ir_emitter")
assert state is None
async def test_infrared_send_command(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_ultima_client: MagicMock,
) -> None:
"""Test sending IR command."""
await setup_integration(hass, mock_config_entry)
entity_id = "infrared.mock_title_ir_emitter"
state = hass.states.get(entity_id)
assert state is not None
await async_send_command(
hass,
entity_id,
MockCommand(),
)
mock_ultima_client.actions.send_ir_code.assert_called_once_with(
IRPayload.from_raw_timings([9000, 4500, 560, 1690], freq=38000)
)
async def test_infrared_send_command_error(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_ultima_client: MagicMock,
) -> None:
"""Test connection error handling."""
await setup_integration(hass, mock_config_entry)
entity_id = "infrared.mock_title_ir_emitter"
state = hass.states.get(entity_id)
assert state is not None
mock_ultima_client.actions.send_ir_code.side_effect = SmlightError("Failed")
with pytest.raises(HomeAssistantError) as exc_info:
await async_send_command(
hass,
entity_id,
MockCommand(),
)
assert exc_info.value.translation_key == "send_ir_code_failed"
async def test_infrared_send_empty_command_error(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_ultima_client: MagicMock,
) -> None:
"""Test ValueError from pysmlight is surfaced as HomeAssistantError."""
await setup_integration(hass, mock_config_entry)
entity_id = "infrared.mock_title_ir_emitter"
state = hass.states.get(entity_id)
assert state is not None
mock_ultima_client.actions.send_ir_code.side_effect = ValueError("empty payload")
with pytest.raises(HomeAssistantError) as exc_info:
await async_send_command(
hass,
entity_id,
MockCommand(),
)
assert exc_info.value.translation_key == "send_ir_code_failed"
@pytest.mark.freeze_time("2025-09-03T22:00:00+00:00")
async def test_infrared_state_updated_after_send(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_ultima_client: MagicMock,
) -> None:
"""Test that entity state is updated with a timestamp after a successful send."""
await setup_integration(hass, mock_config_entry)
entity_id = "infrared.mock_title_ir_emitter"
state = hass.states.get(entity_id)
assert state is not None
assert state.state == STATE_UNKNOWN
await async_send_command(hass, entity_id, MockCommand())
state = hass.states.get(entity_id)
assert state.state == "2025-09-03T22:00:00.000+00:00"