Refactor and cleanup zwave_js fixtures to share them (#124485)

Refactor and cleanup zwave_js fixtures to use
This commit is contained in:
Jan Bouwhuis 2024-08-23 15:42:57 +02:00 committed by GitHub
parent 0bd9386df2
commit 44b6bca89a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 164 additions and 300 deletions

View File

@ -202,31 +202,53 @@ def discovery_info_fixture() -> Any:
return mock_discovery_info() return mock_discovery_info()
@pytest.fixture(name="discovery_info_side_effect")
def discovery_info_side_effect_fixture() -> Any | None:
"""Return the discovery info from the supervisor."""
return None
@pytest.fixture(name="get_addon_discovery_info") @pytest.fixture(name="get_addon_discovery_info")
def get_addon_discovery_info_fixture(discovery_info: Any) -> Generator[AsyncMock]: def get_addon_discovery_info_fixture(
discovery_info: dict[str, Any], discovery_info_side_effect: Any | None
) -> Generator[AsyncMock]:
"""Mock get add-on discovery info.""" """Mock get add-on discovery info."""
# pylint: disable-next=import-outside-toplevel # pylint: disable-next=import-outside-toplevel
from .hassio.common import mock_get_addon_discovery_info from .hassio.common import mock_get_addon_discovery_info
yield from mock_get_addon_discovery_info(discovery_info) yield from mock_get_addon_discovery_info(discovery_info, discovery_info_side_effect)
@pytest.fixture(name="addon_store_info_side_effect")
def addon_store_info_side_effect_fixture() -> Any | None:
"""Return the add-on store info side effect."""
return None
@pytest.fixture(name="addon_store_info") @pytest.fixture(name="addon_store_info")
def addon_store_info_fixture() -> Generator[AsyncMock]: def addon_store_info_fixture(
addon_store_info_side_effect: Any | None,
) -> Generator[AsyncMock]:
"""Mock Supervisor add-on store info.""" """Mock Supervisor add-on store info."""
# pylint: disable-next=import-outside-toplevel # pylint: disable-next=import-outside-toplevel
from .hassio.common import mock_addon_store_info from .hassio.common import mock_addon_store_info
yield from mock_addon_store_info() yield from mock_addon_store_info(addon_store_info_side_effect)
@pytest.fixture(name="addon_info_side_effect")
def addon_info_side_effect_fixture() -> Any | None:
"""Return the add-on info side effect."""
return None
@pytest.fixture(name="addon_info") @pytest.fixture(name="addon_info")
def addon_info_fixture() -> Generator[AsyncMock]: def addon_info_fixture(addon_info_side_effect: Any | None) -> Generator[AsyncMock]:
"""Mock Supervisor add-on info.""" """Mock Supervisor add-on info."""
# pylint: disable-next=import-outside-toplevel # pylint: disable-next=import-outside-toplevel
from .hassio.common import mock_addon_info from .hassio.common import mock_addon_info
yield from mock_addon_info() yield from mock_addon_info(addon_info_side_effect)
@pytest.fixture(name="addon_not_installed") @pytest.fixture(name="addon_not_installed")
@ -262,33 +284,64 @@ def addon_running_fixture(
return mock_addon_running(addon_store_info, addon_info) return mock_addon_running(addon_store_info, addon_info)
@pytest.fixture(name="install_addon_side_effect")
def install_addon_side_effect_fixture(
addon_store_info: AsyncMock, addon_info: AsyncMock
) -> Any | None:
"""Return the install add-on side effect."""
# pylint: disable-next=import-outside-toplevel
from .hassio.common import mock_install_addon_side_effect
return mock_install_addon_side_effect(addon_store_info, addon_info)
@pytest.fixture(name="install_addon") @pytest.fixture(name="install_addon")
def install_addon_fixture( def install_addon_fixture(
addon_store_info: AsyncMock, addon_info: AsyncMock install_addon_side_effect: Any | None,
) -> Generator[AsyncMock]: ) -> Generator[AsyncMock]:
"""Mock install add-on.""" """Mock install add-on."""
# pylint: disable-next=import-outside-toplevel # pylint: disable-next=import-outside-toplevel
from .hassio.common import mock_install_addon from .hassio.common import mock_install_addon
yield from mock_install_addon(addon_store_info, addon_info) yield from mock_install_addon(install_addon_side_effect)
@pytest.fixture(name="start_addon_side_effect")
def start_addon_side_effect_fixture(
addon_store_info: AsyncMock, addon_info: AsyncMock
) -> Any | None:
"""Return the start add-on options side effect."""
# pylint: disable-next=import-outside-toplevel
from .hassio.common import mock_start_addon_side_effect
return mock_start_addon_side_effect(addon_store_info, addon_info)
@pytest.fixture(name="start_addon") @pytest.fixture(name="start_addon")
def start_addon_fixture() -> Generator[AsyncMock]: def start_addon_fixture(start_addon_side_effect: Any | None) -> Generator[AsyncMock]:
"""Mock start add-on.""" """Mock start add-on."""
# pylint: disable-next=import-outside-toplevel # pylint: disable-next=import-outside-toplevel
from .hassio.common import mock_start_addon from .hassio.common import mock_start_addon
yield from mock_start_addon() yield from mock_start_addon(start_addon_side_effect)
@pytest.fixture(name="restart_addon_side_effect")
def restart_addon_side_effect_fixture() -> Any | None:
"""Return the restart add-on options side effect."""
return None
@pytest.fixture(name="restart_addon") @pytest.fixture(name="restart_addon")
def restart_addon_fixture() -> Generator[AsyncMock]: def restart_addon_fixture(
restart_addon_side_effect: Any | None,
) -> Generator[AsyncMock]:
"""Mock restart add-on.""" """Mock restart add-on."""
# pylint: disable-next=import-outside-toplevel # pylint: disable-next=import-outside-toplevel
from .hassio.common import mock_restart_addon from .hassio.common import mock_restart_addon
yield from mock_restart_addon() yield from mock_restart_addon(restart_addon_side_effect)
@pytest.fixture(name="stop_addon") @pytest.fixture(name="stop_addon")
@ -300,13 +353,35 @@ def stop_addon_fixture() -> Generator[AsyncMock]:
yield from mock_stop_addon() yield from mock_stop_addon()
@pytest.fixture(name="addon_options")
def addon_options_fixture(addon_info: AsyncMock) -> dict[str, Any]:
"""Mock add-on options."""
# pylint: disable-next=import-outside-toplevel
from .hassio.common import mock_addon_options
return mock_addon_options(addon_info)
@pytest.fixture(name="set_addon_options_side_effect")
def set_addon_options_side_effect_fixture(
addon_options: dict[str, Any],
) -> Any | None:
"""Return the set add-on options side effect."""
# pylint: disable-next=import-outside-toplevel
from .hassio.common import mock_set_addon_options_side_effect
return mock_set_addon_options_side_effect(addon_options)
@pytest.fixture(name="set_addon_options") @pytest.fixture(name="set_addon_options")
def set_addon_options_fixture() -> Generator[AsyncMock]: def set_addon_options_fixture(
set_addon_options_side_effect: Any | None,
) -> Generator[AsyncMock]:
"""Mock set add-on options.""" """Mock set add-on options."""
# pylint: disable-next=import-outside-toplevel # pylint: disable-next=import-outside-toplevel
from .hassio.common import mock_set_addon_options from .hassio.common import mock_set_addon_options
yield from mock_set_addon_options() yield from mock_set_addon_options(set_addon_options_side_effect)
@pytest.fixture(name="uninstall_addon") @pytest.fixture(name="uninstall_addon")

View File

@ -23,19 +23,25 @@ def mock_discovery_info() -> Any:
return DEFAULT return DEFAULT
def mock_get_addon_discovery_info(discovery_info: Any) -> Generator[AsyncMock]: def mock_get_addon_discovery_info(
discovery_info: dict[str, Any], discovery_info_side_effect: Any | None
) -> Generator[AsyncMock]:
"""Mock get add-on discovery info.""" """Mock get add-on discovery info."""
with patch( with patch(
"homeassistant.components.hassio.addon_manager.async_get_addon_discovery_info", "homeassistant.components.hassio.addon_manager.async_get_addon_discovery_info",
side_effect=discovery_info_side_effect,
return_value=discovery_info, return_value=discovery_info,
) as get_addon_discovery_info: ) as get_addon_discovery_info:
yield get_addon_discovery_info yield get_addon_discovery_info
def mock_addon_store_info() -> Generator[AsyncMock]: def mock_addon_store_info(
addon_store_info_side_effect: Any | None,
) -> Generator[AsyncMock]:
"""Mock Supervisor add-on store info.""" """Mock Supervisor add-on store info."""
with patch( with patch(
"homeassistant.components.hassio.addon_manager.async_get_addon_store_info" "homeassistant.components.hassio.addon_manager.async_get_addon_store_info",
side_effect=addon_store_info_side_effect,
) as addon_store_info: ) as addon_store_info:
addon_store_info.return_value = { addon_store_info.return_value = {
"available": False, "available": False,
@ -46,10 +52,11 @@ def mock_addon_store_info() -> Generator[AsyncMock]:
yield addon_store_info yield addon_store_info
def mock_addon_info() -> Generator[AsyncMock]: def mock_addon_info(addon_info_side_effect: Any | None) -> Generator[AsyncMock]:
"""Mock Supervisor add-on info.""" """Mock Supervisor add-on info."""
with patch( with patch(
"homeassistant.components.hassio.addon_manager.async_get_addon_info", "homeassistant.components.hassio.addon_manager.async_get_addon_info",
side_effect=addon_info_side_effect,
) as addon_info: ) as addon_info:
addon_info.return_value = { addon_info.return_value = {
"available": False, "available": False,
@ -96,18 +103,18 @@ def mock_addon_running(addon_store_info: AsyncMock, addon_info: AsyncMock) -> As
"version": "1.0.0", "version": "1.0.0",
} }
addon_info.return_value["available"] = True addon_info.return_value["available"] = True
addon_info.return_value["hostname"] = "core-mosquitto" addon_info.return_value["hostname"] = "core-test-addon"
addon_info.return_value["state"] = "started" addon_info.return_value["state"] = "started"
addon_info.return_value["version"] = "1.0.0" addon_info.return_value["version"] = "1.0.0"
return addon_info return addon_info
def mock_install_addon( def mock_install_addon_side_effect(
addon_store_info: AsyncMock, addon_info: AsyncMock addon_store_info: AsyncMock, addon_info: AsyncMock
) -> Generator[AsyncMock]: ) -> Any | None:
"""Mock install add-on.""" """Return the install add-on side effect."""
async def install_addon_side_effect(hass: HomeAssistant, slug: str) -> None: async def install_addon(hass: HomeAssistant, slug):
"""Mock install add-on.""" """Mock install add-on."""
addon_store_info.return_value = { addon_store_info.return_value = {
"available": True, "available": True,
@ -119,17 +126,43 @@ def mock_install_addon(
addon_info.return_value["state"] = "stopped" addon_info.return_value["state"] = "stopped"
addon_info.return_value["version"] = "1.0.0" addon_info.return_value["version"] = "1.0.0"
return install_addon
def mock_install_addon(install_addon_side_effect: Any | None) -> Generator[AsyncMock]:
"""Mock install add-on."""
with patch( with patch(
"homeassistant.components.hassio.addon_manager.async_install_addon" "homeassistant.components.hassio.addon_manager.async_install_addon",
side_effect=install_addon_side_effect,
) as install_addon: ) as install_addon:
install_addon.side_effect = install_addon_side_effect
yield install_addon yield install_addon
def mock_start_addon() -> Generator[AsyncMock]: def mock_start_addon_side_effect(
addon_store_info: AsyncMock, addon_info: AsyncMock
) -> Any | None:
"""Return the start add-on options side effect."""
async def start_addon(hass: HomeAssistant, slug):
"""Mock start add-on."""
addon_store_info.return_value = {
"available": True,
"installed": "1.0.0",
"state": "started",
"version": "1.0.0",
}
addon_info.return_value["available"] = True
addon_info.return_value["state"] = "started"
return start_addon
def mock_start_addon(start_addon_side_effect: Any | None) -> Generator[AsyncMock]:
"""Mock start add-on.""" """Mock start add-on."""
with patch( with patch(
"homeassistant.components.hassio.addon_manager.async_start_addon" "homeassistant.components.hassio.addon_manager.async_start_addon",
side_effect=start_addon_side_effect,
) as start_addon: ) as start_addon:
yield start_addon yield start_addon
@ -142,10 +175,11 @@ def mock_stop_addon() -> Generator[AsyncMock]:
yield stop_addon yield stop_addon
def mock_restart_addon() -> Generator[AsyncMock]: def mock_restart_addon(restart_addon_side_effect: Any | None) -> Generator[AsyncMock]:
"""Mock restart add-on.""" """Mock restart add-on."""
with patch( with patch(
"homeassistant.components.hassio.addon_manager.async_restart_addon" "homeassistant.components.hassio.addon_manager.async_restart_addon",
side_effect=restart_addon_side_effect,
) as restart_addon: ) as restart_addon:
yield restart_addon yield restart_addon
@ -158,10 +192,28 @@ def mock_uninstall_addon() -> Generator[AsyncMock]:
yield uninstall_addon yield uninstall_addon
def mock_set_addon_options() -> Generator[AsyncMock]: def mock_addon_options(addon_info: AsyncMock) -> dict[str, Any]:
"""Mock add-on options."""
return addon_info.return_value["options"]
def mock_set_addon_options_side_effect(addon_options: dict[str, Any]) -> Any | None:
"""Return the set add-on options side effect."""
async def set_addon_options(hass: HomeAssistant, slug: str, options: dict) -> None:
"""Mock set add-on options."""
addon_options.update(options["options"])
return set_addon_options
def mock_set_addon_options(
set_addon_options_side_effect: Any | None,
) -> Generator[AsyncMock]:
"""Mock set add-on options.""" """Mock set add-on options."""
with patch( with patch(
"homeassistant.components.hassio.addon_manager.async_set_addon_options" "homeassistant.components.hassio.addon_manager.async_set_addon_options",
side_effect=set_addon_options_side_effect,
) as set_options: ) as set_options:
yield set_options yield set_options

View File

@ -738,9 +738,10 @@ async def test_create_backup_error(
) )
@pytest.mark.usefixtures("addon_installed")
@pytest.mark.parametrize("set_addon_options_side_effect", [None])
async def test_schedule_install_setup_addon( async def test_schedule_install_setup_addon(
addon_manager: AddonManager, addon_manager: AddonManager,
addon_installed: AsyncMock,
install_addon: AsyncMock, install_addon: AsyncMock,
set_addon_options: AsyncMock, set_addon_options: AsyncMock,
start_addon: AsyncMock, start_addon: AsyncMock,
@ -915,11 +916,10 @@ async def test_schedule_install_setup_addon_logs_error(
assert start_addon.call_count == start_addon_calls assert start_addon.call_count == start_addon_calls
@pytest.mark.usefixtures("addon_installed")
@pytest.mark.parametrize("set_addon_options_side_effect", [None])
async def test_schedule_setup_addon( async def test_schedule_setup_addon(
addon_manager: AddonManager, addon_manager: AddonManager, set_addon_options: AsyncMock, start_addon: AsyncMock
addon_installed: AsyncMock,
set_addon_options: AsyncMock,
start_addon: AsyncMock,
) -> None: ) -> None:
"""Test schedule setup addon.""" """Test schedule setup addon."""
start_task = addon_manager.async_schedule_setup_addon({"test_key": "test"}) start_task = addon_manager.async_schedule_setup_addon({"test_key": "test"})

View File

@ -1,11 +1,9 @@
"""Provide common Z-Wave JS fixtures.""" """Provide common Z-Wave JS fixtures."""
import asyncio import asyncio
from collections.abc import Generator
import copy import copy
import io import io
import json import json
from typing import Any
from unittest.mock import DEFAULT, AsyncMock, patch from unittest.mock import DEFAULT, AsyncMock, patch
import pytest import pytest
@ -18,242 +16,6 @@ from homeassistant.core import HomeAssistant
from tests.common import MockConfigEntry, load_fixture from tests.common import MockConfigEntry, load_fixture
# Add-on fixtures
@pytest.fixture(name="addon_info_side_effect")
def addon_info_side_effect_fixture() -> Any | None:
"""Return the add-on info side effect."""
return None
@pytest.fixture(name="addon_info")
def mock_addon_info(addon_info_side_effect: Any | None) -> Generator[AsyncMock]:
"""Mock Supervisor add-on info."""
with patch(
"homeassistant.components.hassio.addon_manager.async_get_addon_info",
side_effect=addon_info_side_effect,
) as addon_info:
addon_info.return_value = {
"available": False,
"hostname": None,
"options": {},
"state": None,
"update_available": False,
"version": None,
}
yield addon_info
@pytest.fixture(name="addon_store_info_side_effect")
def addon_store_info_side_effect_fixture() -> Any | None:
"""Return the add-on store info side effect."""
return None
@pytest.fixture(name="addon_store_info")
def mock_addon_store_info(
addon_store_info_side_effect: Any | None,
) -> Generator[AsyncMock]:
"""Mock Supervisor add-on info."""
with patch(
"homeassistant.components.hassio.addon_manager.async_get_addon_store_info",
side_effect=addon_store_info_side_effect,
) as addon_store_info:
addon_store_info.return_value = {
"available": False,
"installed": None,
"state": None,
"version": "1.0.0",
}
yield addon_store_info
@pytest.fixture(name="addon_running")
def mock_addon_running(addon_store_info: AsyncMock, addon_info: AsyncMock) -> AsyncMock:
"""Mock add-on already running."""
addon_store_info.return_value = {
"available": True,
"installed": "1.0.0",
"state": "started",
"version": "1.0.0",
}
addon_info.return_value["available"] = True
addon_info.return_value["state"] = "started"
addon_info.return_value["version"] = "1.0.0"
return addon_info
@pytest.fixture(name="addon_installed")
def mock_addon_installed(
addon_store_info: AsyncMock, addon_info: AsyncMock
) -> AsyncMock:
"""Mock add-on already installed but not running."""
addon_store_info.return_value = {
"available": True,
"installed": "1.0.0",
"state": "stopped",
"version": "1.0.0",
}
addon_info.return_value["available"] = True
addon_info.return_value["state"] = "stopped"
addon_info.return_value["version"] = "1.0.0"
return addon_info
@pytest.fixture(name="addon_not_installed")
def mock_addon_not_installed(
addon_store_info: AsyncMock, addon_info: AsyncMock
) -> AsyncMock:
"""Mock add-on not installed."""
addon_store_info.return_value["available"] = True
return addon_info
@pytest.fixture(name="addon_options")
def mock_addon_options(addon_info: AsyncMock):
"""Mock add-on options."""
return addon_info.return_value["options"]
@pytest.fixture(name="set_addon_options_side_effect")
def set_addon_options_side_effect_fixture(
addon_options: dict[str, Any],
) -> Any | None:
"""Return the set add-on options side effect."""
async def set_addon_options(hass: HomeAssistant, slug: str, options: dict) -> None:
"""Mock set add-on options."""
addon_options.update(options["options"])
return set_addon_options
@pytest.fixture(name="set_addon_options")
def mock_set_addon_options(
set_addon_options_side_effect: Any | None,
) -> Generator[AsyncMock]:
"""Mock set add-on options."""
with patch(
"homeassistant.components.hassio.addon_manager.async_set_addon_options",
side_effect=set_addon_options_side_effect,
) as set_options:
yield set_options
@pytest.fixture(name="install_addon_side_effect")
def install_addon_side_effect_fixture(
addon_store_info: AsyncMock, addon_info: AsyncMock
) -> Any | None:
"""Return the install add-on side effect."""
async def install_addon(hass: HomeAssistant, slug):
"""Mock install add-on."""
addon_store_info.return_value = {
"available": True,
"installed": "1.0.0",
"state": "stopped",
"version": "1.0.0",
}
addon_info.return_value["available"] = True
addon_info.return_value["state"] = "stopped"
addon_info.return_value["version"] = "1.0.0"
return install_addon
@pytest.fixture(name="install_addon")
def mock_install_addon(install_addon_side_effect: Any | None) -> Generator[AsyncMock]:
"""Mock install add-on."""
with patch(
"homeassistant.components.hassio.addon_manager.async_install_addon",
side_effect=install_addon_side_effect,
) as install_addon:
yield install_addon
@pytest.fixture(name="update_addon")
def mock_update_addon() -> Generator[AsyncMock]:
"""Mock update add-on."""
with patch(
"homeassistant.components.hassio.addon_manager.async_update_addon"
) as update_addon:
yield update_addon
@pytest.fixture(name="start_addon_side_effect")
def start_addon_side_effect_fixture(
addon_store_info: AsyncMock, addon_info: AsyncMock
) -> Any | None:
"""Return the start add-on options side effect."""
async def start_addon(hass: HomeAssistant, slug):
"""Mock start add-on."""
addon_store_info.return_value = {
"available": True,
"installed": "1.0.0",
"state": "started",
"version": "1.0.0",
}
addon_info.return_value["available"] = True
addon_info.return_value["state"] = "started"
return start_addon
@pytest.fixture(name="start_addon")
def mock_start_addon(start_addon_side_effect: Any | None) -> Generator[AsyncMock]:
"""Mock start add-on."""
with patch(
"homeassistant.components.hassio.addon_manager.async_start_addon",
side_effect=start_addon_side_effect,
) as start_addon:
yield start_addon
@pytest.fixture(name="stop_addon")
def stop_addon_fixture() -> Generator[AsyncMock]:
"""Mock stop add-on."""
with patch(
"homeassistant.components.hassio.addon_manager.async_stop_addon"
) as stop_addon:
yield stop_addon
@pytest.fixture(name="restart_addon_side_effect")
def restart_addon_side_effect_fixture() -> Any | None:
"""Return the restart add-on options side effect."""
return None
@pytest.fixture(name="restart_addon")
def mock_restart_addon(restart_addon_side_effect: Any | None) -> Generator[AsyncMock]:
"""Mock restart add-on."""
with patch(
"homeassistant.components.hassio.addon_manager.async_restart_addon",
side_effect=restart_addon_side_effect,
) as restart_addon:
yield restart_addon
@pytest.fixture(name="uninstall_addon")
def uninstall_addon_fixture() -> Generator[AsyncMock]:
"""Mock uninstall add-on."""
with patch(
"homeassistant.components.hassio.addon_manager.async_uninstall_addon"
) as uninstall_addon:
yield uninstall_addon
@pytest.fixture(name="create_backup")
def create_backup_fixture() -> Generator[AsyncMock]:
"""Mock create backup."""
with patch(
"homeassistant.components.hassio.addon_manager.async_create_backup"
) as create_backup:
yield create_backup
# State fixtures # State fixtures

View File

@ -5,7 +5,7 @@ from collections.abc import Generator
from copy import copy from copy import copy
from ipaddress import ip_address from ipaddress import ip_address
from typing import Any from typing import Any
from unittest.mock import DEFAULT, AsyncMock, MagicMock, call, patch from unittest.mock import AsyncMock, MagicMock, call, patch
import aiohttp import aiohttp
import pytest import pytest
@ -77,31 +77,6 @@ def mock_supervisor_fixture() -> Generator[None]:
yield yield
@pytest.fixture(name="discovery_info")
def discovery_info_fixture() -> dict[str, Any]:
"""Return the discovery info from the supervisor."""
return DEFAULT
@pytest.fixture(name="discovery_info_side_effect")
def discovery_info_side_effect_fixture() -> Any | None:
"""Return the discovery info from the supervisor."""
return None
@pytest.fixture(name="get_addon_discovery_info")
def mock_get_addon_discovery_info(
discovery_info: dict[str, Any], discovery_info_side_effect: Any | None
) -> Generator[AsyncMock]:
"""Mock get add-on discovery info."""
with patch(
"homeassistant.components.hassio.addon_manager.async_get_addon_discovery_info",
side_effect=discovery_info_side_effect,
return_value=discovery_info,
) as get_addon_discovery_info:
yield get_addon_discovery_info
@pytest.fixture(name="server_version_side_effect") @pytest.fixture(name="server_version_side_effect")
def server_version_side_effect_fixture() -> Any | None: def server_version_side_effect_fixture() -> Any | None:
"""Return the server version side effect.""" """Return the server version side effect."""