mirror of
https://github.com/home-assistant/core.git
synced 2025-07-28 07:37:34 +00:00
* apply suggestions from #42697 * fix tests * use MockConfigEntry for test * use hass.config_entries.async_setup() * disable default fixture * rename marker to no_bypass_setup
This commit is contained in:
parent
467d79c7fd
commit
60314ecc61
@ -185,7 +185,7 @@ async def async_setup_entry(hass: HomeAssistantType, entry: ConfigEntry):
|
|||||||
try:
|
try:
|
||||||
await api.async_setup()
|
await api.async_setup()
|
||||||
except (SynologyDSMLoginFailedException, SynologyDSMRequestException) as err:
|
except (SynologyDSMLoginFailedException, SynologyDSMRequestException) as err:
|
||||||
_LOGGER.debug("async_setup_entry - Unable to connect to DSM: %s", str(err))
|
_LOGGER.debug("async_setup_entry - Unable to connect to DSM: %s", err)
|
||||||
raise ConfigEntryNotReady from err
|
raise ConfigEntryNotReady from err
|
||||||
|
|
||||||
undo_listener = entry.add_update_listener(_async_update_listener)
|
undo_listener = entry.add_update_listener(_async_update_listener)
|
||||||
@ -244,9 +244,6 @@ async def _async_setup_services(hass: HomeAssistantType):
|
|||||||
|
|
||||||
async def service_handler(call: ServiceCall):
|
async def service_handler(call: ServiceCall):
|
||||||
"""Handle service call."""
|
"""Handle service call."""
|
||||||
_LOGGER.debug(
|
|
||||||
"service_handler - called as '%s' with data: %s", call.service, call.data
|
|
||||||
)
|
|
||||||
serial = call.data.get(CONF_SERIAL)
|
serial = call.data.get(CONF_SERIAL)
|
||||||
dsm_devices = hass.data[DOMAIN]
|
dsm_devices = hass.data[DOMAIN]
|
||||||
|
|
||||||
@ -268,7 +265,7 @@ async def _async_setup_services(hass: HomeAssistantType):
|
|||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
_LOGGER.info("%s DSM with serial %s", call.service, serial)
|
_LOGGER.debug("%s DSM with serial %s", call.service, serial)
|
||||||
dsm_api = dsm_device[SYNO_API]
|
dsm_api = dsm_device[SYNO_API]
|
||||||
if call.service == SERVICE_REBOOT:
|
if call.service == SERVICE_REBOOT:
|
||||||
await dsm_api.async_reboot()
|
await dsm_api.async_reboot()
|
||||||
@ -276,9 +273,6 @@ async def _async_setup_services(hass: HomeAssistantType):
|
|||||||
await dsm_api.system.shutdown()
|
await dsm_api.system.shutdown()
|
||||||
|
|
||||||
for service in SERVICES:
|
for service in SERVICES:
|
||||||
_LOGGER.debug(
|
|
||||||
"_async_setup_services - register service %s on domain %s", service, DOMAIN
|
|
||||||
)
|
|
||||||
hass.services.async_register(DOMAIN, service, service_handler)
|
hass.services.async_register(DOMAIN, service, service_handler)
|
||||||
|
|
||||||
|
|
||||||
@ -445,14 +439,14 @@ class SynoApi:
|
|||||||
if not self.system:
|
if not self.system:
|
||||||
_LOGGER.debug("async_reboot - System API not ready: %s", self)
|
_LOGGER.debug("async_reboot - System API not ready: %s", self)
|
||||||
return
|
return
|
||||||
self._hass.async_add_executor_job(self.system.reboot)
|
await self._hass.async_add_executor_job(self.system.reboot)
|
||||||
|
|
||||||
async def async_shutdown(self):
|
async def async_shutdown(self):
|
||||||
"""Shutdown NAS."""
|
"""Shutdown NAS."""
|
||||||
if not self.system:
|
if not self.system:
|
||||||
_LOGGER.debug("async_shutdown - System API not ready: %s", self)
|
_LOGGER.debug("async_shutdown - System API not ready: %s", self)
|
||||||
return
|
return
|
||||||
self._hass.async_add_executor_job(self.system.shutdown)
|
await self._hass.async_add_executor_job(self.system.shutdown)
|
||||||
|
|
||||||
async def async_unload(self):
|
async def async_unload(self):
|
||||||
"""Stop interacting with the NAS and prepare for removal from hass."""
|
"""Stop interacting with the NAS and prepare for removal from hass."""
|
||||||
@ -465,13 +459,14 @@ class SynoApi:
|
|||||||
await self._hass.async_add_executor_job(
|
await self._hass.async_add_executor_job(
|
||||||
self.dsm.update, self._with_information
|
self.dsm.update, self._with_information
|
||||||
)
|
)
|
||||||
async_dispatcher_send(self._hass, self.signal_sensor_update)
|
|
||||||
except (SynologyDSMLoginFailedException, SynologyDSMRequestException) as err:
|
except (SynologyDSMLoginFailedException, SynologyDSMRequestException) as err:
|
||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
"async_update - connection error during update, fallback by reloading the entry"
|
"async_update - connection error during update, fallback by reloading the entry"
|
||||||
)
|
)
|
||||||
_LOGGER.debug("async_update - exception: %s", str(err))
|
_LOGGER.debug("async_update - exception: %s", err)
|
||||||
await self._hass.config_entries.async_reload(self._entry.entry_id)
|
await self._hass.config_entries.async_reload(self._entry.entry_id)
|
||||||
|
return
|
||||||
|
async_dispatcher_send(self._hass, self.signal_sensor_update)
|
||||||
|
|
||||||
|
|
||||||
class SynologyDSMEntity(Entity):
|
class SynologyDSMEntity(Entity):
|
||||||
|
@ -4,10 +4,20 @@ import pytest
|
|||||||
from tests.async_mock import patch
|
from tests.async_mock import patch
|
||||||
|
|
||||||
|
|
||||||
|
def pytest_configure(config):
|
||||||
|
"""Register custom marker for tests."""
|
||||||
|
config.addinivalue_line(
|
||||||
|
"markers", "no_bypass_setup: mark test to disable bypass_setup_fixture"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(name="bypass_setup", autouse=True)
|
@pytest.fixture(name="bypass_setup", autouse=True)
|
||||||
def bypass_setup_fixture():
|
def bypass_setup_fixture(request):
|
||||||
"""Mock component setup."""
|
"""Mock component setup."""
|
||||||
with patch(
|
if "no_bypass_setup" in request.keywords:
|
||||||
"homeassistant.components.synology_dsm.async_setup_entry", return_value=True
|
|
||||||
):
|
|
||||||
yield
|
yield
|
||||||
|
else:
|
||||||
|
with patch(
|
||||||
|
"homeassistant.components.synology_dsm.async_setup_entry", return_value=True
|
||||||
|
):
|
||||||
|
yield
|
||||||
|
14
tests/components/synology_dsm/consts.py
Normal file
14
tests/components/synology_dsm/consts.py
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
"""Constants for the Synology DSM component tests."""
|
||||||
|
|
||||||
|
HOST = "nas.meontheinternet.com"
|
||||||
|
SERIAL = "mySerial"
|
||||||
|
HOST_2 = "nas.worldwide.me"
|
||||||
|
SERIAL_2 = "mySerial2"
|
||||||
|
PORT = 1234
|
||||||
|
USE_SSL = True
|
||||||
|
VERIFY_SSL = False
|
||||||
|
USERNAME = "Home_Assistant"
|
||||||
|
PASSWORD = "password"
|
||||||
|
DEVICE_TOKEN = "Dév!cè_T0k€ñ"
|
||||||
|
|
||||||
|
MACS = ["00-11-32-XX-XX-59", "00-11-32-XX-XX-5A"]
|
@ -10,7 +10,6 @@ from synology_dsm.exceptions import (
|
|||||||
|
|
||||||
from homeassistant import data_entry_flow, setup
|
from homeassistant import data_entry_flow, setup
|
||||||
from homeassistant.components import ssdp
|
from homeassistant.components import ssdp
|
||||||
from homeassistant.components.synology_dsm import _async_setup_services
|
|
||||||
from homeassistant.components.synology_dsm.config_flow import CONF_OTP_CODE
|
from homeassistant.components.synology_dsm.config_flow import CONF_OTP_CODE
|
||||||
from homeassistant.components.synology_dsm.const import (
|
from homeassistant.components.synology_dsm.const import (
|
||||||
CONF_VOLUMES,
|
CONF_VOLUMES,
|
||||||
@ -21,7 +20,6 @@ from homeassistant.components.synology_dsm.const import (
|
|||||||
DEFAULT_USE_SSL,
|
DEFAULT_USE_SSL,
|
||||||
DEFAULT_VERIFY_SSL,
|
DEFAULT_VERIFY_SSL,
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
SERVICES,
|
|
||||||
)
|
)
|
||||||
from homeassistant.config_entries import SOURCE_IMPORT, SOURCE_SSDP, SOURCE_USER
|
from homeassistant.config_entries import SOURCE_IMPORT, SOURCE_SSDP, SOURCE_USER
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
@ -38,22 +36,23 @@ from homeassistant.const import (
|
|||||||
)
|
)
|
||||||
from homeassistant.helpers.typing import HomeAssistantType
|
from homeassistant.helpers.typing import HomeAssistantType
|
||||||
|
|
||||||
|
from .consts import (
|
||||||
|
DEVICE_TOKEN,
|
||||||
|
HOST,
|
||||||
|
HOST_2,
|
||||||
|
MACS,
|
||||||
|
PASSWORD,
|
||||||
|
PORT,
|
||||||
|
SERIAL,
|
||||||
|
SERIAL_2,
|
||||||
|
USE_SSL,
|
||||||
|
USERNAME,
|
||||||
|
VERIFY_SSL,
|
||||||
|
)
|
||||||
|
|
||||||
from tests.async_mock import MagicMock, Mock, patch
|
from tests.async_mock import MagicMock, Mock, patch
|
||||||
from tests.common import MockConfigEntry
|
from tests.common import MockConfigEntry
|
||||||
|
|
||||||
HOST = "nas.meontheinternet.com"
|
|
||||||
SERIAL = "mySerial"
|
|
||||||
HOST_2 = "nas.worldwide.me"
|
|
||||||
SERIAL_2 = "mySerial2"
|
|
||||||
PORT = 1234
|
|
||||||
USE_SSL = True
|
|
||||||
VERIFY_SSL = False
|
|
||||||
USERNAME = "Home_Assistant"
|
|
||||||
PASSWORD = "password"
|
|
||||||
DEVICE_TOKEN = "Dév!cè_T0k€ñ"
|
|
||||||
|
|
||||||
MACS = ["00-11-32-XX-XX-59", "00-11-32-XX-XX-5A"]
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(name="service")
|
@pytest.fixture(name="service")
|
||||||
def mock_controller_service():
|
def mock_controller_service():
|
||||||
@ -498,23 +497,3 @@ async def test_options_flow(hass: HomeAssistantType, service: MagicMock):
|
|||||||
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
|
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
|
||||||
assert config_entry.options[CONF_SCAN_INTERVAL] == 2
|
assert config_entry.options[CONF_SCAN_INTERVAL] == 2
|
||||||
assert config_entry.options[CONF_TIMEOUT] == 30
|
assert config_entry.options[CONF_TIMEOUT] == 30
|
||||||
|
|
||||||
|
|
||||||
async def test_services_registered(hass: HomeAssistantType):
|
|
||||||
"""Test if all services are registered."""
|
|
||||||
with patch(
|
|
||||||
"homeassistant.core.ServiceRegistry.async_register", return_value=Mock(True)
|
|
||||||
) as async_register:
|
|
||||||
await hass.config_entries.flow.async_init(
|
|
||||||
DOMAIN,
|
|
||||||
context={"source": SOURCE_USER},
|
|
||||||
data={
|
|
||||||
CONF_HOST: HOST,
|
|
||||||
CONF_PORT: PORT,
|
|
||||||
CONF_SSL: USE_SSL,
|
|
||||||
CONF_USERNAME: USERNAME,
|
|
||||||
CONF_PASSWORD: PASSWORD,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
await _async_setup_services(hass)
|
|
||||||
assert async_register.call_count == len(SERVICES)
|
|
||||||
|
41
tests/components/synology_dsm/test_init.py
Normal file
41
tests/components/synology_dsm/test_init.py
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
"""Tests for the Synology DSM component."""
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from homeassistant.components.synology_dsm.const import DOMAIN, SERVICES
|
||||||
|
from homeassistant.const import (
|
||||||
|
CONF_HOST,
|
||||||
|
CONF_MAC,
|
||||||
|
CONF_PASSWORD,
|
||||||
|
CONF_PORT,
|
||||||
|
CONF_SSL,
|
||||||
|
CONF_USERNAME,
|
||||||
|
)
|
||||||
|
from homeassistant.helpers.typing import HomeAssistantType
|
||||||
|
|
||||||
|
from .consts import HOST, MACS, PASSWORD, PORT, USE_SSL, USERNAME
|
||||||
|
|
||||||
|
from tests.async_mock import patch
|
||||||
|
from tests.common import MockConfigEntry
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.no_bypass_setup
|
||||||
|
async def test_services_registered(hass: HomeAssistantType):
|
||||||
|
"""Test if all services are registered."""
|
||||||
|
with patch(
|
||||||
|
"homeassistant.components.synology_dsm.SynoApi.async_setup", return_value=True
|
||||||
|
), patch("homeassistant.components.synology_dsm.PLATFORMS", return_value=[]):
|
||||||
|
entry = MockConfigEntry(
|
||||||
|
domain=DOMAIN,
|
||||||
|
data={
|
||||||
|
CONF_HOST: HOST,
|
||||||
|
CONF_PORT: PORT,
|
||||||
|
CONF_SSL: USE_SSL,
|
||||||
|
CONF_USERNAME: USERNAME,
|
||||||
|
CONF_PASSWORD: PASSWORD,
|
||||||
|
CONF_MAC: MACS[0],
|
||||||
|
},
|
||||||
|
)
|
||||||
|
entry.add_to_hass(hass)
|
||||||
|
assert await hass.config_entries.async_setup(entry.entry_id)
|
||||||
|
for service in SERVICES:
|
||||||
|
assert hass.services.has_service(DOMAIN, service)
|
Loading…
x
Reference in New Issue
Block a user