mirror of
https://github.com/home-assistant/core.git
synced 2025-07-21 12:17:07 +00:00
Improve type hints in rainforest_raven tests (#118950)
This commit is contained in:
parent
121bfc9766
commit
f425420899
@ -1,10 +1,11 @@
|
|||||||
"""Test Rainforest RAVEn config flow."""
|
"""Test Rainforest RAVEn config flow."""
|
||||||
|
|
||||||
from unittest.mock import patch
|
from collections.abc import Generator
|
||||||
|
from unittest.mock import AsyncMock, patch
|
||||||
|
|
||||||
from aioraven.device import RAVEnConnectionError
|
from aioraven.device import RAVEnConnectionError
|
||||||
import pytest
|
import pytest
|
||||||
import serial.tools.list_ports
|
from serial.tools.list_ports_common import ListPortInfo
|
||||||
|
|
||||||
from homeassistant.components.rainforest_raven.const import DOMAIN
|
from homeassistant.components.rainforest_raven.const import DOMAIN
|
||||||
from homeassistant.config_entries import SOURCE_USB, SOURCE_USER
|
from homeassistant.config_entries import SOURCE_USB, SOURCE_USER
|
||||||
@ -19,7 +20,7 @@ from tests.common import MockConfigEntry
|
|||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def mock_device():
|
def mock_device() -> Generator[AsyncMock, None, None]:
|
||||||
"""Mock a functioning RAVEn device."""
|
"""Mock a functioning RAVEn device."""
|
||||||
device = create_mock_device()
|
device = create_mock_device()
|
||||||
with patch(
|
with patch(
|
||||||
@ -30,7 +31,7 @@ def mock_device():
|
|||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def mock_device_no_open(mock_device):
|
def mock_device_no_open(mock_device: AsyncMock) -> AsyncMock:
|
||||||
"""Mock a device which fails to open."""
|
"""Mock a device which fails to open."""
|
||||||
mock_device.__aenter__.side_effect = RAVEnConnectionError
|
mock_device.__aenter__.side_effect = RAVEnConnectionError
|
||||||
mock_device.open.side_effect = RAVEnConnectionError
|
mock_device.open.side_effect = RAVEnConnectionError
|
||||||
@ -38,7 +39,7 @@ def mock_device_no_open(mock_device):
|
|||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def mock_device_comm_error(mock_device):
|
def mock_device_comm_error(mock_device: AsyncMock) -> AsyncMock:
|
||||||
"""Mock a device which fails to read or parse raw data."""
|
"""Mock a device which fails to read or parse raw data."""
|
||||||
mock_device.get_meter_list.side_effect = RAVEnConnectionError
|
mock_device.get_meter_list.side_effect = RAVEnConnectionError
|
||||||
mock_device.get_meter_info.side_effect = RAVEnConnectionError
|
mock_device.get_meter_info.side_effect = RAVEnConnectionError
|
||||||
@ -46,7 +47,7 @@ def mock_device_comm_error(mock_device):
|
|||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def mock_device_timeout(mock_device):
|
def mock_device_timeout(mock_device: AsyncMock) -> AsyncMock:
|
||||||
"""Mock a device which times out when queried."""
|
"""Mock a device which times out when queried."""
|
||||||
mock_device.get_meter_list.side_effect = TimeoutError
|
mock_device.get_meter_list.side_effect = TimeoutError
|
||||||
mock_device.get_meter_info.side_effect = TimeoutError
|
mock_device.get_meter_info.side_effect = TimeoutError
|
||||||
@ -54,9 +55,9 @@ def mock_device_timeout(mock_device):
|
|||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def mock_comports():
|
def mock_comports() -> Generator[list[ListPortInfo], None, None]:
|
||||||
"""Mock serial port list."""
|
"""Mock serial port list."""
|
||||||
port = serial.tools.list_ports_common.ListPortInfo(DISCOVERY_INFO.device)
|
port = ListPortInfo(DISCOVERY_INFO.device)
|
||||||
port.serial_number = DISCOVERY_INFO.serial_number
|
port.serial_number = DISCOVERY_INFO.serial_number
|
||||||
port.manufacturer = DISCOVERY_INFO.manufacturer
|
port.manufacturer = DISCOVERY_INFO.manufacturer
|
||||||
port.device = DISCOVERY_INFO.device
|
port.device = DISCOVERY_INFO.device
|
||||||
@ -68,7 +69,8 @@ def mock_comports():
|
|||||||
yield comports
|
yield comports
|
||||||
|
|
||||||
|
|
||||||
async def test_flow_usb(hass: HomeAssistant, mock_comports, mock_device):
|
@pytest.mark.usefixtures("mock_comports", "mock_device")
|
||||||
|
async def test_flow_usb(hass: HomeAssistant) -> None:
|
||||||
"""Test usb flow connection."""
|
"""Test usb flow connection."""
|
||||||
result = await hass.config_entries.flow.async_init(
|
result = await hass.config_entries.flow.async_init(
|
||||||
DOMAIN, context={CONF_SOURCE: SOURCE_USB}, data=DISCOVERY_INFO
|
DOMAIN, context={CONF_SOURCE: SOURCE_USB}, data=DISCOVERY_INFO
|
||||||
@ -86,9 +88,8 @@ async def test_flow_usb(hass: HomeAssistant, mock_comports, mock_device):
|
|||||||
assert result.get("type") is FlowResultType.CREATE_ENTRY
|
assert result.get("type") is FlowResultType.CREATE_ENTRY
|
||||||
|
|
||||||
|
|
||||||
async def test_flow_usb_cannot_connect(
|
@pytest.mark.usefixtures("mock_comports", "mock_device_no_open")
|
||||||
hass: HomeAssistant, mock_comports, mock_device_no_open
|
async def test_flow_usb_cannot_connect(hass: HomeAssistant) -> None:
|
||||||
):
|
|
||||||
"""Test usb flow connection error."""
|
"""Test usb flow connection error."""
|
||||||
result = await hass.config_entries.flow.async_init(
|
result = await hass.config_entries.flow.async_init(
|
||||||
DOMAIN, context={CONF_SOURCE: SOURCE_USB}, data=DISCOVERY_INFO
|
DOMAIN, context={CONF_SOURCE: SOURCE_USB}, data=DISCOVERY_INFO
|
||||||
@ -98,9 +99,8 @@ async def test_flow_usb_cannot_connect(
|
|||||||
assert result.get("reason") == "cannot_connect"
|
assert result.get("reason") == "cannot_connect"
|
||||||
|
|
||||||
|
|
||||||
async def test_flow_usb_timeout_connect(
|
@pytest.mark.usefixtures("mock_comports", "mock_device_timeout")
|
||||||
hass: HomeAssistant, mock_comports, mock_device_timeout
|
async def test_flow_usb_timeout_connect(hass: HomeAssistant) -> None:
|
||||||
):
|
|
||||||
"""Test usb flow connection timeout."""
|
"""Test usb flow connection timeout."""
|
||||||
result = await hass.config_entries.flow.async_init(
|
result = await hass.config_entries.flow.async_init(
|
||||||
DOMAIN, context={CONF_SOURCE: SOURCE_USB}, data=DISCOVERY_INFO
|
DOMAIN, context={CONF_SOURCE: SOURCE_USB}, data=DISCOVERY_INFO
|
||||||
@ -110,9 +110,8 @@ async def test_flow_usb_timeout_connect(
|
|||||||
assert result.get("reason") == "timeout_connect"
|
assert result.get("reason") == "timeout_connect"
|
||||||
|
|
||||||
|
|
||||||
async def test_flow_usb_comm_error(
|
@pytest.mark.usefixtures("mock_comports", "mock_device_comm_error")
|
||||||
hass: HomeAssistant, mock_comports, mock_device_comm_error
|
async def test_flow_usb_comm_error(hass: HomeAssistant) -> None:
|
||||||
):
|
|
||||||
"""Test usb flow connection failure to communicate."""
|
"""Test usb flow connection failure to communicate."""
|
||||||
result = await hass.config_entries.flow.async_init(
|
result = await hass.config_entries.flow.async_init(
|
||||||
DOMAIN, context={CONF_SOURCE: SOURCE_USB}, data=DISCOVERY_INFO
|
DOMAIN, context={CONF_SOURCE: SOURCE_USB}, data=DISCOVERY_INFO
|
||||||
@ -122,7 +121,8 @@ async def test_flow_usb_comm_error(
|
|||||||
assert result.get("reason") == "cannot_connect"
|
assert result.get("reason") == "cannot_connect"
|
||||||
|
|
||||||
|
|
||||||
async def test_flow_user(hass: HomeAssistant, mock_comports, mock_device):
|
@pytest.mark.usefixtures("mock_comports", "mock_device")
|
||||||
|
async def test_flow_user(hass: HomeAssistant) -> None:
|
||||||
"""Test user flow connection."""
|
"""Test user flow connection."""
|
||||||
result = await hass.config_entries.flow.async_init(
|
result = await hass.config_entries.flow.async_init(
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
@ -153,7 +153,8 @@ async def test_flow_user(hass: HomeAssistant, mock_comports, mock_device):
|
|||||||
assert result.get("type") is FlowResultType.CREATE_ENTRY
|
assert result.get("type") is FlowResultType.CREATE_ENTRY
|
||||||
|
|
||||||
|
|
||||||
async def test_flow_user_no_available_devices(hass: HomeAssistant, mock_comports):
|
@pytest.mark.usefixtures("mock_comports")
|
||||||
|
async def test_flow_user_no_available_devices(hass: HomeAssistant) -> None:
|
||||||
"""Test user flow with no available devices."""
|
"""Test user flow with no available devices."""
|
||||||
entry = MockConfigEntry(
|
entry = MockConfigEntry(
|
||||||
domain=DOMAIN,
|
domain=DOMAIN,
|
||||||
@ -169,7 +170,8 @@ async def test_flow_user_no_available_devices(hass: HomeAssistant, mock_comports
|
|||||||
assert result.get("reason") == "no_devices_found"
|
assert result.get("reason") == "no_devices_found"
|
||||||
|
|
||||||
|
|
||||||
async def test_flow_user_in_progress(hass: HomeAssistant, mock_comports):
|
@pytest.mark.usefixtures("mock_comports")
|
||||||
|
async def test_flow_user_in_progress(hass: HomeAssistant) -> None:
|
||||||
"""Test user flow with no available devices."""
|
"""Test user flow with no available devices."""
|
||||||
result = await hass.config_entries.flow.async_init(
|
result = await hass.config_entries.flow.async_init(
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
@ -190,9 +192,8 @@ async def test_flow_user_in_progress(hass: HomeAssistant, mock_comports):
|
|||||||
assert result.get("reason") == "already_in_progress"
|
assert result.get("reason") == "already_in_progress"
|
||||||
|
|
||||||
|
|
||||||
async def test_flow_user_cannot_connect(
|
@pytest.mark.usefixtures("mock_comports", "mock_device_no_open")
|
||||||
hass: HomeAssistant, mock_comports, mock_device_no_open
|
async def test_flow_user_cannot_connect(hass: HomeAssistant) -> None:
|
||||||
):
|
|
||||||
"""Test user flow connection failure to communicate."""
|
"""Test user flow connection failure to communicate."""
|
||||||
result = await hass.config_entries.flow.async_init(
|
result = await hass.config_entries.flow.async_init(
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
@ -206,9 +207,8 @@ async def test_flow_user_cannot_connect(
|
|||||||
assert result.get("errors") == {CONF_DEVICE: "cannot_connect"}
|
assert result.get("errors") == {CONF_DEVICE: "cannot_connect"}
|
||||||
|
|
||||||
|
|
||||||
async def test_flow_user_timeout_connect(
|
@pytest.mark.usefixtures("mock_comports", "mock_device_timeout")
|
||||||
hass: HomeAssistant, mock_comports, mock_device_timeout
|
async def test_flow_user_timeout_connect(hass: HomeAssistant) -> None:
|
||||||
):
|
|
||||||
"""Test user flow connection failure to communicate."""
|
"""Test user flow connection failure to communicate."""
|
||||||
result = await hass.config_entries.flow.async_init(
|
result = await hass.config_entries.flow.async_init(
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
@ -222,9 +222,8 @@ async def test_flow_user_timeout_connect(
|
|||||||
assert result.get("errors") == {CONF_DEVICE: "timeout_connect"}
|
assert result.get("errors") == {CONF_DEVICE: "timeout_connect"}
|
||||||
|
|
||||||
|
|
||||||
async def test_flow_user_comm_error(
|
@pytest.mark.usefixtures("mock_comports", "mock_device_comm_error")
|
||||||
hass: HomeAssistant, mock_comports, mock_device_comm_error
|
async def test_flow_user_comm_error(hass: HomeAssistant) -> None:
|
||||||
):
|
|
||||||
"""Test user flow connection failure to communicate."""
|
"""Test user flow connection failure to communicate."""
|
||||||
result = await hass.config_entries.flow.async_init(
|
result = await hass.config_entries.flow.async_init(
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
import functools
|
import functools
|
||||||
|
from unittest.mock import AsyncMock
|
||||||
|
|
||||||
from aioraven.device import RAVEnConnectionError
|
from aioraven.device import RAVEnConnectionError
|
||||||
import pytest
|
import pytest
|
||||||
@ -13,7 +14,8 @@ from homeassistant.exceptions import ConfigEntryNotReady
|
|||||||
from . import create_mock_entry
|
from . import create_mock_entry
|
||||||
|
|
||||||
|
|
||||||
async def test_coordinator_device_info(hass: HomeAssistant, mock_device):
|
@pytest.mark.usefixtures("mock_device")
|
||||||
|
async def test_coordinator_device_info(hass: HomeAssistant) -> None:
|
||||||
"""Test reporting device information from the coordinator."""
|
"""Test reporting device information from the coordinator."""
|
||||||
entry = create_mock_entry()
|
entry = create_mock_entry()
|
||||||
coordinator = RAVEnDataCoordinator(hass, entry)
|
coordinator = RAVEnDataCoordinator(hass, entry)
|
||||||
@ -37,7 +39,9 @@ async def test_coordinator_device_info(hass: HomeAssistant, mock_device):
|
|||||||
assert coordinator.device_name == "RAVEn Device"
|
assert coordinator.device_name == "RAVEn Device"
|
||||||
|
|
||||||
|
|
||||||
async def test_coordinator_cache_device(hass: HomeAssistant, mock_device):
|
async def test_coordinator_cache_device(
|
||||||
|
hass: HomeAssistant, mock_device: AsyncMock
|
||||||
|
) -> None:
|
||||||
"""Test that the device isn't re-opened for subsequent refreshes."""
|
"""Test that the device isn't re-opened for subsequent refreshes."""
|
||||||
entry = create_mock_entry()
|
entry = create_mock_entry()
|
||||||
coordinator = RAVEnDataCoordinator(hass, entry)
|
coordinator = RAVEnDataCoordinator(hass, entry)
|
||||||
@ -51,7 +55,9 @@ async def test_coordinator_cache_device(hass: HomeAssistant, mock_device):
|
|||||||
assert mock_device.open.call_count == 1
|
assert mock_device.open.call_count == 1
|
||||||
|
|
||||||
|
|
||||||
async def test_coordinator_device_error_setup(hass: HomeAssistant, mock_device):
|
async def test_coordinator_device_error_setup(
|
||||||
|
hass: HomeAssistant, mock_device: AsyncMock
|
||||||
|
) -> None:
|
||||||
"""Test handling of a device error during initialization."""
|
"""Test handling of a device error during initialization."""
|
||||||
entry = create_mock_entry()
|
entry = create_mock_entry()
|
||||||
coordinator = RAVEnDataCoordinator(hass, entry)
|
coordinator = RAVEnDataCoordinator(hass, entry)
|
||||||
@ -61,7 +67,9 @@ async def test_coordinator_device_error_setup(hass: HomeAssistant, mock_device):
|
|||||||
await coordinator.async_config_entry_first_refresh()
|
await coordinator.async_config_entry_first_refresh()
|
||||||
|
|
||||||
|
|
||||||
async def test_coordinator_device_error_update(hass: HomeAssistant, mock_device):
|
async def test_coordinator_device_error_update(
|
||||||
|
hass: HomeAssistant, mock_device: AsyncMock
|
||||||
|
) -> None:
|
||||||
"""Test handling of a device error during an update."""
|
"""Test handling of a device error during an update."""
|
||||||
entry = create_mock_entry()
|
entry = create_mock_entry()
|
||||||
coordinator = RAVEnDataCoordinator(hass, entry)
|
coordinator = RAVEnDataCoordinator(hass, entry)
|
||||||
@ -74,7 +82,9 @@ async def test_coordinator_device_error_update(hass: HomeAssistant, mock_device)
|
|||||||
assert coordinator.last_update_success is False
|
assert coordinator.last_update_success is False
|
||||||
|
|
||||||
|
|
||||||
async def test_coordinator_device_timeout_update(hass: HomeAssistant, mock_device):
|
async def test_coordinator_device_timeout_update(
|
||||||
|
hass: HomeAssistant, mock_device: AsyncMock
|
||||||
|
) -> None:
|
||||||
"""Test handling of a device timeout during an update."""
|
"""Test handling of a device timeout during an update."""
|
||||||
entry = create_mock_entry()
|
entry = create_mock_entry()
|
||||||
coordinator = RAVEnDataCoordinator(hass, entry)
|
coordinator = RAVEnDataCoordinator(hass, entry)
|
||||||
@ -87,7 +97,9 @@ async def test_coordinator_device_timeout_update(hass: HomeAssistant, mock_devic
|
|||||||
assert coordinator.last_update_success is False
|
assert coordinator.last_update_success is False
|
||||||
|
|
||||||
|
|
||||||
async def test_coordinator_comm_error(hass: HomeAssistant, mock_device):
|
async def test_coordinator_comm_error(
|
||||||
|
hass: HomeAssistant, mock_device: AsyncMock
|
||||||
|
) -> None:
|
||||||
"""Test handling of an error parsing or reading raw device data."""
|
"""Test handling of an error parsing or reading raw device data."""
|
||||||
entry = create_mock_entry()
|
entry = create_mock_entry()
|
||||||
coordinator = RAVEnDataCoordinator(hass, entry)
|
coordinator = RAVEnDataCoordinator(hass, entry)
|
||||||
|
@ -4,8 +4,12 @@ from homeassistant.components.rainforest_raven.const import DOMAIN
|
|||||||
from homeassistant.config_entries import ConfigEntryState
|
from homeassistant.config_entries import ConfigEntryState
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
|
|
||||||
|
from tests.common import MockConfigEntry
|
||||||
|
|
||||||
async def test_load_unload_entry(hass: HomeAssistant, mock_entry):
|
|
||||||
|
async def test_load_unload_entry(
|
||||||
|
hass: HomeAssistant, mock_entry: MockConfigEntry
|
||||||
|
) -> None:
|
||||||
"""Test load and unload."""
|
"""Test load and unload."""
|
||||||
assert len(hass.config_entries.async_entries(DOMAIN)) == 1
|
assert len(hass.config_entries.async_entries(DOMAIN)) == 1
|
||||||
assert mock_entry.state is ConfigEntryState.LOADED
|
assert mock_entry.state is ConfigEntryState.LOADED
|
||||||
|
@ -1,9 +1,12 @@
|
|||||||
"""Tests for the Rainforest RAVEn sensors."""
|
"""Tests for the Rainforest RAVEn sensors."""
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
|
|
||||||
|
|
||||||
async def test_sensors(hass: HomeAssistant, mock_device, mock_entry):
|
@pytest.mark.usefixtures("mock_entry")
|
||||||
|
async def test_sensors(hass: HomeAssistant) -> None:
|
||||||
"""Test the sensors."""
|
"""Test the sensors."""
|
||||||
assert len(hass.states.async_all()) == 5
|
assert len(hass.states.async_all()) == 5
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user