Raise PlatformNotReady on initial OwnTone connection failure (#97257)

This commit is contained in:
uvjustin 2023-08-04 18:54:54 +08:00 committed by GitHub
parent d78e39d568
commit 9282cb21ab
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 5 deletions

View File

@ -18,9 +18,10 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Remove forked-daapd component.""" """Remove forked-daapd component."""
status = await hass.config_entries.async_unload_platforms(entry, PLATFORMS) 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): 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 HASS_DATA_UPDATER_KEY
].websocket_handler.cancel() ].websocket_handler:
websocket_handler.cancel()
for remove_listener in hass.data[DOMAIN][entry.entry_id][ for remove_listener in hass.data[DOMAIN][entry.entry_id][
HASS_DATA_REMOVE_LISTENERS_KEY HASS_DATA_REMOVE_LISTENERS_KEY
]: ]:

View File

@ -31,6 +31,7 @@ from homeassistant.components.spotify import (
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.exceptions import PlatformNotReady
from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.dispatcher import ( from homeassistant.helpers.dispatcher import (
async_dispatcher_connect, async_dispatcher_connect,
@ -127,10 +128,10 @@ async def async_setup_entry(
forked_daapd_updater = ForkedDaapdUpdater( forked_daapd_updater = ForkedDaapdUpdater(
hass, forked_daapd_api, config_entry.entry_id hass, forked_daapd_api, config_entry.entry_id
) )
await forked_daapd_updater.async_init()
hass.data[DOMAIN][config_entry.entry_id][ hass.data[DOMAIN][config_entry.entry_id][
HASS_DATA_UPDATER_KEY HASS_DATA_UPDATER_KEY
] = forked_daapd_updater ] = forked_daapd_updater
await forked_daapd_updater.async_init()
async def update_listener(hass: HomeAssistant, entry: ConfigEntry) -> None: async def update_listener(hass: HomeAssistant, entry: ConfigEntry) -> None:
@ -914,7 +915,8 @@ class ForkedDaapdUpdater:
async def async_init(self): async def async_init(self):
"""Perform async portion of class initialization.""" """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"): if websocket_port := server_config.get("websocket_port"):
self.websocket_handler = asyncio.create_task( self.websocket_handler = asyncio.create_task(
self._api.start_websocket_handler( self._api.start_websocket_handler(

View File

@ -1,5 +1,5 @@
"""The config flow tests for the forked_daapd media player platform.""" """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 import pytest
@ -12,9 +12,11 @@ from homeassistant.components.forked_daapd.const import (
CONF_TTS_VOLUME, CONF_TTS_VOLUME,
DOMAIN, DOMAIN,
) )
from homeassistant.components.forked_daapd.media_player import async_setup_entry
from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF
from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.exceptions import PlatformNotReady
from tests.common import MockConfigEntry 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 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()