2024-08-22 07:07:45 +00:00
|
|
|
"""Provide common test tools for hassio."""
|
|
|
|
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
from collections.abc import Generator
|
2024-08-22 18:58:05 +00:00
|
|
|
import logging
|
2024-08-22 07:07:45 +00:00
|
|
|
from typing import Any
|
|
|
|
from unittest.mock import DEFAULT, AsyncMock, patch
|
|
|
|
|
2024-08-22 18:58:05 +00:00
|
|
|
from homeassistant.components.hassio.addon_manager import AddonManager
|
2024-08-22 07:07:45 +00:00
|
|
|
from homeassistant.core import HomeAssistant
|
|
|
|
|
2024-08-22 18:58:05 +00:00
|
|
|
LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
def mock_addon_manager(hass: HomeAssistant) -> AddonManager:
|
|
|
|
"""Return an AddonManager instance."""
|
|
|
|
return AddonManager(hass, LOGGER, "Test", "test_addon")
|
|
|
|
|
2024-08-22 07:07:45 +00:00
|
|
|
|
|
|
|
def mock_discovery_info() -> Any:
|
|
|
|
"""Return the discovery info from the supervisor."""
|
|
|
|
return DEFAULT
|
|
|
|
|
|
|
|
|
2024-08-23 13:42:57 +00:00
|
|
|
def mock_get_addon_discovery_info(
|
|
|
|
discovery_info: dict[str, Any], discovery_info_side_effect: Any | None
|
|
|
|
) -> Generator[AsyncMock]:
|
2024-08-22 07:07:45 +00:00
|
|
|
"""Mock get add-on discovery info."""
|
|
|
|
with patch(
|
|
|
|
"homeassistant.components.hassio.addon_manager.async_get_addon_discovery_info",
|
2024-08-23 13:42:57 +00:00
|
|
|
side_effect=discovery_info_side_effect,
|
2024-08-22 07:07:45 +00:00
|
|
|
return_value=discovery_info,
|
|
|
|
) as get_addon_discovery_info:
|
|
|
|
yield get_addon_discovery_info
|
|
|
|
|
|
|
|
|
2024-08-23 13:42:57 +00:00
|
|
|
def mock_addon_store_info(
|
|
|
|
addon_store_info_side_effect: Any | None,
|
|
|
|
) -> Generator[AsyncMock]:
|
2024-08-22 07:07:45 +00:00
|
|
|
"""Mock Supervisor add-on store info."""
|
|
|
|
with patch(
|
2024-08-23 13:42:57 +00:00
|
|
|
"homeassistant.components.hassio.addon_manager.async_get_addon_store_info",
|
|
|
|
side_effect=addon_store_info_side_effect,
|
2024-08-22 07:07:45 +00:00
|
|
|
) as addon_store_info:
|
|
|
|
addon_store_info.return_value = {
|
2024-08-23 17:40:35 +00:00
|
|
|
"available": True,
|
2024-08-22 07:07:45 +00:00
|
|
|
"installed": None,
|
|
|
|
"state": None,
|
|
|
|
"version": "1.0.0",
|
|
|
|
}
|
|
|
|
yield addon_store_info
|
|
|
|
|
|
|
|
|
2024-08-23 13:42:57 +00:00
|
|
|
def mock_addon_info(addon_info_side_effect: Any | None) -> Generator[AsyncMock]:
|
2024-08-22 07:07:45 +00:00
|
|
|
"""Mock Supervisor add-on info."""
|
|
|
|
with patch(
|
|
|
|
"homeassistant.components.hassio.addon_manager.async_get_addon_info",
|
2024-08-23 13:42:57 +00:00
|
|
|
side_effect=addon_info_side_effect,
|
2024-08-22 07:07:45 +00:00
|
|
|
) as addon_info:
|
|
|
|
addon_info.return_value = {
|
|
|
|
"available": False,
|
|
|
|
"hostname": None,
|
|
|
|
"options": {},
|
|
|
|
"state": None,
|
|
|
|
"update_available": False,
|
|
|
|
"version": None,
|
|
|
|
}
|
|
|
|
yield addon_info
|
|
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
|
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
|
2024-08-22 18:58:05 +00:00
|
|
|
addon_info.return_value["hostname"] = "core-test-addon"
|
2024-08-22 07:07:45 +00:00
|
|
|
addon_info.return_value["state"] = "stopped"
|
|
|
|
addon_info.return_value["version"] = "1.0.0"
|
|
|
|
return addon_info
|
|
|
|
|
|
|
|
|
|
|
|
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
|
2024-08-23 13:42:57 +00:00
|
|
|
addon_info.return_value["hostname"] = "core-test-addon"
|
2024-08-22 07:07:45 +00:00
|
|
|
addon_info.return_value["state"] = "started"
|
|
|
|
addon_info.return_value["version"] = "1.0.0"
|
|
|
|
return addon_info
|
|
|
|
|
|
|
|
|
2024-08-23 13:42:57 +00:00
|
|
|
def mock_install_addon_side_effect(
|
2024-08-22 07:07:45 +00:00
|
|
|
addon_store_info: AsyncMock, addon_info: AsyncMock
|
2024-08-23 13:42:57 +00:00
|
|
|
) -> Any | None:
|
|
|
|
"""Return the install add-on side effect."""
|
2024-08-22 07:07:45 +00:00
|
|
|
|
2024-08-23 13:42:57 +00:00
|
|
|
async def install_addon(hass: HomeAssistant, slug):
|
2024-08-22 07:07:45 +00:00
|
|
|
"""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"
|
|
|
|
|
2024-08-23 13:42:57 +00:00
|
|
|
return install_addon
|
|
|
|
|
|
|
|
|
|
|
|
def mock_install_addon(install_addon_side_effect: Any | None) -> Generator[AsyncMock]:
|
|
|
|
"""Mock install add-on."""
|
|
|
|
|
2024-08-22 07:07:45 +00:00
|
|
|
with patch(
|
2024-08-23 13:42:57 +00:00
|
|
|
"homeassistant.components.hassio.addon_manager.async_install_addon",
|
|
|
|
side_effect=install_addon_side_effect,
|
2024-08-22 07:07:45 +00:00
|
|
|
) as install_addon:
|
|
|
|
yield install_addon
|
|
|
|
|
|
|
|
|
2024-08-23 13:42:57 +00:00
|
|
|
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]:
|
2024-08-22 07:07:45 +00:00
|
|
|
"""Mock start add-on."""
|
|
|
|
with patch(
|
2024-08-23 13:42:57 +00:00
|
|
|
"homeassistant.components.hassio.addon_manager.async_start_addon",
|
|
|
|
side_effect=start_addon_side_effect,
|
2024-08-22 07:07:45 +00:00
|
|
|
) as start_addon:
|
|
|
|
yield start_addon
|
2024-08-22 18:58:05 +00:00
|
|
|
|
|
|
|
|
|
|
|
def mock_stop_addon() -> Generator[AsyncMock]:
|
|
|
|
"""Mock stop add-on."""
|
|
|
|
with patch(
|
|
|
|
"homeassistant.components.hassio.addon_manager.async_stop_addon"
|
|
|
|
) as stop_addon:
|
|
|
|
yield stop_addon
|
|
|
|
|
|
|
|
|
2024-08-23 13:42:57 +00:00
|
|
|
def mock_restart_addon(restart_addon_side_effect: Any | None) -> Generator[AsyncMock]:
|
2024-08-22 18:58:05 +00:00
|
|
|
"""Mock restart add-on."""
|
|
|
|
with patch(
|
2024-08-23 13:42:57 +00:00
|
|
|
"homeassistant.components.hassio.addon_manager.async_restart_addon",
|
|
|
|
side_effect=restart_addon_side_effect,
|
2024-08-22 18:58:05 +00:00
|
|
|
) as restart_addon:
|
|
|
|
yield restart_addon
|
|
|
|
|
|
|
|
|
|
|
|
def mock_uninstall_addon() -> Generator[AsyncMock]:
|
|
|
|
"""Mock uninstall add-on."""
|
|
|
|
with patch(
|
|
|
|
"homeassistant.components.hassio.addon_manager.async_uninstall_addon"
|
|
|
|
) as uninstall_addon:
|
|
|
|
yield uninstall_addon
|
|
|
|
|
|
|
|
|
2024-08-23 13:42:57 +00:00
|
|
|
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]:
|
2024-08-22 18:58:05 +00:00
|
|
|
"""Mock set add-on options."""
|
|
|
|
with patch(
|
2024-08-23 13:42:57 +00:00
|
|
|
"homeassistant.components.hassio.addon_manager.async_set_addon_options",
|
|
|
|
side_effect=set_addon_options_side_effect,
|
2024-08-22 18:58:05 +00:00
|
|
|
) as set_options:
|
|
|
|
yield set_options
|
|
|
|
|
|
|
|
|
|
|
|
def mock_create_backup() -> Generator[AsyncMock]:
|
|
|
|
"""Mock create backup."""
|
|
|
|
with patch(
|
|
|
|
"homeassistant.components.hassio.addon_manager.async_create_backup"
|
|
|
|
) as create_backup:
|
|
|
|
yield create_backup
|
|
|
|
|
|
|
|
|
|
|
|
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
|