|
|
@@ -0,0 +1,135 @@
|
|
|
+"""Tests for the infrared entity."""
|
|
|
+
|
|
|
+import pytest
|
|
|
+from infrared_protocols.commands import NECCommand
|
|
|
+from pytest_homeassistant_custom_component.common import MockConfigEntry
|
|
|
+
|
|
|
+from custom_components.tuya_local.const import (
|
|
|
+ CONF_DEVICE_ID,
|
|
|
+ CONF_PROTOCOL_VERSION,
|
|
|
+ CONF_TYPE,
|
|
|
+ DOMAIN,
|
|
|
+)
|
|
|
+from custom_components.tuya_local.helpers.device_config import TuyaEntityConfig
|
|
|
+from custom_components.tuya_local.infrared import TuyaLocalInfrared, async_setup_entry
|
|
|
+
|
|
|
+from .helpers import assert_device_properties_set, mock_device
|
|
|
+
|
|
|
+
|
|
|
+@pytest.mark.asyncio
|
|
|
+async def test_init_entry(hass, mocker):
|
|
|
+ """Test the initialisation."""
|
|
|
+ entry = MockConfigEntry(
|
|
|
+ domain=DOMAIN,
|
|
|
+ data={
|
|
|
+ CONF_TYPE: "ir_remote_sensors",
|
|
|
+ CONF_DEVICE_ID: "dummy",
|
|
|
+ CONF_PROTOCOL_VERSION: "auto",
|
|
|
+ },
|
|
|
+ )
|
|
|
+ # although async, the async_add_entities function passed to
|
|
|
+ # async_setup_entry is called truly asynchronously. If we use
|
|
|
+ # AsyncMock, it expects us to await the result.
|
|
|
+ m_add_entities = mocker.Mock()
|
|
|
+ m_device = mocker.AsyncMock()
|
|
|
+
|
|
|
+ hass.data[DOMAIN] = {}
|
|
|
+ hass.data[DOMAIN]["dummy"] = {}
|
|
|
+ hass.data[DOMAIN]["dummy"]["device"] = m_device
|
|
|
+
|
|
|
+ await async_setup_entry(hass, entry, m_add_entities)
|
|
|
+ assert type(hass.data[DOMAIN]["dummy"]["infrared"]) is TuyaLocalInfrared
|
|
|
+ m_add_entities.assert_called_once()
|
|
|
+
|
|
|
+
|
|
|
+@pytest.mark.asyncio
|
|
|
+async def test_init_entry_fails_if_device_has_no_infrared(hass, mocker):
|
|
|
+ """Test initialisation when device has no matching entity"""
|
|
|
+ entry = MockConfigEntry(
|
|
|
+ domain=DOMAIN,
|
|
|
+ data={
|
|
|
+ CONF_TYPE: "smartplugv1",
|
|
|
+ CONF_DEVICE_ID: "dummy",
|
|
|
+ CONF_PROTOCOL_VERSION: "auto",
|
|
|
+ },
|
|
|
+ )
|
|
|
+ # although async, the async_add_entities function passed to
|
|
|
+ # async_setup_entry is called truly asynchronously. If we use
|
|
|
+ # AsyncMock, it expects us to await the result.
|
|
|
+ m_add_entities = mocker.Mock()
|
|
|
+ m_device = mocker.AsyncMock()
|
|
|
+
|
|
|
+ hass.data[DOMAIN] = {}
|
|
|
+ hass.data[DOMAIN]["dummy"] = {}
|
|
|
+ hass.data[DOMAIN]["dummy"]["device"] = m_device
|
|
|
+ try:
|
|
|
+ await async_setup_entry(hass, entry, m_add_entities)
|
|
|
+ assert False
|
|
|
+ except ValueError:
|
|
|
+ pass
|
|
|
+ m_add_entities.assert_not_called()
|
|
|
+
|
|
|
+
|
|
|
+@pytest.mark.asyncio
|
|
|
+async def test_init_entry_fails_if_config_is_missing(hass, mocker):
|
|
|
+ """Test initialisation when device has no matching entity"""
|
|
|
+ entry = MockConfigEntry(
|
|
|
+ domain=DOMAIN,
|
|
|
+ data={
|
|
|
+ CONF_TYPE: "non_existing",
|
|
|
+ CONF_DEVICE_ID: "dummy",
|
|
|
+ CONF_PROTOCOL_VERSION: "auto",
|
|
|
+ },
|
|
|
+ )
|
|
|
+ # although async, the async_add_entities function passed to
|
|
|
+ # async_setup_entry is called truly asynchronously. If we use
|
|
|
+ # AsyncMock, it expects us to await the result.
|
|
|
+ m_add_entities = mocker.Mock()
|
|
|
+ m_device = mocker.AsyncMock()
|
|
|
+
|
|
|
+ hass.data[DOMAIN] = {}
|
|
|
+ hass.data[DOMAIN]["dummy"] = {}
|
|
|
+ hass.data[DOMAIN]["dummy"]["device"] = m_device
|
|
|
+ try:
|
|
|
+ await async_setup_entry(hass, entry, m_add_entities)
|
|
|
+ assert False
|
|
|
+ except ValueError:
|
|
|
+ pass
|
|
|
+ m_add_entities.assert_not_called()
|
|
|
+
|
|
|
+
|
|
|
+@pytest.mark.asyncio
|
|
|
+async def test_async_send_command(mocker):
|
|
|
+ """Test that infrared encodes commands as expected."""
|
|
|
+ config = {
|
|
|
+ "entity": "infrared",
|
|
|
+ "dps": [
|
|
|
+ {
|
|
|
+ "id": "201",
|
|
|
+ "name": "send",
|
|
|
+ "type": "base64",
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ }
|
|
|
+ tuyadevice = mocker.MagicMock()
|
|
|
+ dps = {"201": ""}
|
|
|
+ device = mock_device(dps, mocker)
|
|
|
+ infrared = TuyaLocalInfrared(
|
|
|
+ device,
|
|
|
+ TuyaEntityConfig(tuyadevice, config),
|
|
|
+ )
|
|
|
+
|
|
|
+ async with assert_device_properties_set(
|
|
|
+ device,
|
|
|
+ {
|
|
|
+ "201": (
|
|
|
+ "{'control': 'send_ir', 'type': 0, 'head': '', 'key1': '1KCOUETICMgIyAjI"
|
|
|
+ "CMgKXBjICMgIyAjICMgIyAjICMgIyApcGMgIyAjIClwYyAjICMgIyAjIClwYyAjICMgKXBj"
|
|
|
+ "ICMgIyAjICMgKXBjICMgIyAjICMgKXBjIClwYyAjICMgIyAjIClwYyAjICMgKXBjIClwYyA"
|
|
|
+ "jICMgIyAjIClwYyApcGMgIAAA=='}"
|
|
|
+ )
|
|
|
+ },
|
|
|
+ ):
|
|
|
+ await infrared.async_send_command(
|
|
|
+ NECCommand(address=0x5284, command=0x32, modulation=38000)
|
|
|
+ )
|