Move ForkedDaapdUpdater setup to __init__ module (#139733)
* Move ForkedDaapdUpdater setup to __init__ module * Adjust tests * One morepull/139782/head
parent
be3d678f23
commit
7359013db0
|
@ -1,16 +1,32 @@
|
||||||
"""The forked_daapd component."""
|
"""The forked_daapd component."""
|
||||||
|
|
||||||
|
from pyforked_daapd import ForkedDaapdAPI
|
||||||
|
|
||||||
from homeassistant.config_entries import ConfigEntry
|
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.core import HomeAssistant
|
||||||
|
from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
||||||
|
|
||||||
from .const import DOMAIN, HASS_DATA_UPDATER_KEY
|
from .const import DOMAIN, HASS_DATA_UPDATER_KEY
|
||||||
|
from .coordinator import ForkedDaapdUpdater
|
||||||
|
|
||||||
PLATFORMS = [Platform.MEDIA_PLAYER]
|
PLATFORMS = [Platform.MEDIA_PLAYER]
|
||||||
|
|
||||||
|
|
||||||
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
||||||
"""Set up forked-daapd from a config entry by forwarding to platform."""
|
"""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)
|
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
|
@ -39,6 +39,11 @@ class ForkedDaapdUpdater:
|
||||||
self._all_output_ids: set[str] = set()
|
self._all_output_ids: set[str] = set()
|
||||||
self._entry_id = entry_id
|
self._entry_id = entry_id
|
||||||
|
|
||||||
|
@property
|
||||||
|
def api(self) -> ForkedDaapdAPI:
|
||||||
|
"""Return the API object."""
|
||||||
|
return self._api
|
||||||
|
|
||||||
async def async_init(self) -> None:
|
async def async_init(self) -> None:
|
||||||
"""Perform async portion of class initialization."""
|
"""Perform async portion of class initialization."""
|
||||||
if not (server_config := await self._api.get_request("config")):
|
if not (server_config := await self._api.get_request("config")):
|
||||||
|
|
|
@ -7,7 +7,6 @@ from collections import defaultdict
|
||||||
import logging
|
import logging
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
from pyforked_daapd import ForkedDaapdAPI
|
|
||||||
from pylibrespot_java import LibrespotJavaAPI
|
from pylibrespot_java import LibrespotJavaAPI
|
||||||
|
|
||||||
from homeassistant.components import media_source
|
from homeassistant.components import media_source
|
||||||
|
@ -29,7 +28,7 @@ from homeassistant.components.spotify import (
|
||||||
spotify_uri_from_media_browser_url,
|
spotify_uri_from_media_browser_url,
|
||||||
)
|
)
|
||||||
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
|
||||||
from homeassistant.core import HomeAssistant, callback
|
from homeassistant.core import HomeAssistant, callback
|
||||||
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 (
|
||||||
|
@ -85,12 +84,12 @@ async def async_setup_entry(
|
||||||
async_add_entities: AddConfigEntryEntitiesCallback,
|
async_add_entities: AddConfigEntryEntitiesCallback,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Set up forked-daapd from a config entry."""
|
"""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]
|
host: str = config_entry.data[CONF_HOST]
|
||||||
port: int = config_entry.data[CONF_PORT]
|
forked_daapd_api = forked_daapd_updater.api
|
||||||
password: str = config_entry.data[CONF_PASSWORD]
|
|
||||||
forked_daapd_api = ForkedDaapdAPI(
|
|
||||||
async_get_clientsession(hass), host, port, password
|
|
||||||
)
|
|
||||||
forked_daapd_master = ForkedDaapdMaster(
|
forked_daapd_master = ForkedDaapdMaster(
|
||||||
clientsession=async_get_clientsession(hass),
|
clientsession=async_get_clientsession(hass),
|
||||||
api=forked_daapd_api,
|
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))
|
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)
|
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()
|
await forked_daapd_updater.async_init()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ async def test_async_browse_media(
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
with patch(
|
with patch(
|
||||||
"homeassistant.components.forked_daapd.media_player.ForkedDaapdAPI",
|
"homeassistant.components.forked_daapd.ForkedDaapdAPI",
|
||||||
autospec=True,
|
autospec=True,
|
||||||
) as mock_api:
|
) as mock_api:
|
||||||
mock_api.return_value.get_request.return_value = {"websocket_port": 2}
|
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()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
with patch(
|
with patch(
|
||||||
"homeassistant.components.forked_daapd.media_player.ForkedDaapdAPI",
|
"homeassistant.components.forked_daapd.ForkedDaapdAPI",
|
||||||
autospec=True,
|
autospec=True,
|
||||||
) as mock_api:
|
) as mock_api:
|
||||||
mock_api.return_value.get_request.return_value = {"websocket_port": 2}
|
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."""
|
"""Test browse media images."""
|
||||||
|
|
||||||
with patch(
|
with patch(
|
||||||
"homeassistant.components.forked_daapd.media_player.ForkedDaapdAPI",
|
"homeassistant.components.forked_daapd.ForkedDaapdAPI",
|
||||||
autospec=True,
|
autospec=True,
|
||||||
) as mock_api:
|
) as mock_api:
|
||||||
mock_api.return_value.get_request.return_value = {"websocket_port": 2}
|
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."""
|
"""Test browse media images with no image available."""
|
||||||
|
|
||||||
with patch(
|
with patch(
|
||||||
"homeassistant.components.forked_daapd.media_player.ForkedDaapdAPI",
|
"homeassistant.components.forked_daapd.ForkedDaapdAPI",
|
||||||
autospec=True,
|
autospec=True,
|
||||||
) as mock_api:
|
) as mock_api:
|
||||||
mock_api.return_value.get_request.return_value = {"websocket_port": 2}
|
mock_api.return_value.get_request.return_value = {"websocket_port": 2}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
"""The config flow tests for the forked_daapd media player platform."""
|
"""The config flow tests for the forked_daapd media player platform."""
|
||||||
|
|
||||||
from ipaddress import ip_address
|
from ipaddress import ip_address
|
||||||
from unittest.mock import AsyncMock, MagicMock, patch
|
from unittest.mock import AsyncMock, patch
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
@ -12,12 +12,10 @@ 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, ConfigEntryState
|
||||||
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.data_entry_flow import FlowResultType
|
from homeassistant.data_entry_flow import FlowResultType
|
||||||
from homeassistant.exceptions import PlatformNotReady
|
|
||||||
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
|
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
|
||||||
|
|
||||||
from tests.common import MockConfigEntry
|
from tests.common import MockConfigEntry
|
||||||
|
@ -75,7 +73,7 @@ async def test_config_flow(hass: HomeAssistant, config_entry: MockConfigEntry) -
|
||||||
new=AsyncMock(),
|
new=AsyncMock(),
|
||||||
) as mock_test_connection,
|
) as mock_test_connection,
|
||||||
patch(
|
patch(
|
||||||
"homeassistant.components.forked_daapd.media_player.ForkedDaapdAPI.get_request",
|
"homeassistant.components.forked_daapd.ForkedDaapdAPI.get_request",
|
||||||
autospec=True,
|
autospec=True,
|
||||||
) as mock_get_request,
|
) as mock_get_request,
|
||||||
):
|
):
|
||||||
|
@ -232,7 +230,7 @@ async def test_options_flow(hass: HomeAssistant, config_entry: MockConfigEntry)
|
||||||
"""Test config flow options."""
|
"""Test config flow options."""
|
||||||
|
|
||||||
with patch(
|
with patch(
|
||||||
"homeassistant.components.forked_daapd.media_player.ForkedDaapdAPI.get_request",
|
"homeassistant.components.forked_daapd.ForkedDaapdAPI.get_request",
|
||||||
autospec=True,
|
autospec=True,
|
||||||
) as mock_get_request:
|
) as mock_get_request:
|
||||||
mock_get_request.return_value = SAMPLE_CONFIG
|
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(
|
async def test_async_setup_entry_not_ready(
|
||||||
hass: HomeAssistant, config_entry: MockConfigEntry
|
hass: HomeAssistant, config_entry: MockConfigEntry, caplog: pytest.LogCaptureFixture
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Test that a PlatformNotReady exception is thrown during platform setup."""
|
"""Test that a PlatformNotReady exception is thrown during platform setup."""
|
||||||
|
|
||||||
with patch(
|
with patch(
|
||||||
"homeassistant.components.forked_daapd.media_player.ForkedDaapdAPI",
|
"homeassistant.components.forked_daapd.ForkedDaapdAPI",
|
||||||
autospec=True,
|
autospec=True,
|
||||||
) as mock_api:
|
) as mock_api:
|
||||||
mock_api.return_value.get_request.return_value = None
|
mock_api.return_value.get_request.return_value = None
|
||||||
config_entry.add_to_hass(hass)
|
config_entry.add_to_hass(hass)
|
||||||
with pytest.raises(PlatformNotReady):
|
await hass.config_entries.async_setup(config_entry.entry_id)
|
||||||
await async_setup_entry(hass, config_entry, MagicMock())
|
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
mock_api.return_value.get_request.assert_called_once()
|
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
|
||||||
|
|
|
@ -313,7 +313,7 @@ async def mock_api_object_fixture(
|
||||||
return get_request_return_values[update_type]
|
return get_request_return_values[update_type]
|
||||||
|
|
||||||
with patch(
|
with patch(
|
||||||
"homeassistant.components.forked_daapd.media_player.ForkedDaapdAPI",
|
"homeassistant.components.forked_daapd.ForkedDaapdAPI",
|
||||||
autospec=True,
|
autospec=True,
|
||||||
) as mock_api:
|
) as mock_api:
|
||||||
mock_api.return_value.get_request.side_effect = get_request_side_effect
|
mock_api.return_value.get_request.side_effect = get_request_side_effect
|
||||||
|
@ -808,7 +808,7 @@ async def test_invalid_websocket_port(
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Test invalid websocket port on async_init."""
|
"""Test invalid websocket port on async_init."""
|
||||||
with patch(
|
with patch(
|
||||||
"homeassistant.components.forked_daapd.media_player.ForkedDaapdAPI",
|
"homeassistant.components.forked_daapd.ForkedDaapdAPI",
|
||||||
autospec=True,
|
autospec=True,
|
||||||
) as mock_api:
|
) as mock_api:
|
||||||
mock_api.return_value.get_request.return_value = SAMPLE_CONFIG_NO_WEBSOCKET
|
mock_api.return_value.get_request.return_value = SAMPLE_CONFIG_NO_WEBSOCKET
|
||||||
|
|
Loading…
Reference in New Issue