Move ForkedDaapdUpdater setup to __init__ module (#139733)

* Move ForkedDaapdUpdater setup to __init__ module

* Adjust tests

* One more
pull/139782/head
epenet 2025-03-04 20:24:36 +01:00 committed by GitHub
parent be3d678f23
commit 7359013db0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 44 additions and 33 deletions

View File

@ -1,16 +1,32 @@
"""The forked_daapd component."""
from pyforked_daapd import ForkedDaapdAPI
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import Platform
from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT, Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from .const import DOMAIN, HASS_DATA_UPDATER_KEY
from .coordinator import ForkedDaapdUpdater
PLATFORMS = [Platform.MEDIA_PLAYER]
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Set up forked-daapd from a config entry by forwarding to platform."""
host: str = entry.data[CONF_HOST]
port: int = entry.data[CONF_PORT]
password: str = entry.data[CONF_PASSWORD]
forked_daapd_api = ForkedDaapdAPI(
async_get_clientsession(hass), host, port, password
)
forked_daapd_updater = ForkedDaapdUpdater(hass, forked_daapd_api, entry.entry_id)
if not hass.data.get(DOMAIN):
hass.data[DOMAIN] = {entry.entry_id: {}}
hass.data.setdefault(DOMAIN, {}).setdefault(entry.entry_id, {})[
HASS_DATA_UPDATER_KEY
] = forked_daapd_updater
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
return True

View File

@ -39,6 +39,11 @@ class ForkedDaapdUpdater:
self._all_output_ids: set[str] = set()
self._entry_id = entry_id
@property
def api(self) -> ForkedDaapdAPI:
"""Return the API object."""
return self._api
async def async_init(self) -> None:
"""Perform async portion of class initialization."""
if not (server_config := await self._api.get_request("config")):

View File

@ -7,7 +7,6 @@ from collections import defaultdict
import logging
from typing import Any
from pyforked_daapd import ForkedDaapdAPI
from pylibrespot_java import LibrespotJavaAPI
from homeassistant.components import media_source
@ -29,7 +28,7 @@ from homeassistant.components.spotify import (
spotify_uri_from_media_browser_url,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT
from homeassistant.const import CONF_HOST
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.dispatcher import (
@ -85,12 +84,12 @@ async def async_setup_entry(
async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
"""Set up forked-daapd from a config entry."""
forked_daapd_updater: ForkedDaapdUpdater = hass.data[DOMAIN][config_entry.entry_id][
HASS_DATA_UPDATER_KEY
]
host: str = config_entry.data[CONF_HOST]
port: int = config_entry.data[CONF_PORT]
password: str = config_entry.data[CONF_PASSWORD]
forked_daapd_api = ForkedDaapdAPI(
async_get_clientsession(hass), host, port, password
)
forked_daapd_api = forked_daapd_updater.api
forked_daapd_master = ForkedDaapdMaster(
clientsession=async_get_clientsession(hass),
api=forked_daapd_api,
@ -111,16 +110,8 @@ async def async_setup_entry(
)
config_entry.async_on_unload(config_entry.add_update_listener(update_listener))
if not hass.data.get(DOMAIN):
hass.data[DOMAIN] = {config_entry.entry_id: {}}
async_add_entities([forked_daapd_master], False)
forked_daapd_updater = ForkedDaapdUpdater(
hass, forked_daapd_api, config_entry.entry_id
)
hass.data[DOMAIN][config_entry.entry_id][HASS_DATA_UPDATER_KEY] = (
forked_daapd_updater
)
await forked_daapd_updater.async_init()

View File

@ -34,7 +34,7 @@ async def test_async_browse_media(
await hass.async_block_till_done()
with patch(
"homeassistant.components.forked_daapd.media_player.ForkedDaapdAPI",
"homeassistant.components.forked_daapd.ForkedDaapdAPI",
autospec=True,
) as mock_api:
mock_api.return_value.get_request.return_value = {"websocket_port": 2}
@ -214,7 +214,7 @@ async def test_async_browse_media_not_found(
await hass.async_block_till_done()
with patch(
"homeassistant.components.forked_daapd.media_player.ForkedDaapdAPI",
"homeassistant.components.forked_daapd.ForkedDaapdAPI",
autospec=True,
) as mock_api:
mock_api.return_value.get_request.return_value = {"websocket_port": 2}
@ -375,7 +375,7 @@ async def test_async_browse_image(
"""Test browse media images."""
with patch(
"homeassistant.components.forked_daapd.media_player.ForkedDaapdAPI",
"homeassistant.components.forked_daapd.ForkedDaapdAPI",
autospec=True,
) as mock_api:
mock_api.return_value.get_request.return_value = {"websocket_port": 2}
@ -430,7 +430,7 @@ async def test_async_browse_image_missing(
"""Test browse media images with no image available."""
with patch(
"homeassistant.components.forked_daapd.media_player.ForkedDaapdAPI",
"homeassistant.components.forked_daapd.ForkedDaapdAPI",
autospec=True,
) as mock_api:
mock_api.return_value.get_request.return_value = {"websocket_port": 2}

View File

@ -1,7 +1,7 @@
"""The config flow tests for the forked_daapd media player platform."""
from ipaddress import ip_address
from unittest.mock import AsyncMock, MagicMock, patch
from unittest.mock import AsyncMock, patch
import pytest
@ -12,12 +12,10 @@ 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.config_entries import SOURCE_USER, SOURCE_ZEROCONF, ConfigEntryState
from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT
from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType
from homeassistant.exceptions import PlatformNotReady
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from tests.common import MockConfigEntry
@ -75,7 +73,7 @@ async def test_config_flow(hass: HomeAssistant, config_entry: MockConfigEntry) -
new=AsyncMock(),
) as mock_test_connection,
patch(
"homeassistant.components.forked_daapd.media_player.ForkedDaapdAPI.get_request",
"homeassistant.components.forked_daapd.ForkedDaapdAPI.get_request",
autospec=True,
) as mock_get_request,
):
@ -232,7 +230,7 @@ async def test_options_flow(hass: HomeAssistant, config_entry: MockConfigEntry)
"""Test config flow options."""
with patch(
"homeassistant.components.forked_daapd.media_player.ForkedDaapdAPI.get_request",
"homeassistant.components.forked_daapd.ForkedDaapdAPI.get_request",
autospec=True,
) as mock_get_request:
mock_get_request.return_value = SAMPLE_CONFIG
@ -256,17 +254,18 @@ async def test_options_flow(hass: HomeAssistant, config_entry: MockConfigEntry)
async def test_async_setup_entry_not_ready(
hass: HomeAssistant, config_entry: MockConfigEntry
hass: HomeAssistant, config_entry: MockConfigEntry, caplog: pytest.LogCaptureFixture
) -> None:
"""Test that a PlatformNotReady exception is thrown during platform setup."""
with patch(
"homeassistant.components.forked_daapd.media_player.ForkedDaapdAPI",
"homeassistant.components.forked_daapd.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.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()
mock_api.return_value.get_request.assert_called_once()
assert "Platform forked_daapd not ready yet" in caplog.text
assert config_entry.state is ConfigEntryState.LOADED

View File

@ -313,7 +313,7 @@ async def mock_api_object_fixture(
return get_request_return_values[update_type]
with patch(
"homeassistant.components.forked_daapd.media_player.ForkedDaapdAPI",
"homeassistant.components.forked_daapd.ForkedDaapdAPI",
autospec=True,
) as mock_api:
mock_api.return_value.get_request.side_effect = get_request_side_effect
@ -808,7 +808,7 @@ async def test_invalid_websocket_port(
) -> None:
"""Test invalid websocket port on async_init."""
with patch(
"homeassistant.components.forked_daapd.media_player.ForkedDaapdAPI",
"homeassistant.components.forked_daapd.ForkedDaapdAPI",
autospec=True,
) as mock_api:
mock_api.return_value.get_request.return_value = SAMPLE_CONFIG_NO_WEBSOCKET