Skip to content
Snippets Groups Projects
Unverified Commit a2926451 authored by Erik Montnemery's avatar Erik Montnemery Committed by GitHub
Browse files

Don't allow turning on audio only chromecasts (#59495)

* Don't allow turning on audio only chromecasts

* Improve tests

* Adjust tests
parent 85786fd9
No related branches found
No related tags found
No related merge requests found
...@@ -80,12 +80,7 @@ _LOGGER = logging.getLogger(__name__) ...@@ -80,12 +80,7 @@ _LOGGER = logging.getLogger(__name__)
CAST_SPLASH = "https://www.home-assistant.io/images/cast/splash.png" CAST_SPLASH = "https://www.home-assistant.io/images/cast/splash.png"
SUPPORT_CAST = ( SUPPORT_CAST = (
SUPPORT_PAUSE SUPPORT_PAUSE | SUPPORT_PLAY | SUPPORT_PLAY_MEDIA | SUPPORT_STOP | SUPPORT_TURN_OFF
| SUPPORT_PLAY
| SUPPORT_PLAY_MEDIA
| SUPPORT_STOP
| SUPPORT_TURN_OFF
| SUPPORT_TURN_ON
) )
STATE_CASTING = "casting" STATE_CASTING = "casting"
...@@ -694,6 +689,12 @@ class CastDevice(MediaPlayerEntity): ...@@ -694,6 +689,12 @@ class CastDevice(MediaPlayerEntity):
support = SUPPORT_CAST support = SUPPORT_CAST
media_status = self._media_status()[0] media_status = self._media_status()[0]
if (
self._chromecast
and self._chromecast.cast_type == pychromecast.const.CAST_TYPE_CHROMECAST
):
support |= SUPPORT_TURN_ON
if ( if (
self.cast_status self.cast_status
and self.cast_status.volume_control_type != VOLUME_CONTROL_TYPE_FIXED and self.cast_status.volume_control_type != VOLUME_CONTROL_TYPE_FIXED
......
...@@ -42,6 +42,7 @@ def pycast_mock(castbrowser_mock, castbrowser_constructor_mock): ...@@ -42,6 +42,7 @@ def pycast_mock(castbrowser_mock, castbrowser_constructor_mock):
pycast_mock = MagicMock() pycast_mock = MagicMock()
pycast_mock.IDLE_APP_ID = pychromecast.IDLE_APP_ID pycast_mock.IDLE_APP_ID = pychromecast.IDLE_APP_ID
pycast_mock.IGNORE_CEC = [] pycast_mock.IGNORE_CEC = []
pycast_mock.const = pychromecast.const
pycast_mock.discovery.CastBrowser = castbrowser_constructor_mock pycast_mock.discovery.CastBrowser = castbrowser_constructor_mock
pycast_mock.discovery.CastBrowser.return_value = castbrowser_mock pycast_mock.discovery.CastBrowser.return_value = castbrowser_mock
pycast_mock.discovery.AbstractCastListener = ( pycast_mock.discovery.AbstractCastListener = (
......
...@@ -591,6 +591,7 @@ async def test_entity_cast_status(hass: HomeAssistant): ...@@ -591,6 +591,7 @@ async def test_entity_cast_status(hass: HomeAssistant):
) )
chromecast, _ = await async_setup_media_player_cast(hass, info) chromecast, _ = await async_setup_media_player_cast(hass, info)
chromecast.cast_type = pychromecast.const.CAST_TYPE_CHROMECAST
cast_status_cb, conn_status_cb, _ = get_status_callbacks(chromecast) cast_status_cb, conn_status_cb, _ = get_status_callbacks(chromecast)
connection_status = MagicMock() connection_status = MagicMock()
...@@ -660,6 +661,65 @@ async def test_entity_cast_status(hass: HomeAssistant): ...@@ -660,6 +661,65 @@ async def test_entity_cast_status(hass: HomeAssistant):
) )
@pytest.mark.parametrize(
"cast_type,supported_features",
[
(
pychromecast.const.CAST_TYPE_AUDIO,
SUPPORT_PAUSE
| SUPPORT_PLAY
| SUPPORT_PLAY_MEDIA
| SUPPORT_STOP
| SUPPORT_TURN_OFF
| SUPPORT_VOLUME_MUTE
| SUPPORT_VOLUME_SET,
),
(
pychromecast.const.CAST_TYPE_CHROMECAST,
SUPPORT_PAUSE
| SUPPORT_PLAY
| SUPPORT_PLAY_MEDIA
| SUPPORT_STOP
| SUPPORT_TURN_OFF
| SUPPORT_TURN_ON
| SUPPORT_VOLUME_MUTE
| SUPPORT_VOLUME_SET,
),
(
pychromecast.const.CAST_TYPE_GROUP,
SUPPORT_PAUSE
| SUPPORT_PLAY
| SUPPORT_PLAY_MEDIA
| SUPPORT_STOP
| SUPPORT_TURN_OFF
| SUPPORT_VOLUME_MUTE
| SUPPORT_VOLUME_SET,
),
],
)
async def test_supported_features(hass: HomeAssistant, cast_type, supported_features):
"""Test supported features."""
entity_id = "media_player.speaker"
info = get_fake_chromecast_info()
chromecast, _ = await async_setup_media_player_cast(hass, info)
chromecast.cast_type = cast_type
_, conn_status_cb, _ = get_status_callbacks(chromecast)
connection_status = MagicMock()
connection_status.status = "CONNECTED"
conn_status_cb(connection_status)
await hass.async_block_till_done()
state = hass.states.get(entity_id)
assert state is not None
assert state.name == "Speaker"
assert state.state == "off"
assert state.attributes.get("supported_features") == supported_features
async def test_entity_play_media(hass: HomeAssistant): async def test_entity_play_media(hass: HomeAssistant):
"""Test playing media.""" """Test playing media."""
entity_id = "media_player.speaker" entity_id = "media_player.speaker"
...@@ -872,6 +932,7 @@ async def test_entity_control(hass: HomeAssistant): ...@@ -872,6 +932,7 @@ async def test_entity_control(hass: HomeAssistant):
) )
chromecast, _ = await async_setup_media_player_cast(hass, info) chromecast, _ = await async_setup_media_player_cast(hass, info)
chromecast.cast_type = pychromecast.const.CAST_TYPE_CHROMECAST
_, conn_status_cb, media_status_cb = get_status_callbacks(chromecast) _, conn_status_cb, media_status_cb = get_status_callbacks(chromecast)
connection_status = MagicMock() connection_status = MagicMock()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment