From 8abbd35c54944f94b39220f15be7527bc51707b9 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Mon, 26 May 2025 21:50:28 +0200 Subject: [PATCH] Add ability to load test fixtures on the executor (#144534) --- tests/common.py | 21 +++++++++++++++++++++ tests/components/easyenergy/conftest.py | 11 +++++------ tests/components/energyzero/conftest.py | 11 +++++------ 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/tests/common.py b/tests/common.py index 869291c9463..66129ecc9c3 100644 --- a/tests/common.py +++ b/tests/common.py @@ -575,6 +575,13 @@ def load_fixture(filename: str, integration: str | None = None) -> str: return get_fixture_path(filename, integration).read_text(encoding="utf8") +async def async_load_fixture( + hass: HomeAssistant, filename: str, integration: str | None = None +) -> str: + """Load a fixture.""" + return await hass.async_add_executor_job(load_fixture, filename, integration) + + def load_json_value_fixture( filename: str, integration: str | None = None ) -> JsonValueType: @@ -589,6 +596,13 @@ def load_json_array_fixture( return json_loads_array(load_fixture(filename, integration)) +async def async_load_json_array_fixture( + hass: HomeAssistant, filename: str, integration: str | None = None +) -> JsonArrayType: + """Load a JSON object from a fixture.""" + return json_loads_array(await async_load_fixture(hass, filename, integration)) + + def load_json_object_fixture( filename: str, integration: str | None = None ) -> JsonObjectType: @@ -596,6 +610,13 @@ def load_json_object_fixture( return json_loads_object(load_fixture(filename, integration)) +async def async_load_json_object_fixture( + hass: HomeAssistant, filename: str, integration: str | None = None +) -> JsonObjectType: + """Load a JSON object from a fixture.""" + return json_loads_object(await async_load_fixture(hass, filename, integration)) + + def json_round_trip(obj: Any) -> Any: """Round trip an object to JSON.""" return json_loads(json_dumps(obj)) diff --git a/tests/components/easyenergy/conftest.py b/tests/components/easyenergy/conftest.py index ffe0e36f3d2..f2ed2cf4dbc 100644 --- a/tests/components/easyenergy/conftest.py +++ b/tests/components/easyenergy/conftest.py @@ -1,7 +1,6 @@ """Fixtures for easyEnergy integration tests.""" -from collections.abc import Generator -import json +from collections.abc import AsyncGenerator, Generator from unittest.mock import AsyncMock, MagicMock, patch from easyenergy import Electricity, Gas @@ -10,7 +9,7 @@ import pytest from homeassistant.components.easyenergy.const import DOMAIN from homeassistant.core import HomeAssistant -from tests.common import MockConfigEntry, load_fixture +from tests.common import MockConfigEntry, async_load_json_array_fixture @pytest.fixture @@ -34,17 +33,17 @@ def mock_config_entry() -> MockConfigEntry: @pytest.fixture -def mock_easyenergy() -> Generator[MagicMock]: +async def mock_easyenergy(hass: HomeAssistant) -> AsyncGenerator[MagicMock]: """Return a mocked easyEnergy client.""" with patch( "homeassistant.components.easyenergy.coordinator.EasyEnergy", autospec=True ) as easyenergy_mock: client = easyenergy_mock.return_value client.energy_prices.return_value = Electricity.from_dict( - json.loads(load_fixture("today_energy.json", DOMAIN)) + await async_load_json_array_fixture(hass, "today_energy.json", DOMAIN) ) client.gas_prices.return_value = Gas.from_dict( - json.loads(load_fixture("today_gas.json", DOMAIN)) + await async_load_json_array_fixture(hass, "today_gas.json", DOMAIN) ) yield client diff --git a/tests/components/energyzero/conftest.py b/tests/components/energyzero/conftest.py index 3fd93ee31f8..d861e1365f7 100644 --- a/tests/components/energyzero/conftest.py +++ b/tests/components/energyzero/conftest.py @@ -1,7 +1,6 @@ """Fixtures for EnergyZero integration tests.""" -from collections.abc import Generator -import json +from collections.abc import AsyncGenerator, Generator from unittest.mock import AsyncMock, MagicMock, patch from energyzero import Electricity, Gas @@ -10,7 +9,7 @@ import pytest from homeassistant.components.energyzero.const import DOMAIN from homeassistant.core import HomeAssistant -from tests.common import MockConfigEntry, load_fixture +from tests.common import MockConfigEntry, async_load_json_object_fixture @pytest.fixture @@ -35,17 +34,17 @@ def mock_config_entry() -> MockConfigEntry: @pytest.fixture -def mock_energyzero() -> Generator[MagicMock]: +async def mock_energyzero(hass: HomeAssistant) -> AsyncGenerator[MagicMock]: """Return a mocked EnergyZero client.""" with patch( "homeassistant.components.energyzero.coordinator.EnergyZero", autospec=True ) as energyzero_mock: client = energyzero_mock.return_value client.energy_prices.return_value = Electricity.from_dict( - json.loads(load_fixture("today_energy.json", DOMAIN)) + await async_load_json_object_fixture(hass, "today_energy.json", DOMAIN) ) client.gas_prices.return_value = Gas.from_dict( - json.loads(load_fixture("today_gas.json", DOMAIN)) + await async_load_json_object_fixture(hass, "today_gas.json", DOMAIN) ) yield client