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