mirror of https://github.com/home-assistant/core
195 lines
6.5 KiB
Python
195 lines
6.5 KiB
Python
"""The tests for the hddtemp platform."""
|
|
|
|
import socket
|
|
from unittest.mock import patch
|
|
|
|
import pytest
|
|
|
|
from homeassistant.const import UnitOfTemperature
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.setup import async_setup_component
|
|
|
|
VALID_CONFIG_MINIMAL = {"sensor": {"platform": "hddtemp"}}
|
|
|
|
VALID_CONFIG_NAME = {"sensor": {"platform": "hddtemp", "name": "FooBar"}}
|
|
|
|
VALID_CONFIG_ONE_DISK = {"sensor": {"platform": "hddtemp", "disks": ["/dev/sdd1"]}}
|
|
|
|
VALID_CONFIG_WRONG_DISK = {"sensor": {"platform": "hddtemp", "disks": ["/dev/sdx1"]}}
|
|
|
|
VALID_CONFIG_MULTIPLE_DISKS = {
|
|
"sensor": {
|
|
"platform": "hddtemp",
|
|
"host": "foobar.local",
|
|
"disks": ["/dev/sda1", "/dev/sdb1", "/dev/sdc1"],
|
|
}
|
|
}
|
|
|
|
VALID_CONFIG_HOST_REFUSED = {"sensor": {"platform": "hddtemp", "host": "alice.local"}}
|
|
|
|
VALID_CONFIG_HOST_UNREACHABLE = {"sensor": {"platform": "hddtemp", "host": "bob.local"}}
|
|
|
|
REFERENCE = {
|
|
"/dev/sda1": {
|
|
"device": "/dev/sda1",
|
|
"temperature": "29",
|
|
"unit_of_measurement": UnitOfTemperature.CELSIUS,
|
|
"model": "WDC WD30EZRX-12DC0B0",
|
|
},
|
|
"/dev/sdb1": {
|
|
"device": "/dev/sdb1",
|
|
"temperature": "32",
|
|
"unit_of_measurement": UnitOfTemperature.CELSIUS,
|
|
"model": "WDC WD15EADS-11P7B2",
|
|
},
|
|
"/dev/sdc1": {
|
|
"device": "/dev/sdc1",
|
|
"temperature": "29",
|
|
"unit_of_measurement": UnitOfTemperature.CELSIUS,
|
|
"model": "WDC WD20EARX-22MMMB0",
|
|
},
|
|
"/dev/sdd1": {
|
|
"device": "/dev/sdd1",
|
|
"temperature": "32",
|
|
"unit_of_measurement": UnitOfTemperature.CELSIUS,
|
|
"model": "WDC WD15EARS-00Z5B1",
|
|
},
|
|
}
|
|
|
|
|
|
class TelnetMock:
|
|
"""Mock class for the telnetlib.Telnet object."""
|
|
|
|
def __init__(self, host, port, timeout=0) -> None:
|
|
"""Initialize Telnet object."""
|
|
self.host = host
|
|
self.port = port
|
|
self.timeout = timeout
|
|
self.sample_data = bytes(
|
|
"|/dev/sda1|WDC WD30EZRX-12DC0B0|29|C|"
|
|
"|/dev/sdb1|WDC WD15EADS-11P7B2|32|C|"
|
|
"|/dev/sdc1|WDC WD20EARX-22MMMB0|29|C|"
|
|
"|/dev/sdd1|WDC WD15EARS-00Z5B1|89|F|",
|
|
"ascii",
|
|
)
|
|
|
|
def read_all(self):
|
|
"""Return sample values."""
|
|
if self.host == "alice.local":
|
|
raise ConnectionRefusedError
|
|
if self.host == "bob.local":
|
|
raise socket.gaierror
|
|
return self.sample_data
|
|
|
|
|
|
@pytest.fixture
|
|
def telnetmock():
|
|
"""Mock telnet."""
|
|
with patch("homeassistant.components.hddtemp.sensor.Telnet", new=TelnetMock):
|
|
yield
|
|
|
|
|
|
async def test_hddtemp_min_config(hass: HomeAssistant, telnetmock) -> None:
|
|
"""Test minimal hddtemp configuration."""
|
|
assert await async_setup_component(hass, "sensor", VALID_CONFIG_MINIMAL)
|
|
await hass.async_block_till_done()
|
|
|
|
entity_id = hass.states.async_all()[0].entity_id
|
|
state = hass.states.get(entity_id)
|
|
|
|
reference = REFERENCE[state.attributes.get("device")]
|
|
|
|
assert state.state == reference["temperature"]
|
|
assert state.attributes.get("device") == reference["device"]
|
|
assert state.attributes.get("model") == reference["model"]
|
|
assert (
|
|
state.attributes.get("unit_of_measurement") == reference["unit_of_measurement"]
|
|
)
|
|
assert (
|
|
state.attributes.get("friendly_name") == f"HD Temperature {reference['device']}"
|
|
)
|
|
|
|
|
|
async def test_hddtemp_rename_config(hass: HomeAssistant, telnetmock) -> None:
|
|
"""Test hddtemp configuration with different name."""
|
|
assert await async_setup_component(hass, "sensor", VALID_CONFIG_NAME)
|
|
await hass.async_block_till_done()
|
|
|
|
entity_id = hass.states.async_all()[0].entity_id
|
|
state = hass.states.get(entity_id)
|
|
|
|
reference = REFERENCE[state.attributes.get("device")]
|
|
|
|
assert state.attributes.get("friendly_name") == f"FooBar {reference['device']}"
|
|
|
|
|
|
async def test_hddtemp_one_disk(hass: HomeAssistant, telnetmock) -> None:
|
|
"""Test hddtemp one disk configuration."""
|
|
assert await async_setup_component(hass, "sensor", VALID_CONFIG_ONE_DISK)
|
|
await hass.async_block_till_done()
|
|
|
|
state = hass.states.get("sensor.hd_temperature_dev_sdd1")
|
|
|
|
reference = REFERENCE[state.attributes.get("device")]
|
|
|
|
assert state.state == reference["temperature"]
|
|
assert state.attributes.get("device") == reference["device"]
|
|
assert state.attributes.get("model") == reference["model"]
|
|
assert (
|
|
state.attributes.get("unit_of_measurement") == reference["unit_of_measurement"]
|
|
)
|
|
assert (
|
|
state.attributes.get("friendly_name") == f"HD Temperature {reference['device']}"
|
|
)
|
|
|
|
|
|
async def test_hddtemp_wrong_disk(hass: HomeAssistant, telnetmock) -> None:
|
|
"""Test hddtemp wrong disk configuration."""
|
|
assert await async_setup_component(hass, "sensor", VALID_CONFIG_WRONG_DISK)
|
|
await hass.async_block_till_done()
|
|
|
|
assert len(hass.states.async_all()) == 1
|
|
state = hass.states.get("sensor.hd_temperature_dev_sdx1")
|
|
assert state.attributes.get("friendly_name") == "HD Temperature /dev/sdx1"
|
|
|
|
|
|
async def test_hddtemp_multiple_disks(hass: HomeAssistant, telnetmock) -> None:
|
|
"""Test hddtemp multiple disk configuration."""
|
|
assert await async_setup_component(hass, "sensor", VALID_CONFIG_MULTIPLE_DISKS)
|
|
await hass.async_block_till_done()
|
|
|
|
for sensor in (
|
|
"sensor.hd_temperature_dev_sda1",
|
|
"sensor.hd_temperature_dev_sdb1",
|
|
"sensor.hd_temperature_dev_sdc1",
|
|
):
|
|
state = hass.states.get(sensor)
|
|
|
|
reference = REFERENCE[state.attributes.get("device")]
|
|
|
|
assert state.state == reference["temperature"]
|
|
assert state.attributes.get("device") == reference["device"]
|
|
assert state.attributes.get("model") == reference["model"]
|
|
assert (
|
|
state.attributes.get("unit_of_measurement")
|
|
== reference["unit_of_measurement"]
|
|
)
|
|
assert (
|
|
state.attributes.get("friendly_name")
|
|
== f"HD Temperature {reference['device']}"
|
|
)
|
|
|
|
|
|
async def test_hddtemp_host_refused(hass: HomeAssistant, telnetmock) -> None:
|
|
"""Test hddtemp if host is refused."""
|
|
assert await async_setup_component(hass, "sensor", VALID_CONFIG_HOST_REFUSED)
|
|
await hass.async_block_till_done()
|
|
assert len(hass.states.async_all()) == 0
|
|
|
|
|
|
async def test_hddtemp_host_unreachable(hass: HomeAssistant, telnetmock) -> None:
|
|
"""Test hddtemp if host unreachable."""
|
|
assert await async_setup_component(hass, "sensor", VALID_CONFIG_HOST_UNREACHABLE)
|
|
await hass.async_block_till_done()
|
|
assert len(hass.states.async_all()) == 0
|