From 71898d0c8c83e617ccde65f005d72eec08836254 Mon Sep 17 00:00:00 2001 From: Joost Lekkerkerker Date: Fri, 11 Oct 2024 13:58:04 +0200 Subject: [PATCH] Add snapshot testing to Spotify (#128032) * Add snapshot testing to Spotify * Fix --- .../spotify/snapshots/test_media_player.ambr | 125 ++++++++++++++++++ tests/components/spotify/test_media_player.py | 71 +++------- 2 files changed, 144 insertions(+), 52 deletions(-) create mode 100644 tests/components/spotify/snapshots/test_media_player.ambr diff --git a/tests/components/spotify/snapshots/test_media_player.ambr b/tests/components/spotify/snapshots/test_media_player.ambr new file mode 100644 index 00000000000..c7861788d9c --- /dev/null +++ b/tests/components/spotify/snapshots/test_media_player.ambr @@ -0,0 +1,125 @@ +# serializer version: 1 +# name: test_entities[media_player.spotify_spotify_1-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'media_player', + 'entity_category': None, + 'entity_id': 'media_player.spotify_spotify_1', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': None, + 'platform': 'spotify', + 'previous_unique_id': None, + 'supported_features': , + 'translation_key': 'spotify', + 'unique_id': '1112264111', + 'unit_of_measurement': None, + }) +# --- +# name: test_entities[media_player.spotify_spotify_1-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'entity_picture': '/api/media_player_proxy/media_player.spotify_spotify_1?token=mock-token&cache=7bb89748322acb6c', + 'friendly_name': 'Spotify spotify_1', + 'media_album_name': 'Permanent Waves', + 'media_artist': 'Rush', + 'media_content_id': 'spotify:track:4e9hUiLsN4mx61ARosFi7p', + 'media_content_type': , + 'media_duration': 296.466, + 'media_playlist': 'Spotify Web API Testing playlist', + 'media_position': 249.367, + 'media_position_updated_at': HAFakeDatetime(2023, 10, 21, 0, 0, tzinfo=datetime.timezone.utc), + 'media_title': 'The Spirit Of Radio', + 'media_track': 1, + 'repeat': , + 'shuffle': False, + 'source': 'Master Bathroom Speaker', + 'supported_features': , + 'volume_level': 0.25, + }), + 'context': , + 'entity_id': 'media_player.spotify_spotify_1', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'playing', + }) +# --- +# name: test_podcast[media_player.spotify_spotify_1-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + }), + 'config_entry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'media_player', + 'entity_category': None, + 'entity_id': 'media_player.spotify_spotify_1', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': None, + 'platform': 'spotify', + 'previous_unique_id': None, + 'supported_features': , + 'translation_key': 'spotify', + 'unique_id': '1112264111', + 'unit_of_measurement': None, + }) +# --- +# name: test_podcast[media_player.spotify_spotify_1-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'entity_picture': '/api/media_player_proxy/media_player.spotify_spotify_1?token=mock-token&cache=cf1e6e1e830f08d3', + 'friendly_name': 'Spotify spotify_1', + 'media_album_name': 'Safety Third', + 'media_artist': 'Safety Third ', + 'media_content_id': 'spotify:episode:3o0RYoo5iOMKSmEbunsbvW', + 'media_content_type': , + 'media_duration': 3690.161, + 'media_position': 5.41, + 'media_position_updated_at': HAFakeDatetime(2023, 10, 21, 0, 0, tzinfo=datetime.timezone.utc), + 'media_title': 'My Squirrel Has Brain Damage - Safety Third 119', + 'repeat': , + 'shuffle': False, + 'source': 'Sonos Roam SL', + 'supported_features': , + 'volume_level': 0.46, + }), + 'context': , + 'entity_id': 'media_player.spotify_spotify_1', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'playing', + }) +# --- diff --git a/tests/components/spotify/test_media_player.py b/tests/components/spotify/test_media_player.py index 07e20eca35f..bbcee3c70bb 100644 --- a/tests/components/spotify/test_media_player.py +++ b/tests/components/spotify/test_media_player.py @@ -1,9 +1,10 @@ """Tests for the Spotify media player platform.""" -from unittest.mock import MagicMock +from unittest.mock import MagicMock, patch import pytest from spotipy import SpotifyException +from syrupy import SnapshotAssertion from homeassistant.components.media_player import ( MediaPlayerEntityFeature, @@ -15,80 +16,46 @@ from homeassistant.helpers import entity_registry as er from . import setup_integration -from tests.common import MockConfigEntry, load_json_value_fixture +from tests.common import MockConfigEntry, load_json_value_fixture, snapshot_platform +@pytest.mark.freeze_time("2023-10-21") @pytest.mark.usefixtures("setup_credentials") async def test_entities( hass: HomeAssistant, mock_spotify: MagicMock, mock_config_entry: MockConfigEntry, entity_registry: er.EntityRegistry, + snapshot: SnapshotAssertion, ) -> None: """Test the Spotify entities.""" - await setup_integration(hass, mock_config_entry) - state = hass.states.get("media_player.spotify_spotify_1") - assert state - assert state.state == MediaPlayerState.PLAYING - assert state.attributes["media_content_type"] == "music" - assert state.attributes["media_duration"] == 296.466 - assert state.attributes["media_position"] == 249.367 - assert "media_position_updated_at" in state.attributes - assert state.attributes["media_title"] == "The Spirit Of Radio" - assert state.attributes["media_artist"] == "Rush" - assert state.attributes["media_album_name"] == "Permanent Waves" - assert state.attributes["media_track"] == 1 - assert state.attributes["repeat"] == "off" - assert state.attributes["shuffle"] is False - assert state.attributes["volume_level"] == 0.25 - assert state.attributes["source"] == "Master Bathroom Speaker" - assert state.attributes["supported_features"] == ( - MediaPlayerEntityFeature.BROWSE_MEDIA - | MediaPlayerEntityFeature.NEXT_TRACK - | MediaPlayerEntityFeature.PAUSE - | MediaPlayerEntityFeature.PLAY - | MediaPlayerEntityFeature.PLAY_MEDIA - | MediaPlayerEntityFeature.PREVIOUS_TRACK - | MediaPlayerEntityFeature.REPEAT_SET - | MediaPlayerEntityFeature.SEEK - | MediaPlayerEntityFeature.SELECT_SOURCE - | MediaPlayerEntityFeature.SHUFFLE_SET - | MediaPlayerEntityFeature.VOLUME_SET - ) + with patch("secrets.token_hex", return_value="mock-token"): + await setup_integration(hass, mock_config_entry) + + await snapshot_platform( + hass, entity_registry, snapshot, mock_config_entry.entry_id + ) +@pytest.mark.freeze_time("2023-10-21") @pytest.mark.usefixtures("setup_credentials") async def test_podcast( hass: HomeAssistant, mock_spotify: MagicMock, mock_config_entry: MockConfigEntry, entity_registry: er.EntityRegistry, + snapshot: SnapshotAssertion, ) -> None: """Test the Spotify entities while listening a podcast.""" mock_spotify.return_value.current_playback.return_value = load_json_value_fixture( "playback_episode.json", DOMAIN ) - await setup_integration(hass, mock_config_entry) - state = hass.states.get("media_player.spotify_spotify_1") - assert state - assert state.state == MediaPlayerState.PLAYING - assert state.attributes["media_content_type"] == "podcast" - assert state.attributes["media_duration"] == 3690.161 - assert state.attributes["media_position"] == 5.41 - assert "media_position_updated_at" in state.attributes - assert ( - state.attributes["media_title"] - == "My Squirrel Has Brain Damage - Safety Third 119" - ) - assert state.attributes["media_artist"] == "Safety Third " - assert state.attributes["media_album_name"] == "Safety Third" - assert state.attributes["repeat"] == "off" - assert state.attributes["shuffle"] is False - assert state.attributes["volume_level"] == 0.46 - assert state.attributes["source"] == "Sonos Roam SL" - assert ( - state.attributes["supported_features"] == MediaPlayerEntityFeature.SELECT_SOURCE - ) + with patch("secrets.token_hex", return_value="mock-token"): + await setup_integration(hass, mock_config_entry) + + await snapshot_platform( + hass, entity_registry, snapshot, mock_config_entry.entry_id + ) @pytest.mark.usefixtures("setup_credentials")