diff --git a/tests/components/broadlink/__init__.py b/tests/components/broadlink/__init__.py index 5d6c3312e51..4051f94c0d3 100644 --- a/tests/components/broadlink/__init__.py +++ b/tests/components/broadlink/__init__.py @@ -1,7 +1,7 @@ """Tests for the Broadlink integration.""" from homeassistant.components.broadlink.const import DOMAIN -from tests.async_mock import MagicMock +from tests.async_mock import MagicMock, patch from tests.common import MockConfigEntry # Do not edit/remove. Adding is ok. @@ -76,6 +76,21 @@ class BroadlinkDevice: self.timeout: int = timeout self.fwversion: int = fwversion + async def setup_entry(self, hass, mock_api=None, mock_entry=None): + """Set up the device.""" + mock_api = mock_api or self.get_mock_api() + mock_entry = mock_entry or self.get_mock_entry() + mock_entry.add_to_hass(hass) + + with patch( + "homeassistant.components.broadlink.device.blk.gendevice", + return_value=mock_api, + ): + await hass.config_entries.async_setup(mock_entry.entry_id) + await hass.async_block_till_done() + + return mock_api, mock_entry + def get_mock_api(self): """Return a mock device (API).""" mock_api = MagicMock() diff --git a/tests/components/broadlink/test_remote.py b/tests/components/broadlink/test_remote.py new file mode 100644 index 00000000000..941dfc4d3ce --- /dev/null +++ b/tests/components/broadlink/test_remote.py @@ -0,0 +1,120 @@ +"""Tests for Broadlink remotes.""" +from base64 import b64decode + +from homeassistant.components.broadlink.const import DOMAIN, REMOTE_DOMAIN +from homeassistant.components.remote import ( + SERVICE_SEND_COMMAND, + SERVICE_TURN_OFF, + SERVICE_TURN_ON, +) +from homeassistant.const import STATE_OFF, STATE_ON +from homeassistant.helpers.entity_registry import async_entries_for_device + +from . import get_device + +from tests.async_mock import call +from tests.common import mock_device_registry, mock_registry + +REMOTE_DEVICES = ["Entrance", "Living Room", "Office", "Garage"] + +IR_PACKET = ( + "JgBGAJKVETkRORA6ERQRFBEUERQRFBE5ETkQOhAVEBUQFREUEBUQ" + "OhEUERQRORE5EBURFBA6EBUQOhE5EBUQFRA6EDoRFBEADQUAAA==" +) + + +async def test_remote_setup_works(hass): + """Test a successful setup with all remotes.""" + for device in map(get_device, REMOTE_DEVICES): + device_registry = mock_device_registry(hass) + entity_registry = mock_registry(hass) + mock_api, mock_entry = await device.setup_entry(hass) + + device_entry = device_registry.async_get_device( + {(DOMAIN, mock_entry.unique_id)}, set() + ) + entries = async_entries_for_device(entity_registry, device_entry.id) + remotes = {entry for entry in entries if entry.domain == REMOTE_DOMAIN} + assert len(remotes) == 1 + + remote = remotes.pop() + assert remote.original_name == f"{device.name} Remote" + assert hass.states.get(remote.entity_id).state == STATE_ON + assert mock_api.auth.call_count == 1 + + +async def test_remote_send_command(hass): + """Test sending a command with all remotes.""" + for device in map(get_device, REMOTE_DEVICES): + device_registry = mock_device_registry(hass) + entity_registry = mock_registry(hass) + mock_api, mock_entry = await device.setup_entry(hass) + + device_entry = device_registry.async_get_device( + {(DOMAIN, mock_entry.unique_id)}, set() + ) + entries = async_entries_for_device(entity_registry, device_entry.id) + remotes = {entry for entry in entries if entry.domain == REMOTE_DOMAIN} + assert len(remotes) == 1 + + remote = remotes.pop() + await hass.services.async_call( + REMOTE_DOMAIN, + SERVICE_SEND_COMMAND, + {"entity_id": remote.entity_id, "command": "b64:" + IR_PACKET}, + blocking=True, + ) + + assert mock_api.send_data.call_count == 1 + assert mock_api.send_data.call_args == call(b64decode(IR_PACKET)) + assert mock_api.auth.call_count == 1 + + +async def test_remote_turn_off_turn_on(hass): + """Test we do not send commands if the remotes are off.""" + for device in map(get_device, REMOTE_DEVICES): + device_registry = mock_device_registry(hass) + entity_registry = mock_registry(hass) + mock_api, mock_entry = await device.setup_entry(hass) + + device_entry = device_registry.async_get_device( + {(DOMAIN, mock_entry.unique_id)}, set() + ) + entries = async_entries_for_device(entity_registry, device_entry.id) + remotes = {entry for entry in entries if entry.domain == REMOTE_DOMAIN} + assert len(remotes) == 1 + + remote = remotes.pop() + await hass.services.async_call( + REMOTE_DOMAIN, + SERVICE_TURN_OFF, + {"entity_id": remote.entity_id}, + blocking=True, + ) + assert hass.states.get(remote.entity_id).state == STATE_OFF + + await hass.services.async_call( + REMOTE_DOMAIN, + SERVICE_SEND_COMMAND, + {"entity_id": remote.entity_id, "command": "b64:" + IR_PACKET}, + blocking=True, + ) + assert mock_api.send_data.call_count == 0 + + await hass.services.async_call( + REMOTE_DOMAIN, + SERVICE_TURN_ON, + {"entity_id": remote.entity_id}, + blocking=True, + ) + assert hass.states.get(remote.entity_id).state == STATE_ON + + await hass.services.async_call( + REMOTE_DOMAIN, + SERVICE_SEND_COMMAND, + {"entity_id": remote.entity_id, "command": "b64:" + IR_PACKET}, + blocking=True, + ) + assert mock_api.send_data.call_count == 1 + assert mock_api.send_data.call_args == call(b64decode(IR_PACKET)) + assert mock_api.auth.call_count == 1