From 37b0e8fa335e0f013a35d88dcde9a3c394b586be Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Fri, 7 Jun 2024 15:35:33 +0200 Subject: [PATCH] Improve type hints in airvisual test fixtures (#119079) --- tests/components/airvisual/conftest.py | 41 ++++++++++++++-------- tests/components/airvisual_pro/conftest.py | 30 ++++++++++------ 2 files changed, 45 insertions(+), 26 deletions(-) diff --git a/tests/components/airvisual/conftest.py b/tests/components/airvisual/conftest.py index 90e13e2f4be..a82dc0ab78c 100644 --- a/tests/components/airvisual/conftest.py +++ b/tests/components/airvisual/conftest.py @@ -1,10 +1,10 @@ """Define test fixtures for AirVisual.""" -import json +from typing import Any from unittest.mock import AsyncMock, Mock, patch import pytest -from typing_extensions import Generator +from typing_extensions import AsyncGenerator, Generator from homeassistant.components.airvisual import ( CONF_CITY, @@ -21,8 +21,10 @@ from homeassistant.const import ( CONF_SHOW_ON_MAP, CONF_STATE, ) +from homeassistant.core import HomeAssistant +from homeassistant.util.json import JsonObjectType -from tests.common import MockConfigEntry, load_fixture +from tests.common import MockConfigEntry, load_json_object_fixture TEST_API_KEY = "abcde12345" TEST_LATITUDE = 51.528308 @@ -55,7 +57,7 @@ NAME_CONFIG = { @pytest.fixture(name="cloud_api") -def cloud_api_fixture(data_cloud): +def cloud_api_fixture(data_cloud: JsonObjectType) -> Mock: """Define a mock CloudAPI object.""" return Mock( air_quality=Mock( @@ -66,7 +68,12 @@ def cloud_api_fixture(data_cloud): @pytest.fixture(name="config_entry") -def config_entry_fixture(hass, config, config_entry_version, integration_type): +def config_entry_fixture( + hass: HomeAssistant, + config: dict[str, Any], + config_entry_version: int, + integration_type: str, +) -> MockConfigEntry: """Define a config entry fixture.""" entry = MockConfigEntry( domain=DOMAIN, @@ -81,37 +88,39 @@ def config_entry_fixture(hass, config, config_entry_version, integration_type): @pytest.fixture(name="config_entry_version") -def config_entry_version_fixture(): +def config_entry_version_fixture() -> int: """Define a config entry version fixture.""" return 2 @pytest.fixture(name="config") -def config_fixture(): +def config_fixture() -> dict[str, Any]: """Define a config entry data fixture.""" return COORDS_CONFIG @pytest.fixture(name="data_cloud", scope="package") -def data_cloud_fixture(): +def data_cloud_fixture() -> JsonObjectType: """Define an update coordinator data example.""" - return json.loads(load_fixture("data.json", "airvisual")) + return load_json_object_fixture("data.json", "airvisual") @pytest.fixture(name="data_pro", scope="package") -def data_pro_fixture(): +def data_pro_fixture() -> JsonObjectType: """Define an update coordinator data example for the Pro.""" - return json.loads(load_fixture("data.json", "airvisual_pro")) + return load_json_object_fixture("data.json", "airvisual_pro") @pytest.fixture(name="integration_type") -def integration_type_fixture(): +def integration_type_fixture() -> str: """Define an integration type.""" return INTEGRATION_TYPE_GEOGRAPHY_COORDS @pytest.fixture(name="mock_pyairvisual") -async def mock_pyairvisual_fixture(cloud_api, node_samba): +async def mock_pyairvisual_fixture( + cloud_api: Mock, node_samba: Mock +) -> AsyncGenerator[None]: """Define a fixture to patch pyairvisual.""" with ( patch( @@ -135,7 +144,7 @@ async def mock_pyairvisual_fixture(cloud_api, node_samba): @pytest.fixture(name="node_samba") -def node_samba_fixture(data_pro): +def node_samba_fixture(data_pro: JsonObjectType) -> Mock: """Define a mock NodeSamba object.""" return Mock( async_connect=AsyncMock(), @@ -145,7 +154,9 @@ def node_samba_fixture(data_pro): @pytest.fixture(name="setup_config_entry") -async def setup_config_entry_fixture(hass, config_entry, mock_pyairvisual): +async def setup_config_entry_fixture( + hass: HomeAssistant, config_entry: MockConfigEntry, mock_pyairvisual: None +) -> None: """Define a fixture to set up airvisual.""" assert await hass.config_entries.async_setup(config_entry.entry_id) await hass.async_block_till_done() diff --git a/tests/components/airvisual_pro/conftest.py b/tests/components/airvisual_pro/conftest.py index d81d7471cac..d25e9821d91 100644 --- a/tests/components/airvisual_pro/conftest.py +++ b/tests/components/airvisual_pro/conftest.py @@ -1,16 +1,18 @@ """Define test fixtures for AirVisual Pro.""" -import json +from typing import Any from unittest.mock import AsyncMock, Mock, patch import pytest -from typing_extensions import Generator +from typing_extensions import AsyncGenerator, Generator from homeassistant.components.airvisual_pro.const import DOMAIN from homeassistant.const import CONF_IP_ADDRESS, CONF_PASSWORD +from homeassistant.core import HomeAssistant from homeassistant.setup import async_setup_component +from homeassistant.util.json import JsonObjectType -from tests.common import MockConfigEntry, load_fixture +from tests.common import MockConfigEntry, load_json_object_fixture @pytest.fixture @@ -23,7 +25,9 @@ def mock_setup_entry() -> Generator[AsyncMock]: @pytest.fixture(name="config_entry") -def config_entry_fixture(hass, config): +def config_entry_fixture( + hass: HomeAssistant, config: dict[str, Any] +) -> MockConfigEntry: """Define a config entry fixture.""" entry = MockConfigEntry( domain=DOMAIN, @@ -36,7 +40,7 @@ def config_entry_fixture(hass, config): @pytest.fixture(name="config") -def config_fixture(hass): +def config_fixture() -> dict[str, Any]: """Define a config entry data fixture.""" return { CONF_IP_ADDRESS: "192.168.1.101", @@ -45,25 +49,27 @@ def config_fixture(hass): @pytest.fixture(name="connect") -def connect_fixture(): +def connect_fixture() -> AsyncMock: """Define a mocked async_connect method.""" return AsyncMock(return_value=True) @pytest.fixture(name="disconnect") -def disconnect_fixture(): +def disconnect_fixture() -> AsyncMock: """Define a mocked async_connect method.""" return AsyncMock() @pytest.fixture(name="data", scope="package") -def data_fixture(): +def data_fixture() -> JsonObjectType: """Define an update coordinator data example.""" - return json.loads(load_fixture("data.json", "airvisual_pro")) + return load_json_object_fixture("data.json", "airvisual_pro") @pytest.fixture(name="pro") -def pro_fixture(connect, data, disconnect): +def pro_fixture( + connect: AsyncMock, data: JsonObjectType, disconnect: AsyncMock +) -> Mock: """Define a mocked NodeSamba object.""" return Mock( async_connect=connect, @@ -73,7 +79,9 @@ def pro_fixture(connect, data, disconnect): @pytest.fixture(name="setup_airvisual_pro") -async def setup_airvisual_pro_fixture(hass, config, pro): +async def setup_airvisual_pro_fixture( + hass: HomeAssistant, config, pro +) -> AsyncGenerator[None]: """Define a fixture to set up AirVisual Pro.""" with ( patch(