From 3cf52a4767f3fb6983886f69167b1ad658094a60 Mon Sep 17 00:00:00 2001 From: Pete Sage <76050312+PeteRager@users.noreply.github.com> Date: Sat, 22 Jun 2024 13:13:37 -0400 Subject: [PATCH] Sonos add tests for media_player.play_media share link (#120169) --- tests/components/sonos/conftest.py | 11 ++ tests/components/sonos/test_media_player.py | 128 ++++++++++++++++++++ 2 files changed, 139 insertions(+) diff --git a/tests/components/sonos/conftest.py b/tests/components/sonos/conftest.py index 378989c58fa..51dd2b9047c 100644 --- a/tests/components/sonos/conftest.py +++ b/tests/components/sonos/conftest.py @@ -237,6 +237,17 @@ def patch_gethostbyname(host: str) -> str: return host +@pytest.fixture(name="soco_sharelink") +def soco_sharelink(): + """Fixture to mock soco.plugins.sharelink.ShareLinkPlugin.""" + with patch("homeassistant.components.sonos.speaker.ShareLinkPlugin") as mock_share: + mock_instance = MagicMock() + mock_instance.is_share_link.return_value = True + mock_instance.add_share_link_to_queue.return_value = 10 + mock_share.return_value = mock_instance + yield mock_instance + + @pytest.fixture(name="soco_factory") def soco_factory( music_library, speaker_info, current_track_info_empty, battery_info, alarm_clock diff --git a/tests/components/sonos/test_media_player.py b/tests/components/sonos/test_media_player.py index a975538cdec..ab9b598bb04 100644 --- a/tests/components/sonos/test_media_player.py +++ b/tests/components/sonos/test_media_player.py @@ -302,6 +302,134 @@ async def test_play_media_lib_track_add( assert soco_mock.play_from_queue.call_count == 0 +_share_link: str = "spotify:playlist:abcdefghij0123456789XY" + + +async def test_play_media_share_link_add( + hass: HomeAssistant, + soco_factory: SoCoMockFactory, + async_autosetup_sonos, + soco_sharelink, +) -> None: + """Tests playing a share link with enqueue option add.""" + await hass.services.async_call( + MP_DOMAIN, + SERVICE_PLAY_MEDIA, + { + "entity_id": "media_player.zone_a", + "media_content_type": "playlist", + "media_content_id": _share_link, + ATTR_MEDIA_ENQUEUE: MediaPlayerEnqueue.ADD, + }, + blocking=True, + ) + assert soco_sharelink.add_share_link_to_queue.call_count == 1 + assert ( + soco_sharelink.add_share_link_to_queue.call_args_list[0].args[0] == _share_link + ) + assert ( + soco_sharelink.add_share_link_to_queue.call_args_list[0].kwargs["timeout"] + == LONG_SERVICE_TIMEOUT + ) + + +async def test_play_media_share_link_next( + hass: HomeAssistant, + soco_factory: SoCoMockFactory, + async_autosetup_sonos, + soco_sharelink, +) -> None: + """Tests playing a share link with enqueue option next.""" + await hass.services.async_call( + MP_DOMAIN, + SERVICE_PLAY_MEDIA, + { + "entity_id": "media_player.zone_a", + "media_content_type": "playlist", + "media_content_id": _share_link, + ATTR_MEDIA_ENQUEUE: MediaPlayerEnqueue.NEXT, + }, + blocking=True, + ) + assert soco_sharelink.add_share_link_to_queue.call_count == 1 + assert ( + soco_sharelink.add_share_link_to_queue.call_args_list[0].args[0] == _share_link + ) + assert ( + soco_sharelink.add_share_link_to_queue.call_args_list[0].kwargs["timeout"] + == LONG_SERVICE_TIMEOUT + ) + assert ( + soco_sharelink.add_share_link_to_queue.call_args_list[0].kwargs["position"] == 1 + ) + + +async def test_play_media_share_link_play( + hass: HomeAssistant, + soco_factory: SoCoMockFactory, + async_autosetup_sonos, + soco_sharelink, +) -> None: + """Tests playing a share link with enqueue option play.""" + soco_mock = soco_factory.mock_list.get("192.168.42.2") + await hass.services.async_call( + MP_DOMAIN, + SERVICE_PLAY_MEDIA, + { + "entity_id": "media_player.zone_a", + "media_content_type": "playlist", + "media_content_id": _share_link, + ATTR_MEDIA_ENQUEUE: MediaPlayerEnqueue.PLAY, + }, + blocking=True, + ) + assert soco_sharelink.add_share_link_to_queue.call_count == 1 + assert ( + soco_sharelink.add_share_link_to_queue.call_args_list[0].args[0] == _share_link + ) + assert ( + soco_sharelink.add_share_link_to_queue.call_args_list[0].kwargs["timeout"] + == LONG_SERVICE_TIMEOUT + ) + assert ( + soco_sharelink.add_share_link_to_queue.call_args_list[0].kwargs["position"] == 1 + ) + assert soco_mock.play_from_queue.call_count == 1 + soco_mock.play_from_queue.assert_called_with(9) + + +async def test_play_media_share_link_replace( + hass: HomeAssistant, + soco_factory: SoCoMockFactory, + async_autosetup_sonos, + soco_sharelink, +) -> None: + """Tests playing a share link with enqueue option replace.""" + soco_mock = soco_factory.mock_list.get("192.168.42.2") + await hass.services.async_call( + MP_DOMAIN, + SERVICE_PLAY_MEDIA, + { + "entity_id": "media_player.zone_a", + "media_content_type": "playlist", + "media_content_id": _share_link, + ATTR_MEDIA_ENQUEUE: MediaPlayerEnqueue.REPLACE, + }, + blocking=True, + ) + assert soco_mock.clear_queue.call_count == 1 + assert soco_sharelink.add_share_link_to_queue.call_count == 1 + assert ( + soco_sharelink.add_share_link_to_queue.call_args_list[0].args[0] == _share_link + ) + assert ( + soco_sharelink.add_share_link_to_queue.call_args_list[0].kwargs["timeout"] + == LONG_SERVICE_TIMEOUT + ) + assert soco_mock.play_from_queue.call_count == 1 + soco_mock.play_from_queue.assert_called_with(0) + + _mock_playlists = [ MockMusicServiceItem( "playlist1",