236 lines
6.6 KiB
Python
236 lines
6.6 KiB
Python
"""Tests for the Sonarr component."""
|
|
from socket import gaierror as SocketGIAError
|
|
from unittest.mock import patch
|
|
|
|
from homeassistant.components.sonarr.const import (
|
|
CONF_BASE_PATH,
|
|
CONF_UPCOMING_DAYS,
|
|
CONF_WANTED_MAX_ITEMS,
|
|
DEFAULT_UPCOMING_DAYS,
|
|
DEFAULT_WANTED_MAX_ITEMS,
|
|
DOMAIN,
|
|
)
|
|
from homeassistant.const import (
|
|
CONF_API_KEY,
|
|
CONF_HOST,
|
|
CONF_PORT,
|
|
CONF_SSL,
|
|
CONF_VERIFY_SSL,
|
|
CONTENT_TYPE_JSON,
|
|
)
|
|
from homeassistant.core import HomeAssistant
|
|
|
|
from tests.common import MockConfigEntry, load_fixture
|
|
from tests.test_util.aiohttp import AiohttpClientMocker
|
|
|
|
HOST = "192.168.1.189"
|
|
PORT = 8989
|
|
BASE_PATH = "/api"
|
|
API_KEY = "MOCK_API_KEY"
|
|
|
|
MOCK_REAUTH_INPUT = {CONF_API_KEY: "test-api-key-reauth"}
|
|
|
|
MOCK_USER_INPUT = {
|
|
CONF_HOST: HOST,
|
|
CONF_PORT: PORT,
|
|
CONF_BASE_PATH: BASE_PATH,
|
|
CONF_SSL: False,
|
|
CONF_API_KEY: API_KEY,
|
|
}
|
|
|
|
|
|
def mock_connection(
|
|
aioclient_mock: AiohttpClientMocker,
|
|
host: str = HOST,
|
|
port: str = PORT,
|
|
base_path: str = BASE_PATH,
|
|
error: bool = False,
|
|
invalid_auth: bool = False,
|
|
server_error: bool = False,
|
|
) -> None:
|
|
"""Mock Sonarr connection."""
|
|
if error:
|
|
mock_connection_error(
|
|
aioclient_mock,
|
|
host=host,
|
|
port=port,
|
|
base_path=base_path,
|
|
)
|
|
return
|
|
|
|
if invalid_auth:
|
|
mock_connection_invalid_auth(
|
|
aioclient_mock,
|
|
host=host,
|
|
port=port,
|
|
base_path=base_path,
|
|
)
|
|
return
|
|
|
|
if server_error:
|
|
mock_connection_server_error(
|
|
aioclient_mock,
|
|
host=host,
|
|
port=port,
|
|
base_path=base_path,
|
|
)
|
|
return
|
|
|
|
sonarr_url = f"http://{host}:{port}{base_path}"
|
|
|
|
aioclient_mock.get(
|
|
f"{sonarr_url}/system/status",
|
|
text=load_fixture("sonarr/system-status.json"),
|
|
headers={"Content-Type": CONTENT_TYPE_JSON},
|
|
)
|
|
|
|
aioclient_mock.get(
|
|
f"{sonarr_url}/diskspace",
|
|
text=load_fixture("sonarr/diskspace.json"),
|
|
headers={"Content-Type": CONTENT_TYPE_JSON},
|
|
)
|
|
|
|
aioclient_mock.get(
|
|
f"{sonarr_url}/calendar",
|
|
text=load_fixture("sonarr/calendar.json"),
|
|
headers={"Content-Type": CONTENT_TYPE_JSON},
|
|
)
|
|
|
|
aioclient_mock.get(
|
|
f"{sonarr_url}/command",
|
|
text=load_fixture("sonarr/command.json"),
|
|
headers={"Content-Type": CONTENT_TYPE_JSON},
|
|
)
|
|
|
|
aioclient_mock.get(
|
|
f"{sonarr_url}/queue",
|
|
text=load_fixture("sonarr/queue.json"),
|
|
headers={"Content-Type": CONTENT_TYPE_JSON},
|
|
)
|
|
|
|
aioclient_mock.get(
|
|
f"{sonarr_url}/series",
|
|
text=load_fixture("sonarr/series.json"),
|
|
headers={"Content-Type": CONTENT_TYPE_JSON},
|
|
)
|
|
|
|
aioclient_mock.get(
|
|
f"{sonarr_url}/wanted/missing",
|
|
text=load_fixture("sonarr/wanted-missing.json"),
|
|
headers={"Content-Type": CONTENT_TYPE_JSON},
|
|
)
|
|
|
|
|
|
def mock_connection_error(
|
|
aioclient_mock: AiohttpClientMocker,
|
|
host: str = HOST,
|
|
port: str = PORT,
|
|
base_path: str = BASE_PATH,
|
|
) -> None:
|
|
"""Mock Sonarr connection errors."""
|
|
sonarr_url = f"http://{host}:{port}{base_path}"
|
|
|
|
aioclient_mock.get(f"{sonarr_url}/system/status", exc=SocketGIAError)
|
|
aioclient_mock.get(f"{sonarr_url}/diskspace", exc=SocketGIAError)
|
|
aioclient_mock.get(f"{sonarr_url}/calendar", exc=SocketGIAError)
|
|
aioclient_mock.get(f"{sonarr_url}/command", exc=SocketGIAError)
|
|
aioclient_mock.get(f"{sonarr_url}/queue", exc=SocketGIAError)
|
|
aioclient_mock.get(f"{sonarr_url}/series", exc=SocketGIAError)
|
|
aioclient_mock.get(f"{sonarr_url}/missing/wanted", exc=SocketGIAError)
|
|
|
|
|
|
def mock_connection_invalid_auth(
|
|
aioclient_mock: AiohttpClientMocker,
|
|
host: str = HOST,
|
|
port: str = PORT,
|
|
base_path: str = BASE_PATH,
|
|
) -> None:
|
|
"""Mock Sonarr invalid auth errors."""
|
|
sonarr_url = f"http://{host}:{port}{base_path}"
|
|
|
|
aioclient_mock.get(f"{sonarr_url}/system/status", status=403)
|
|
aioclient_mock.get(f"{sonarr_url}/diskspace", status=403)
|
|
aioclient_mock.get(f"{sonarr_url}/calendar", status=403)
|
|
aioclient_mock.get(f"{sonarr_url}/command", status=403)
|
|
aioclient_mock.get(f"{sonarr_url}/queue", status=403)
|
|
aioclient_mock.get(f"{sonarr_url}/series", status=403)
|
|
aioclient_mock.get(f"{sonarr_url}/missing/wanted", status=403)
|
|
|
|
|
|
def mock_connection_server_error(
|
|
aioclient_mock: AiohttpClientMocker,
|
|
host: str = HOST,
|
|
port: str = PORT,
|
|
base_path: str = BASE_PATH,
|
|
) -> None:
|
|
"""Mock Sonarr server errors."""
|
|
sonarr_url = f"http://{host}:{port}{base_path}"
|
|
|
|
aioclient_mock.get(f"{sonarr_url}/system/status", status=500)
|
|
aioclient_mock.get(f"{sonarr_url}/diskspace", status=500)
|
|
aioclient_mock.get(f"{sonarr_url}/calendar", status=500)
|
|
aioclient_mock.get(f"{sonarr_url}/command", status=500)
|
|
aioclient_mock.get(f"{sonarr_url}/queue", status=500)
|
|
aioclient_mock.get(f"{sonarr_url}/series", status=500)
|
|
aioclient_mock.get(f"{sonarr_url}/missing/wanted", status=500)
|
|
|
|
|
|
async def setup_integration(
|
|
hass: HomeAssistant,
|
|
aioclient_mock: AiohttpClientMocker,
|
|
host: str = HOST,
|
|
port: str = PORT,
|
|
base_path: str = BASE_PATH,
|
|
api_key: str = API_KEY,
|
|
unique_id: str = None,
|
|
skip_entry_setup: bool = False,
|
|
connection_error: bool = False,
|
|
invalid_auth: bool = False,
|
|
server_error: bool = False,
|
|
) -> MockConfigEntry:
|
|
"""Set up the Sonarr integration in Home Assistant."""
|
|
entry = MockConfigEntry(
|
|
domain=DOMAIN,
|
|
unique_id=unique_id,
|
|
data={
|
|
CONF_HOST: host,
|
|
CONF_PORT: port,
|
|
CONF_BASE_PATH: base_path,
|
|
CONF_SSL: False,
|
|
CONF_VERIFY_SSL: False,
|
|
CONF_API_KEY: api_key,
|
|
CONF_UPCOMING_DAYS: DEFAULT_UPCOMING_DAYS,
|
|
CONF_WANTED_MAX_ITEMS: DEFAULT_WANTED_MAX_ITEMS,
|
|
},
|
|
options={
|
|
CONF_UPCOMING_DAYS: DEFAULT_UPCOMING_DAYS,
|
|
CONF_WANTED_MAX_ITEMS: DEFAULT_WANTED_MAX_ITEMS,
|
|
},
|
|
)
|
|
|
|
entry.add_to_hass(hass)
|
|
|
|
mock_connection(
|
|
aioclient_mock,
|
|
host=host,
|
|
port=port,
|
|
base_path=base_path,
|
|
error=connection_error,
|
|
invalid_auth=invalid_auth,
|
|
server_error=server_error,
|
|
)
|
|
|
|
if not skip_entry_setup:
|
|
await hass.config_entries.async_setup(entry.entry_id)
|
|
await hass.async_block_till_done()
|
|
|
|
return entry
|
|
|
|
|
|
def _patch_async_setup_entry(return_value=True):
|
|
"""Patch the async entry setup of sonarr."""
|
|
return patch(
|
|
"homeassistant.components.sonarr.async_setup_entry",
|
|
return_value=return_value,
|
|
)
|