* Make async_get_device connections Optional, default None * Remove unnecessary async_get_device connections arg usages Some of these were using an incorrect collection type, which didn't cause issues mostly just due to luck.
175 lines
6.2 KiB
Python
175 lines
6.2 KiB
Python
"""Tests for 1-Wire devices connected on SysBus."""
|
|
from unittest.mock import patch
|
|
|
|
from pi1wire import InvalidCRCException, UnsupportResponseException
|
|
import pytest
|
|
|
|
from homeassistant.components.onewire.const import DEFAULT_SYSBUS_MOUNT_DIR, DOMAIN
|
|
from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN
|
|
from homeassistant.const import DEVICE_CLASS_TEMPERATURE, TEMP_CELSIUS
|
|
from homeassistant.setup import async_setup_component
|
|
|
|
from tests.common import mock_device_registry, mock_registry
|
|
|
|
MOCK_CONFIG = {
|
|
SENSOR_DOMAIN: {
|
|
"platform": DOMAIN,
|
|
"mount_dir": DEFAULT_SYSBUS_MOUNT_DIR,
|
|
"names": {
|
|
"10-111111111111": "My DS18B20",
|
|
},
|
|
}
|
|
}
|
|
|
|
MOCK_DEVICE_SENSORS = {
|
|
"00-111111111111": {"sensors": []},
|
|
"10-111111111111": {
|
|
"device_info": {
|
|
"identifiers": {(DOMAIN, "10-111111111111")},
|
|
"manufacturer": "Maxim Integrated",
|
|
"model": "10",
|
|
"name": "10-111111111111",
|
|
},
|
|
"sensors": [
|
|
{
|
|
"entity_id": "sensor.my_ds18b20_temperature",
|
|
"unique_id": "/sys/bus/w1/devices/10-111111111111/w1_slave",
|
|
"injected_value": 25.123,
|
|
"result": "25.1",
|
|
"unit": TEMP_CELSIUS,
|
|
"class": DEVICE_CLASS_TEMPERATURE,
|
|
},
|
|
],
|
|
},
|
|
"12-111111111111": {"sensors": []},
|
|
"1D-111111111111": {"sensors": []},
|
|
"22-111111111111": {
|
|
"device_info": {
|
|
"identifiers": {(DOMAIN, "22-111111111111")},
|
|
"manufacturer": "Maxim Integrated",
|
|
"model": "22",
|
|
"name": "22-111111111111",
|
|
},
|
|
"sensors": [
|
|
{
|
|
"entity_id": "sensor.22_111111111111_temperature",
|
|
"unique_id": "/sys/bus/w1/devices/22-111111111111/w1_slave",
|
|
"injected_value": FileNotFoundError,
|
|
"result": "unknown",
|
|
"unit": TEMP_CELSIUS,
|
|
"class": DEVICE_CLASS_TEMPERATURE,
|
|
},
|
|
],
|
|
},
|
|
"26-111111111111": {"sensors": []},
|
|
"28-111111111111": {
|
|
"device_info": {
|
|
"identifiers": {(DOMAIN, "28-111111111111")},
|
|
"manufacturer": "Maxim Integrated",
|
|
"model": "28",
|
|
"name": "28-111111111111",
|
|
},
|
|
"sensors": [
|
|
{
|
|
"entity_id": "sensor.28_111111111111_temperature",
|
|
"unique_id": "/sys/bus/w1/devices/28-111111111111/w1_slave",
|
|
"injected_value": InvalidCRCException,
|
|
"result": "unknown",
|
|
"unit": TEMP_CELSIUS,
|
|
"class": DEVICE_CLASS_TEMPERATURE,
|
|
},
|
|
],
|
|
},
|
|
"29-111111111111": {"sensors": []},
|
|
"3B-111111111111": {
|
|
"device_info": {
|
|
"identifiers": {(DOMAIN, "3B-111111111111")},
|
|
"manufacturer": "Maxim Integrated",
|
|
"model": "3B",
|
|
"name": "3B-111111111111",
|
|
},
|
|
"sensors": [
|
|
{
|
|
"entity_id": "sensor.3b_111111111111_temperature",
|
|
"unique_id": "/sys/bus/w1/devices/3B-111111111111/w1_slave",
|
|
"injected_value": 29.993,
|
|
"result": "30.0",
|
|
"unit": TEMP_CELSIUS,
|
|
"class": DEVICE_CLASS_TEMPERATURE,
|
|
},
|
|
],
|
|
},
|
|
"42-111111111111": {
|
|
"device_info": {
|
|
"identifiers": {(DOMAIN, "42-111111111111")},
|
|
"manufacturer": "Maxim Integrated",
|
|
"model": "42",
|
|
"name": "42-111111111111",
|
|
},
|
|
"sensors": [
|
|
{
|
|
"entity_id": "sensor.42_111111111111_temperature",
|
|
"unique_id": "/sys/bus/w1/devices/42-111111111111/w1_slave",
|
|
"injected_value": UnsupportResponseException,
|
|
"result": "unknown",
|
|
"unit": TEMP_CELSIUS,
|
|
"class": DEVICE_CLASS_TEMPERATURE,
|
|
},
|
|
],
|
|
},
|
|
"EF-111111111111": {
|
|
"sensors": [],
|
|
},
|
|
"EF-111111111112": {
|
|
"sensors": [],
|
|
},
|
|
}
|
|
|
|
|
|
@pytest.mark.parametrize("device_id", MOCK_DEVICE_SENSORS.keys())
|
|
async def test_onewiredirect_setup_valid_device(hass, device_id):
|
|
"""Test that sysbus config entry works correctly."""
|
|
entity_registry = mock_registry(hass)
|
|
device_registry = mock_device_registry(hass)
|
|
|
|
mock_device_sensor = MOCK_DEVICE_SENSORS[device_id]
|
|
|
|
glob_result = [f"/{DEFAULT_SYSBUS_MOUNT_DIR}/{device_id}"]
|
|
read_side_effect = []
|
|
expected_sensors = mock_device_sensor["sensors"]
|
|
for expected_sensor in expected_sensors:
|
|
read_side_effect.append(expected_sensor["injected_value"])
|
|
|
|
# Ensure enough read side effect
|
|
read_side_effect.extend([FileNotFoundError("Missing injected value")] * 20)
|
|
|
|
with patch(
|
|
"homeassistant.components.onewire.onewirehub.os.path.isdir", return_value=True
|
|
), patch("pi1wire._finder.glob.glob", return_value=glob_result,), patch(
|
|
"pi1wire.OneWire.get_temperature",
|
|
side_effect=read_side_effect,
|
|
):
|
|
assert await async_setup_component(hass, SENSOR_DOMAIN, MOCK_CONFIG)
|
|
await hass.async_block_till_done()
|
|
|
|
assert len(entity_registry.entities) == len(expected_sensors)
|
|
|
|
if len(expected_sensors) > 0:
|
|
device_info = mock_device_sensor["device_info"]
|
|
assert len(device_registry.devices) == 1
|
|
registry_entry = device_registry.async_get_device({(DOMAIN, device_id)})
|
|
assert registry_entry is not None
|
|
assert registry_entry.identifiers == {(DOMAIN, device_id)}
|
|
assert registry_entry.manufacturer == device_info["manufacturer"]
|
|
assert registry_entry.name == device_info["name"]
|
|
assert registry_entry.model == device_info["model"]
|
|
|
|
for expected_sensor in expected_sensors:
|
|
entity_id = expected_sensor["entity_id"]
|
|
registry_entry = entity_registry.entities.get(entity_id)
|
|
assert registry_entry is not None
|
|
assert registry_entry.unique_id == expected_sensor["unique_id"]
|
|
assert registry_entry.unit_of_measurement == expected_sensor["unit"]
|
|
assert registry_entry.device_class == expected_sensor["class"]
|
|
state = hass.states.get(entity_id)
|
|
assert state.state == expected_sensor["result"]
|