core/tests/components/synology_dsm/test_diagnostics.py

200 lines
7.0 KiB
Python

"""Test Synology DSM diagnostics."""
from unittest.mock import AsyncMock, MagicMock, Mock, patch
import pytest
from synology_dsm.api.core.external_usb import SynoCoreExternalUSBDevice
from synology_dsm.api.dsm.network import NetworkInterface
from syrupy.assertion import SnapshotAssertion
from syrupy.filters import props
from homeassistant.components.synology_dsm.const import DOMAIN
from homeassistant.const import (
CONF_HOST,
CONF_MAC,
CONF_PASSWORD,
CONF_PORT,
CONF_SSL,
CONF_USERNAME,
)
from homeassistant.core import HomeAssistant
from .common import mock_dsm_information
from .consts import HOST, MACS, PASSWORD, PORT, SERIAL, USE_SSL, USERNAME
from tests.common import MockConfigEntry
from tests.components.diagnostics import get_diagnostics_for_config_entry
from tests.typing import ClientSessionGenerator
@pytest.fixture
def mock_dsm_with_usb():
"""Mock a successful service with USB support."""
with patch("homeassistant.components.synology_dsm.common.SynologyDSM") as dsm:
dsm.login = AsyncMock(return_value=True)
dsm.update = AsyncMock(return_value=True)
dsm.surveillance_station.update = AsyncMock(return_value=True)
dsm.upgrade = Mock(
update_available=False,
available_version=None,
reboot_needed=None,
service_restarts=None,
update=AsyncMock(return_value=True),
)
dsm.utilisation = Mock(
cpu={
"15min_load": 461,
"1min_load": 410,
"5min_load": 404,
"device": "System",
"other_load": 5,
"system_load": 11,
"user_load": 11,
},
memory={
"avail_real": 463628,
"avail_swap": 0,
"buffer": 10556600,
"cached": 5297776,
"device": "Memory",
"memory_size": 33554432,
"real_usage": 50,
"si_disk": 0,
"so_disk": 0,
"swap_usage": 100,
"total_real": 32841680,
"total_swap": 2097084,
},
network=[
{"device": "total", "rx": 1065612, "tx": 36311},
{"device": "eth0", "rx": 1065612, "tx": 36311},
],
memory_available_swap=Mock(return_value=0),
memory_available_real=Mock(return_value=463628),
memory_total_swap=Mock(return_value=2097084),
memory_total_real=Mock(return_value=32841680),
network_up=Mock(return_value=1065612),
network_down=Mock(return_value=36311),
update=AsyncMock(return_value=True),
)
dsm.network = Mock(
update=AsyncMock(return_value=True),
macs=MACS,
hostname=HOST,
interfaces=[
NetworkInterface(
{
"id": "ovs_eth0",
"ip": [{"address": "127.0.0.1", "netmask": "255.255.255.0"}],
"type": "ovseth",
}
)
],
)
dsm.information = mock_dsm_information()
dsm.file = Mock(get_shared_folders=AsyncMock(return_value=None))
dsm.external_usb = Mock(
update=AsyncMock(return_value=True),
get_device=Mock(
return_value=SynoCoreExternalUSBDevice(
{
"dev_id": "usb1",
"dev_type": "usbDisk",
"dev_title": "USB Disk 1",
"producer": "Western Digital Technologies, Inc.",
"product": "easystore 264D",
"formatable": True,
"progress": "",
"status": "normal",
"total_size_mb": 15259648,
"partitions": [
{
"dev_fstype": "ntfs",
"filesystem": "ntfs",
"name_id": "usb1p1",
"partition_title": "USB Disk 1 Partition 1",
"share_name": "usbshare1",
"status": "normal",
"total_size_mb": 15259646,
"used_size_mb": 5942441,
}
],
}
)
),
get_devices={
"usb1": SynoCoreExternalUSBDevice(
{
"dev_id": "usb1",
"dev_type": "usbDisk",
"dev_title": "USB Disk 1",
"producer": "Western Digital Technologies, Inc.",
"product": "easystore 264D",
"formatable": True,
"progress": "",
"status": "normal",
"total_size_mb": 15259648,
"partitions": [
{
"dev_fstype": "ntfs",
"filesystem": "ntfs",
"name_id": "usb1p1",
"partition_title": "USB Disk 1 Partition 1",
"share_name": "usbshare1",
"status": "normal",
"total_size_mb": 15259646,
"used_size_mb": 5942441,
}
],
}
)
},
)
dsm.logout = AsyncMock(return_value=True)
yield dsm
@pytest.fixture
async def setup_dsm_with_usb(
hass: HomeAssistant,
mock_dsm_with_usb: MagicMock,
):
"""Mock setup of synology dsm config entry with USB."""
with patch(
"homeassistant.components.synology_dsm.common.SynologyDSM",
return_value=mock_dsm_with_usb,
):
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],
},
unique_id=SERIAL,
)
entry.add_to_hass(hass)
await hass.config_entries.async_setup(entry.entry_id)
await hass.async_block_till_done()
yield mock_dsm_with_usb
async def test_entry_diagnostics(
hass: HomeAssistant,
hass_client: ClientSessionGenerator,
setup_dsm_with_usb: MagicMock,
snapshot: SnapshotAssertion,
) -> None:
"""Test diagnostics for Synology DSM config entry."""
config_entry = hass.config_entries.async_entries(DOMAIN)[0]
result = await get_diagnostics_for_config_entry(hass, hass_client, config_entry)
assert result == snapshot(
exclude=props("api_details", "created_at", "modified_at", "entry_id")
)