diff --git a/tests/components/forked_daapd/conftest.py b/tests/components/forked_daapd/conftest.py index b9dd7087aef..e9f315c030c 100644 --- a/tests/components/forked_daapd/conftest.py +++ b/tests/components/forked_daapd/conftest.py @@ -10,7 +10,7 @@ from tests.common import MockConfigEntry @pytest.fixture(name="config_entry") -def config_entry_fixture(): +def config_entry_fixture() -> MockConfigEntry: """Create hass config_entry fixture.""" data = { CONF_HOST: "192.168.1.1", diff --git a/tests/components/forked_daapd/test_browse_media.py b/tests/components/forked_daapd/test_browse_media.py index 805bcac3976..cbd278128ae 100644 --- a/tests/components/forked_daapd/test_browse_media.py +++ b/tests/components/forked_daapd/test_browse_media.py @@ -3,8 +3,6 @@ from http import HTTPStatus from unittest.mock import patch -import pytest - from homeassistant.components import media_source, spotify from homeassistant.components.forked_daapd.browse_media import ( MediaContent, @@ -19,13 +17,16 @@ from homeassistant.components.websocket_api import TYPE_RESULT from homeassistant.core import HomeAssistant from homeassistant.setup import async_setup_component +from tests.common import MockConfigEntry from tests.typing import ClientSessionGenerator, WebSocketGenerator TEST_MASTER_ENTITY_NAME = "media_player.owntone_server" async def test_async_browse_media( - hass: HomeAssistant, hass_ws_client: WebSocketGenerator, config_entry + hass: HomeAssistant, + hass_ws_client: WebSocketGenerator, + config_entry: MockConfigEntry, ) -> None: """Test browse media.""" @@ -203,7 +204,9 @@ async def test_async_browse_media( async def test_async_browse_media_not_found( - hass: HomeAssistant, hass_ws_client: WebSocketGenerator, config_entry + hass: HomeAssistant, + hass_ws_client: WebSocketGenerator, + config_entry: MockConfigEntry, ) -> None: """Test browse media not found.""" @@ -261,7 +264,9 @@ async def test_async_browse_media_not_found( async def test_async_browse_spotify( - hass: HomeAssistant, hass_ws_client: WebSocketGenerator, config_entry + hass: HomeAssistant, + hass_ws_client: WebSocketGenerator, + config_entry: MockConfigEntry, ) -> None: """Test browsing spotify.""" @@ -313,7 +318,9 @@ async def test_async_browse_spotify( async def test_async_browse_media_source( - hass: HomeAssistant, hass_ws_client: WebSocketGenerator, config_entry + hass: HomeAssistant, + hass_ws_client: WebSocketGenerator, + config_entry: MockConfigEntry, ) -> None: """Test browsing media_source.""" @@ -361,7 +368,9 @@ async def test_async_browse_media_source( async def test_async_browse_image( - hass: HomeAssistant, hass_client: ClientSessionGenerator, config_entry + hass: HomeAssistant, + hass_client: ClientSessionGenerator, + config_entry: MockConfigEntry, ) -> None: """Test browse media images.""" @@ -416,8 +425,7 @@ async def test_async_browse_image( async def test_async_browse_image_missing( hass: HomeAssistant, hass_client: ClientSessionGenerator, - config_entry, - caplog: pytest.LogCaptureFixture, + config_entry: MockConfigEntry, ) -> None: """Test browse media images with no image available.""" diff --git a/tests/components/forked_daapd/test_config_flow.py b/tests/components/forked_daapd/test_config_flow.py index 593b527009b..076fffef59b 100644 --- a/tests/components/forked_daapd/test_config_flow.py +++ b/tests/components/forked_daapd/test_config_flow.py @@ -67,7 +67,7 @@ async def test_show_form(hass: HomeAssistant) -> None: assert result["step_id"] == "user" -async def test_config_flow(hass: HomeAssistant, config_entry) -> None: +async def test_config_flow(hass: HomeAssistant, config_entry: MockConfigEntry) -> None: """Test that the user step works.""" with ( patch( @@ -102,7 +102,9 @@ async def test_config_flow(hass: HomeAssistant, config_entry) -> None: assert result["type"] is FlowResultType.ABORT -async def test_zeroconf_updates_title(hass: HomeAssistant, config_entry) -> None: +async def test_zeroconf_updates_title( + hass: HomeAssistant, config_entry: MockConfigEntry +) -> None: """Test that zeroconf updates title and aborts with same host.""" MockConfigEntry(domain=DOMAIN, data={CONF_HOST: "different host"}).add_to_hass(hass) config_entry.add_to_hass(hass) @@ -125,7 +127,9 @@ async def test_zeroconf_updates_title(hass: HomeAssistant, config_entry) -> None assert len(hass.config_entries.async_entries(DOMAIN)) == 2 -async def test_config_flow_no_websocket(hass: HomeAssistant, config_entry) -> None: +async def test_config_flow_no_websocket( + hass: HomeAssistant, config_entry: MockConfigEntry +) -> None: """Test config flow setup without websocket enabled on server.""" with patch( "homeassistant.components.forked_daapd.config_flow.ForkedDaapdAPI.test_connection", @@ -224,7 +228,7 @@ async def test_config_flow_zeroconf_valid(hass: HomeAssistant) -> None: assert result["type"] is FlowResultType.FORM -async def test_options_flow(hass: HomeAssistant, config_entry) -> None: +async def test_options_flow(hass: HomeAssistant, config_entry: MockConfigEntry) -> None: """Test config flow options.""" with patch( @@ -251,7 +255,9 @@ async def test_options_flow(hass: HomeAssistant, config_entry) -> None: assert result["type"] is FlowResultType.CREATE_ENTRY -async def test_async_setup_entry_not_ready(hass: HomeAssistant, config_entry) -> None: +async def test_async_setup_entry_not_ready( + hass: HomeAssistant, config_entry: MockConfigEntry +) -> None: """Test that a PlatformNotReady exception is thrown during platform setup.""" with patch( diff --git a/tests/components/forked_daapd/test_media_player.py b/tests/components/forked_daapd/test_media_player.py index dd2e03f435f..6d7d267eb63 100644 --- a/tests/components/forked_daapd/test_media_player.py +++ b/tests/components/forked_daapd/test_media_player.py @@ -1,6 +1,7 @@ """The media player tests for the forked_daapd media player platform.""" -from unittest.mock import patch +from typing import Any +from unittest.mock import Mock, patch import pytest @@ -63,9 +64,9 @@ from homeassistant.const import ( STATE_PAUSED, STATE_UNAVAILABLE, ) -from homeassistant.core import HomeAssistant +from homeassistant.core import HomeAssistant, ServiceResponse -from tests.common import async_mock_signal +from tests.common import MockConfigEntry, async_mock_signal TEST_MASTER_ENTITY_NAME = "media_player.owntone_server" TEST_ZONE_ENTITY_NAMES = [ @@ -288,7 +289,7 @@ SAMPLE_PLAYLISTS = [{"id": 7, "name": "test_playlist", "uri": "library:playlist: @pytest.fixture(name="get_request_return_values") -async def get_request_return_values_fixture(): +async def get_request_return_values_fixture() -> dict[str, Any]: """Get request return values we can change later.""" return { "config": SAMPLE_CONFIG, @@ -299,7 +300,11 @@ async def get_request_return_values_fixture(): @pytest.fixture(name="mock_api_object") -async def mock_api_object_fixture(hass, config_entry, get_request_return_values): +async def mock_api_object_fixture( + hass: HomeAssistant, + config_entry: MockConfigEntry, + get_request_return_values: dict[str, Any], +) -> Mock: """Create mock api fixture.""" async def get_request_side_effect(update_type): @@ -341,8 +346,9 @@ async def mock_api_object_fixture(hass, config_entry, get_request_return_values) return mock_api.return_value +@pytest.mark.usefixtures("mock_api_object") async def test_unload_config_entry( - hass: HomeAssistant, config_entry, mock_api_object + hass: HomeAssistant, config_entry: MockConfigEntry ) -> None: """Test the player is set unavailable when the config entry is unloaded.""" assert hass.states.get(TEST_MASTER_ENTITY_NAME) @@ -352,7 +358,8 @@ async def test_unload_config_entry( assert hass.states.get(TEST_ZONE_ENTITY_NAMES[0]).state == STATE_UNAVAILABLE -def test_master_state(hass: HomeAssistant, mock_api_object) -> None: +@pytest.mark.usefixtures("mock_api_object") +def test_master_state(hass: HomeAssistant) -> None: """Test master state attributes.""" state = hass.states.get(TEST_MASTER_ENTITY_NAME) assert state.state == STATE_PAUSED @@ -373,7 +380,7 @@ def test_master_state(hass: HomeAssistant, mock_api_object) -> None: async def test_no_update_when_get_request_returns_none( - hass: HomeAssistant, config_entry, mock_api_object + hass: HomeAssistant, config_entry: MockConfigEntry, mock_api_object: Mock ) -> None: """Test when get request returns None.""" @@ -399,8 +406,12 @@ async def test_no_update_when_get_request_returns_none( async def _service_call( - hass, entity_name, service, additional_service_data=None, blocking=True -): + hass: HomeAssistant, + entity_name: str, + service: str, + additional_service_data: dict[str, Any] | None = None, + blocking: bool = True, +) -> ServiceResponse: if additional_service_data is None: additional_service_data = {} return await hass.services.async_call( @@ -411,7 +422,7 @@ async def _service_call( ) -async def test_zone(hass: HomeAssistant, mock_api_object) -> None: +async def test_zone(hass: HomeAssistant, mock_api_object: Mock) -> None: """Test zone attributes and methods.""" zone_entity_name = TEST_ZONE_ENTITY_NAMES[0] state = hass.states.get(zone_entity_name) @@ -450,7 +461,7 @@ async def test_zone(hass: HomeAssistant, mock_api_object) -> None: mock_api_object.change_output.assert_any_call(output_id, selected=True) -async def test_last_outputs_master(hass: HomeAssistant, mock_api_object) -> None: +async def test_last_outputs_master(hass: HomeAssistant, mock_api_object: Mock) -> None: """Test restoration of _last_outputs.""" # Test turning on sends API call await _service_call(hass, TEST_MASTER_ENTITY_NAME, SERVICE_TURN_ON) @@ -467,7 +478,9 @@ async def test_last_outputs_master(hass: HomeAssistant, mock_api_object) -> None async def test_bunch_of_stuff_master( - hass: HomeAssistant, get_request_return_values, mock_api_object + hass: HomeAssistant, + get_request_return_values: dict[str, Any], + mock_api_object: Mock, ) -> None: """Run bunch of stuff.""" await _service_call(hass, TEST_MASTER_ENTITY_NAME, SERVICE_TURN_ON) @@ -551,9 +564,8 @@ async def test_bunch_of_stuff_master( mock_api_object.clear_queue.assert_called_once() -async def test_async_play_media_from_paused( - hass: HomeAssistant, mock_api_object -) -> None: +@pytest.mark.usefixtures("mock_api_object") +async def test_async_play_media_from_paused(hass: HomeAssistant) -> None: """Test async play media from paused.""" initial_state = hass.states.get(TEST_MASTER_ENTITY_NAME) await _service_call( @@ -571,7 +583,9 @@ async def test_async_play_media_from_paused( async def test_async_play_media_announcement_from_stopped( - hass: HomeAssistant, get_request_return_values, mock_api_object + hass: HomeAssistant, + get_request_return_values: dict[str, Any], + mock_api_object: Mock, ) -> None: """Test async play media announcement (from stopped).""" updater_update = mock_api_object.start_websocket_handler.call_args[0][2] @@ -597,9 +611,8 @@ async def test_async_play_media_announcement_from_stopped( assert state.last_updated > initial_state.last_updated -async def test_async_play_media_unsupported( - hass: HomeAssistant, mock_api_object -) -> None: +@pytest.mark.usefixtures("mock_api_object") +async def test_async_play_media_unsupported(hass: HomeAssistant) -> None: """Test async play media on unsupported media type.""" initial_state = hass.states.get(TEST_MASTER_ENTITY_NAME) await _service_call( @@ -616,7 +629,7 @@ async def test_async_play_media_unsupported( async def test_async_play_media_announcement_tts_timeout( - hass: HomeAssistant, mock_api_object + hass: HomeAssistant, mock_api_object: Mock ) -> None: """Test async play media announcement with TTS timeout.""" mock_api_object.add_to_queue.side_effect = None @@ -638,7 +651,7 @@ async def test_async_play_media_announcement_tts_timeout( async def test_use_pipe_control_with_no_api( - hass: HomeAssistant, mock_api_object + hass: HomeAssistant, mock_api_object: Mock ) -> None: """Test using pipe control with no api set.""" await _service_call( @@ -651,7 +664,8 @@ async def test_use_pipe_control_with_no_api( assert mock_api_object.start_playback.call_count == 0 -async def test_clear_source(hass: HomeAssistant, mock_api_object) -> None: +@pytest.mark.usefixtures("mock_api_object") +async def test_clear_source(hass: HomeAssistant) -> None: """Test changing source to clear.""" await _service_call( hass, @@ -665,8 +679,11 @@ async def test_clear_source(hass: HomeAssistant, mock_api_object) -> None: @pytest.fixture(name="pipe_control_api_object") async def pipe_control_api_object_fixture( - hass, config_entry, get_request_return_values, mock_api_object -): + hass: HomeAssistant, + config_entry: MockConfigEntry, + get_request_return_values: dict[str, Any], + mock_api_object: Mock, +) -> Mock: """Fixture for mock librespot_java api.""" with patch( "homeassistant.components.forked_daapd.media_player.LibrespotJavaAPI", @@ -697,9 +714,9 @@ async def pipe_control_api_object_fixture( async def test_librespot_java_stuff( hass: HomeAssistant, - get_request_return_values, - mock_api_object, - pipe_control_api_object, + get_request_return_values: dict[str, Any], + mock_api_object: Mock, + pipe_control_api_object: Mock, ) -> None: """Test options update and librespot-java stuff.""" state = hass.states.get(TEST_MASTER_ENTITY_NAME) @@ -734,9 +751,8 @@ async def test_librespot_java_stuff( assert state.attributes[ATTR_MEDIA_ALBUM_NAME] == "some album" -async def test_librespot_java_play_announcement( - hass: HomeAssistant, pipe_control_api_object -) -> None: +@pytest.mark.usefixtures("pipe_control_api_object") +async def test_librespot_java_play_announcement(hass: HomeAssistant) -> None: """Test play announcement with librespot-java pipe.""" initial_state = hass.states.get(TEST_MASTER_ENTITY_NAME) await _service_call( @@ -755,7 +771,7 @@ async def test_librespot_java_play_announcement( async def test_librespot_java_play_media_pause_timeout( - hass: HomeAssistant, pipe_control_api_object + hass: HomeAssistant, pipe_control_api_object: Mock ) -> None: """Test play media with librespot-java pipe.""" # test media play with pause timeout @@ -778,7 +794,7 @@ async def test_librespot_java_play_media_pause_timeout( assert state.last_updated > initial_state.last_updated -async def test_unsupported_update(hass: HomeAssistant, mock_api_object) -> None: +async def test_unsupported_update(hass: HomeAssistant, mock_api_object: Mock) -> None: """Test unsupported update type.""" last_updated = hass.states.get(TEST_MASTER_ENTITY_NAME).last_updated updater_update = mock_api_object.start_websocket_handler.call_args[0][2] @@ -787,7 +803,9 @@ async def test_unsupported_update(hass: HomeAssistant, mock_api_object) -> None: assert hass.states.get(TEST_MASTER_ENTITY_NAME).last_updated == last_updated -async def test_invalid_websocket_port(hass: HomeAssistant, config_entry) -> None: +async def test_invalid_websocket_port( + hass: HomeAssistant, config_entry: MockConfigEntry +) -> None: """Test invalid websocket port on async_init.""" with patch( "homeassistant.components.forked_daapd.media_player.ForkedDaapdAPI", @@ -800,7 +818,7 @@ async def test_invalid_websocket_port(hass: HomeAssistant, config_entry) -> None assert hass.states.get(TEST_MASTER_ENTITY_NAME).state == STATE_UNAVAILABLE -async def test_websocket_disconnect(hass: HomeAssistant, mock_api_object) -> None: +async def test_websocket_disconnect(hass: HomeAssistant, mock_api_object: Mock) -> None: """Test websocket disconnection.""" assert hass.states.get(TEST_MASTER_ENTITY_NAME).state != STATE_UNAVAILABLE assert hass.states.get(TEST_ZONE_ENTITY_NAMES[0]).state != STATE_UNAVAILABLE @@ -811,7 +829,9 @@ async def test_websocket_disconnect(hass: HomeAssistant, mock_api_object) -> Non assert hass.states.get(TEST_ZONE_ENTITY_NAMES[0]).state == STATE_UNAVAILABLE -async def test_async_play_media_enqueue(hass: HomeAssistant, mock_api_object) -> None: +async def test_async_play_media_enqueue( + hass: HomeAssistant, mock_api_object: Mock +) -> None: """Test async play media with different enqueue options.""" initial_state = hass.states.get(TEST_MASTER_ENTITY_NAME) await _service_call( @@ -887,7 +907,7 @@ async def test_async_play_media_enqueue(hass: HomeAssistant, mock_api_object) -> ) -async def test_play_owntone_media(hass: HomeAssistant, mock_api_object) -> None: +async def test_play_owntone_media(hass: HomeAssistant, mock_api_object: Mock) -> None: """Test async play media with an owntone source.""" initial_state = hass.states.get(TEST_MASTER_ENTITY_NAME) await _service_call( @@ -913,7 +933,7 @@ async def test_play_owntone_media(hass: HomeAssistant, mock_api_object) -> None: ) -async def test_play_spotify_media(hass: HomeAssistant, mock_api_object) -> None: +async def test_play_spotify_media(hass: HomeAssistant, mock_api_object: Mock) -> None: """Test async play media with a spotify source.""" initial_state = hass.states.get(TEST_MASTER_ENTITY_NAME) await _service_call( @@ -937,7 +957,7 @@ async def test_play_spotify_media(hass: HomeAssistant, mock_api_object) -> None: ) -async def test_play_media_source(hass: HomeAssistant, mock_api_object) -> None: +async def test_play_media_source(hass: HomeAssistant, mock_api_object: Mock) -> None: """Test async play media with a spotify source.""" initial_state = hass.states.get(TEST_MASTER_ENTITY_NAME) with patch(