Sync dev with main (release-merge backport) (#36)
This commit was merged in pull request #36.
This commit is contained in:
+40
-1
@@ -25,6 +25,9 @@ import asyncio
|
||||
import importlib.util
|
||||
import inspect
|
||||
import sys
|
||||
import tempfile
|
||||
import weakref
|
||||
from pathlib import Path
|
||||
from types import SimpleNamespace
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
@@ -38,6 +41,7 @@ _HA_MODULES = (
|
||||
"homeassistant.core",
|
||||
"homeassistant.config_entries",
|
||||
"homeassistant.data_entry_flow",
|
||||
"homeassistant.exceptions",
|
||||
)
|
||||
|
||||
def _find_spec(name: str):
|
||||
@@ -74,6 +78,7 @@ for _parent, _child in (
|
||||
("homeassistant", "config_entries"),
|
||||
("homeassistant", "data_entry_flow"),
|
||||
("homeassistant", "core"),
|
||||
("homeassistant", "exceptions"),
|
||||
):
|
||||
setattr(sys.modules[_parent], _child, sys.modules[f"{_parent}.{_child}"])
|
||||
|
||||
@@ -155,6 +160,7 @@ def _callback_decorator(fn):
|
||||
_config_entries_mock = _ha_mock("homeassistant.config_entries")
|
||||
_core_mock = _ha_mock("homeassistant.core")
|
||||
_data_entry_flow_mock = _ha_mock("homeassistant.data_entry_flow")
|
||||
_exceptions_mock = _ha_mock("homeassistant.exceptions")
|
||||
|
||||
_config_entries_mock.ConfigFlow = _ConfigFlowBase
|
||||
_config_entries_mock.OptionsFlowWithConfigEntry = _OptionsFlowWithConfigEntryBase
|
||||
@@ -165,6 +171,17 @@ _data_entry_flow_mock.RESULT_TYPE_ABORT = "abort"
|
||||
_data_entry_flow_mock.FlowResult = dict
|
||||
|
||||
|
||||
class ConfigEntryNotReady(Exception):
|
||||
"""Stand-in mirroring homeassistant.exceptions.ConfigEntryNotReady.
|
||||
|
||||
HA retries setup when this is raised; the tests assert the corrupt
|
||||
database path raises it instead of crashing with an unrelated error.
|
||||
"""
|
||||
|
||||
|
||||
_exceptions_mock.ConfigEntryNotReady = ConfigEntryNotReady
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Shared helpers for the behavior tests.
|
||||
# ---------------------------------------------------------------------------
|
||||
@@ -218,13 +235,35 @@ def wire_entry_to_registry(entry, registry: ListenerRegistry):
|
||||
return entry
|
||||
|
||||
|
||||
class _HassNamespace(SimpleNamespace):
|
||||
"""SimpleNamespace subclass so the hass stub can hold weak references."""
|
||||
|
||||
|
||||
def make_hass() -> tuple:
|
||||
"""Create a hass stub plus its listener registry, mirroring HA's shape."""
|
||||
hass = SimpleNamespace(
|
||||
config_dir = Path(tempfile.mkdtemp(prefix="nestquest-hass-"))
|
||||
hass = _HassNamespace(
|
||||
data={},
|
||||
config=MagicMock(),
|
||||
config_entries=SimpleNamespace(async_reload=None),
|
||||
)
|
||||
|
||||
def _cleanup_config_dir():
|
||||
import shutil
|
||||
|
||||
shutil.rmtree(config_dir, ignore_errors=True)
|
||||
|
||||
weakref.finalize(hass, _cleanup_config_dir)
|
||||
hass.config.path = MagicMock(
|
||||
side_effect=lambda name: str(config_dir / (name or "config"))
|
||||
)
|
||||
|
||||
def _run_executor_job(fn, *args, **kwargs):
|
||||
return asyncio.get_running_loop().run_in_executor(
|
||||
None, lambda: fn(*args, **kwargs)
|
||||
)
|
||||
|
||||
hass.async_add_executor_job = _run_executor_job
|
||||
registry = ListenerRegistry(hass)
|
||||
|
||||
async def _async_reload(entry_id: str) -> None:
|
||||
|
||||
Reference in New Issue
Block a user