mirror of
https://github.com/home-assistant/core.git
synced 2025-12-24 21:06:19 +00:00
Forward media control to playing group (#22566)
* Forward media control to playing group * Fix forwarding control to dynamic group * Fix, add tests
This commit is contained in:
committed by
Paulus Schoutsen
parent
71ecaa4385
commit
54777a81bc
@@ -397,6 +397,112 @@ async def test_dynamic_group_media_states(hass: HomeAssistantType):
|
||||
assert state.state == 'playing'
|
||||
|
||||
|
||||
async def test_group_media_control(hass: HomeAssistantType):
|
||||
"""Test media states are read from group if entity has no state."""
|
||||
info = get_fake_chromecast_info()
|
||||
full_info = attr.evolve(info, model_name='google home',
|
||||
friendly_name='Speaker', uuid=FakeUUID)
|
||||
|
||||
with patch('pychromecast.dial.get_device_status',
|
||||
return_value=full_info):
|
||||
chromecast, entity = await async_setup_media_player_cast(hass, info)
|
||||
|
||||
entity._available = True
|
||||
entity.schedule_update_ha_state()
|
||||
await hass.async_block_till_done()
|
||||
|
||||
state = hass.states.get('media_player.speaker')
|
||||
assert state is not None
|
||||
assert state.name == 'Speaker'
|
||||
assert state.state == 'unknown'
|
||||
assert entity.unique_id == full_info.uuid
|
||||
|
||||
group_media_status = MagicMock(images=None)
|
||||
player_media_status = MagicMock(images=None)
|
||||
|
||||
# Player has no state, group is playing -> Should forward calls to group
|
||||
group_media_status.player_is_playing = True
|
||||
entity.multizone_new_media_status(str(FakeGroupUUID), group_media_status)
|
||||
entity.media_play()
|
||||
grp_media = entity.mz_mgr.get_multizone_mediacontroller(str(FakeGroupUUID))
|
||||
assert grp_media.play.called
|
||||
assert not chromecast.media_controller.play.called
|
||||
|
||||
# Player is paused, group is playing -> Should not forward
|
||||
player_media_status.player_is_playing = False
|
||||
player_media_status.player_is_paused = True
|
||||
entity.new_media_status(player_media_status)
|
||||
entity.media_pause()
|
||||
grp_media = entity.mz_mgr.get_multizone_mediacontroller(str(FakeGroupUUID))
|
||||
assert not grp_media.pause.called
|
||||
assert chromecast.media_controller.pause.called
|
||||
|
||||
# Player is in unknown state, group is playing -> Should forward to group
|
||||
player_media_status.player_state = "UNKNOWN"
|
||||
entity.new_media_status(player_media_status)
|
||||
entity.media_stop()
|
||||
grp_media = entity.mz_mgr.get_multizone_mediacontroller(str(FakeGroupUUID))
|
||||
assert grp_media.stop.called
|
||||
assert not chromecast.media_controller.stop.called
|
||||
|
||||
# Verify play_media is not forwarded
|
||||
entity.play_media(None, None)
|
||||
assert not grp_media.play_media.called
|
||||
assert chromecast.media_controller.play_media.called
|
||||
|
||||
|
||||
async def test_dynamic_group_media_control(hass: HomeAssistantType):
|
||||
"""Test media states are read from group if entity has no state."""
|
||||
info = get_fake_chromecast_info()
|
||||
full_info = attr.evolve(info, model_name='google home',
|
||||
friendly_name='Speaker', uuid=FakeUUID)
|
||||
|
||||
with patch('pychromecast.dial.get_device_status',
|
||||
return_value=full_info):
|
||||
chromecast, entity = await async_setup_media_player_cast(hass, info)
|
||||
|
||||
entity._available = True
|
||||
entity.schedule_update_ha_state()
|
||||
entity._dynamic_group_cast = MagicMock()
|
||||
await hass.async_block_till_done()
|
||||
|
||||
state = hass.states.get('media_player.speaker')
|
||||
assert state is not None
|
||||
assert state.name == 'Speaker'
|
||||
assert state.state == 'unknown'
|
||||
assert entity.unique_id == full_info.uuid
|
||||
|
||||
group_media_status = MagicMock(images=None)
|
||||
player_media_status = MagicMock(images=None)
|
||||
|
||||
# Player has no state, dynamic group is playing -> Should forward
|
||||
group_media_status.player_is_playing = True
|
||||
entity.new_dynamic_group_media_status(group_media_status)
|
||||
entity.media_previous_track()
|
||||
assert entity._dynamic_group_cast.media_controller.rewind.called
|
||||
assert not chromecast.media_controller.rewind.called
|
||||
|
||||
# Player is paused, dynamic group is playing -> Should not forward
|
||||
player_media_status.player_is_playing = False
|
||||
player_media_status.player_is_paused = True
|
||||
entity.new_media_status(player_media_status)
|
||||
entity.media_next_track()
|
||||
assert not entity._dynamic_group_cast.media_controller.skip.called
|
||||
assert chromecast.media_controller.skip.called
|
||||
|
||||
# Player is in unknown state, dynamic group is playing -> Should forward
|
||||
player_media_status.player_state = "UNKNOWN"
|
||||
entity.new_media_status(player_media_status)
|
||||
entity.media_seek(None)
|
||||
assert entity._dynamic_group_cast.media_controller.seek.called
|
||||
assert not chromecast.media_controller.seek.called
|
||||
|
||||
# Verify play_media is not forwarded
|
||||
entity.play_media(None, None)
|
||||
assert not entity._dynamic_group_cast.media_controller.play_media.called
|
||||
assert chromecast.media_controller.play_media.called
|
||||
|
||||
|
||||
async def test_disconnect_on_stop(hass: HomeAssistantType):
|
||||
"""Test cast device disconnects socket on stop."""
|
||||
info = get_fake_chromecast_info()
|
||||
|
||||
Reference in New Issue
Block a user