diff --git a/homeassistant/components/forked_daapd/__init__.py b/homeassistant/components/forked_daapd/__init__.py index 14f40db2057..9dfb92c60c8 100644 --- a/homeassistant/components/forked_daapd/__init__.py +++ b/homeassistant/components/forked_daapd/__init__.py @@ -18,9 +18,10 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Remove forked-daapd component.""" status = await hass.config_entries.async_unload_platforms(entry, PLATFORMS) if status and hass.data.get(DOMAIN) and hass.data[DOMAIN].get(entry.entry_id): - hass.data[DOMAIN][entry.entry_id][ + if websocket_handler := hass.data[DOMAIN][entry.entry_id][ HASS_DATA_UPDATER_KEY - ].websocket_handler.cancel() + ].websocket_handler: + websocket_handler.cancel() for remove_listener in hass.data[DOMAIN][entry.entry_id][ HASS_DATA_REMOVE_LISTENERS_KEY ]: diff --git a/homeassistant/components/forked_daapd/media_player.py b/homeassistant/components/forked_daapd/media_player.py index e1f1ece055b..868ec8e1f9e 100644 --- a/homeassistant/components/forked_daapd/media_player.py +++ b/homeassistant/components/forked_daapd/media_player.py @@ -31,6 +31,7 @@ from homeassistant.components.spotify import ( from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT from homeassistant.core import HomeAssistant, callback +from homeassistant.exceptions import PlatformNotReady from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.dispatcher import ( async_dispatcher_connect, @@ -127,10 +128,10 @@ async def async_setup_entry( forked_daapd_updater = ForkedDaapdUpdater( hass, forked_daapd_api, config_entry.entry_id ) - await forked_daapd_updater.async_init() hass.data[DOMAIN][config_entry.entry_id][ HASS_DATA_UPDATER_KEY ] = forked_daapd_updater + await forked_daapd_updater.async_init() async def update_listener(hass: HomeAssistant, entry: ConfigEntry) -> None: @@ -914,7 +915,8 @@ class ForkedDaapdUpdater: async def async_init(self): """Perform async portion of class initialization.""" - server_config = await self._api.get_request("config") + if not (server_config := await self._api.get_request("config")): + raise PlatformNotReady if websocket_port := server_config.get("websocket_port"): self.websocket_handler = asyncio.create_task( self._api.start_websocket_handler( diff --git a/tests/components/forked_daapd/test_config_flow.py b/tests/components/forked_daapd/test_config_flow.py index 81357b6f3eb..fc02cdb4123 100644 --- a/tests/components/forked_daapd/test_config_flow.py +++ b/tests/components/forked_daapd/test_config_flow.py @@ -1,5 +1,5 @@ """The config flow tests for the forked_daapd media player platform.""" -from unittest.mock import AsyncMock, patch +from unittest.mock import AsyncMock, MagicMock, patch import pytest @@ -12,9 +12,11 @@ from homeassistant.components.forked_daapd.const import ( CONF_TTS_VOLUME, DOMAIN, ) +from homeassistant.components.forked_daapd.media_player import async_setup_entry from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT from homeassistant.core import HomeAssistant +from homeassistant.exceptions import PlatformNotReady from tests.common import MockConfigEntry @@ -242,3 +244,18 @@ async def test_options_flow(hass: HomeAssistant, config_entry) -> None: }, ) assert result["type"] == data_entry_flow.FlowResultType.CREATE_ENTRY + + +async def test_async_setup_entry_not_ready(hass: HomeAssistant, config_entry) -> None: + """Test that a PlatformNotReady exception is thrown during platform setup.""" + + with patch( + "homeassistant.components.forked_daapd.media_player.ForkedDaapdAPI", + autospec=True, + ) as mock_api: + mock_api.return_value.get_request.return_value = None + config_entry.add_to_hass(hass) + with pytest.raises(PlatformNotReady): + await async_setup_entry(hass, config_entry, MagicMock()) + await hass.async_block_till_done() + mock_api.return_value.get_request.assert_called_once()