Cleanup Discovergy a bit (#104552)

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
This commit is contained in:
Jan-Philipp Benecke 2023-11-26 17:32:47 +01:00 committed by GitHub
parent ad17acc6ca
commit b314df272f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 45 additions and 66 deletions

View File

@ -3,7 +3,7 @@ from __future__ import annotations
from dataclasses import dataclass from dataclasses import dataclass
import pydiscovergy from pydiscovergy import Discovergy
from pydiscovergy.authentication import BasicAuth from pydiscovergy.authentication import BasicAuth
import pydiscovergy.error as discovergyError import pydiscovergy.error as discovergyError
from pydiscovergy.models import Meter from pydiscovergy.models import Meter
@ -24,7 +24,7 @@ PLATFORMS = [Platform.SENSOR]
class DiscovergyData: class DiscovergyData:
"""Discovergy data class to share meters and api client.""" """Discovergy data class to share meters and api client."""
api_client: pydiscovergy.Discovergy api_client: Discovergy
meters: list[Meter] meters: list[Meter]
coordinators: dict[str, DiscovergyUpdateCoordinator] coordinators: dict[str, DiscovergyUpdateCoordinator]
@ -35,7 +35,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
# init discovergy data class # init discovergy data class
discovergy_data = DiscovergyData( discovergy_data = DiscovergyData(
api_client=pydiscovergy.Discovergy( api_client=Discovergy(
email=entry.data[CONF_EMAIL], email=entry.data[CONF_EMAIL],
password=entry.data[CONF_PASSWORD], password=entry.data[CONF_PASSWORD],
httpx_client=get_async_client(hass), httpx_client=get_async_client(hass),

View File

@ -5,7 +5,7 @@ from collections.abc import Mapping
import logging import logging
from typing import Any from typing import Any
import pydiscovergy from pydiscovergy import Discovergy
from pydiscovergy.authentication import BasicAuth from pydiscovergy.authentication import BasicAuth
import pydiscovergy.error as discovergyError import pydiscovergy.error as discovergyError
import voluptuous as vol import voluptuous as vol
@ -70,7 +70,7 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
if user_input: if user_input:
try: try:
await pydiscovergy.Discovergy( await Discovergy(
email=user_input[CONF_EMAIL], email=user_input[CONF_EMAIL],
password=user_input[CONF_PASSWORD], password=user_input[CONF_PASSWORD],
httpx_client=get_async_client(self.hass), httpx_client=get_async_client(self.hass),

View File

@ -12,17 +12,12 @@ from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryAuthFailed from homeassistant.exceptions import ConfigEntryAuthFailed
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from .const import DOMAIN
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
class DiscovergyUpdateCoordinator(DataUpdateCoordinator[Reading]): class DiscovergyUpdateCoordinator(DataUpdateCoordinator[Reading]):
"""The Discovergy update coordinator.""" """The Discovergy update coordinator."""
discovergy_client: Discovergy
meter: Meter
def __init__( def __init__(
self, self,
hass: HomeAssistant, hass: HomeAssistant,
@ -36,7 +31,7 @@ class DiscovergyUpdateCoordinator(DataUpdateCoordinator[Reading]):
super().__init__( super().__init__(
hass, hass,
_LOGGER, _LOGGER,
name=DOMAIN, name=f"Discovergy meter {meter.meter_id}",
update_interval=timedelta(seconds=30), update_interval=timedelta(seconds=30),
) )

View File

@ -4,8 +4,6 @@ from __future__ import annotations
from dataclasses import asdict from dataclasses import asdict
from typing import Any from typing import Any
from pydiscovergy.models import Meter
from homeassistant.components.diagnostics import async_redact_data from homeassistant.components.diagnostics import async_redact_data
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
@ -30,9 +28,8 @@ async def async_get_config_entry_diagnostics(
flattened_meter: list[dict] = [] flattened_meter: list[dict] = []
last_readings: dict[str, dict] = {} last_readings: dict[str, dict] = {}
data: DiscovergyData = hass.data[DOMAIN][entry.entry_id] data: DiscovergyData = hass.data[DOMAIN][entry.entry_id]
meters: list[Meter] = data.meters # always returns a list
for meter in meters: for meter in data.meters:
# make a dict of meter data and redact some data # make a dict of meter data and redact some data
flattened_meter.append(async_redact_data(asdict(meter), TO_REDACT_METER)) flattened_meter.append(async_redact_data(asdict(meter), TO_REDACT_METER))

View File

@ -27,8 +27,6 @@ from homeassistant.helpers.update_coordinator import CoordinatorEntity
from . import DiscovergyData, DiscovergyUpdateCoordinator from . import DiscovergyData, DiscovergyUpdateCoordinator
from .const import DOMAIN, MANUFACTURER from .const import DOMAIN, MANUFACTURER
PARALLEL_UPDATES = 1
def _get_and_scale(reading: Reading, key: str, scale: int) -> datetime | float | None: def _get_and_scale(reading: Reading, key: str, scale: int) -> datetime | float | None:
"""Get a value from a Reading and divide with scale it.""" """Get a value from a Reading and divide with scale it."""
@ -168,10 +166,9 @@ async def async_setup_entry(
) -> None: ) -> None:
"""Set up the Discovergy sensors.""" """Set up the Discovergy sensors."""
data: DiscovergyData = hass.data[DOMAIN][entry.entry_id] data: DiscovergyData = hass.data[DOMAIN][entry.entry_id]
meters: list[Meter] = data.meters # always returns a list
entities: list[DiscovergySensor] = [] entities: list[DiscovergySensor] = []
for meter in meters: for meter in data.meters:
sensors: tuple[DiscovergySensorEntityDescription, ...] = () sensors: tuple[DiscovergySensorEntityDescription, ...] = ()
coordinator: DiscovergyUpdateCoordinator = data.coordinators[meter.meter_id] coordinator: DiscovergyUpdateCoordinator = data.coordinators[meter.meter_id]

View File

@ -2,7 +2,6 @@
from collections.abc import Generator from collections.abc import Generator
from unittest.mock import AsyncMock, patch from unittest.mock import AsyncMock, patch
from pydiscovergy import Discovergy
from pydiscovergy.models import Reading from pydiscovergy.models import Reading
import pytest import pytest
@ -27,14 +26,16 @@ def _meter_last_reading(meter_id: str) -> Reading:
@pytest.fixture(name="discovergy") @pytest.fixture(name="discovergy")
def mock_discovergy() -> Generator[AsyncMock, None, None]: def mock_discovergy() -> Generator[AsyncMock, None, None]:
"""Mock the pydiscovergy client.""" """Mock the pydiscovergy client."""
mock = AsyncMock(spec=Discovergy)
mock.meters.return_value = GET_METERS
mock.meter_last_reading.side_effect = _meter_last_reading
with patch( with patch(
"homeassistant.components.discovergy.pydiscovergy.Discovergy", "homeassistant.components.discovergy.Discovergy",
return_value=mock, autospec=True,
) as mock_discovergy, patch(
"homeassistant.components.discovergy.config_flow.Discovergy",
new=mock_discovergy,
): ):
mock = mock_discovergy.return_value
mock.meters.return_value = GET_METERS
mock.meter_last_reading.side_effect = _meter_last_reading
yield mock yield mock

View File

@ -11,7 +11,6 @@ from homeassistant.const import CONF_EMAIL, CONF_PASSWORD
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
from tests.components.discovergy.const import GET_METERS
async def test_form(hass: HomeAssistant, discovergy: AsyncMock) -> None: async def test_form(hass: HomeAssistant, discovergy: AsyncMock) -> None:
@ -25,10 +24,7 @@ async def test_form(hass: HomeAssistant, discovergy: AsyncMock) -> None:
with patch( with patch(
"homeassistant.components.discovergy.async_setup_entry", "homeassistant.components.discovergy.async_setup_entry",
return_value=True, return_value=True,
) as mock_setup_entry, patch( ) as mock_setup_entry:
"homeassistant.components.discovergy.config_flow.pydiscovergy.Discovergy",
return_value=discovergy,
):
result2 = await hass.config_entries.flow.async_configure( result2 = await hass.config_entries.flow.async_configure(
result["flow_id"], result["flow_id"],
{ {
@ -65,10 +61,7 @@ async def test_reauth(
with patch( with patch(
"homeassistant.components.discovergy.async_setup_entry", "homeassistant.components.discovergy.async_setup_entry",
return_value=True, return_value=True,
) as mock_setup_entry, patch( ) as mock_setup_entry:
"homeassistant.components.discovergy.config_flow.pydiscovergy.Discovergy",
return_value=discovergy,
):
configure_result = await hass.config_entries.flow.async_configure( configure_result = await hass.config_entries.flow.async_configure(
init_result["flow_id"], init_result["flow_id"],
{ {
@ -92,38 +85,34 @@ async def test_reauth(
(Exception, "unknown"), (Exception, "unknown"),
], ],
) )
async def test_form_fail(hass: HomeAssistant, error: Exception, message: str) -> None: async def test_form_fail(
hass: HomeAssistant, discovergy: AsyncMock, error: Exception, message: str
) -> None:
"""Test to handle exceptions.""" """Test to handle exceptions."""
discovergy.meters.side_effect = error
result = await hass.config_entries.flow.async_init(
DOMAIN,
context={"source": SOURCE_USER},
data={
CONF_EMAIL: "test@example.com",
CONF_PASSWORD: "test-password",
},
)
with patch( assert result["type"] == data_entry_flow.FlowResultType.FORM
"homeassistant.components.discovergy.config_flow.pydiscovergy.Discovergy.meters", assert result["step_id"] == "user"
side_effect=error, assert result["errors"] == {"base": message}
):
result = await hass.config_entries.flow.async_init(
DOMAIN,
context={"source": SOURCE_USER},
data={
CONF_EMAIL: "test@example.com",
CONF_PASSWORD: "test-password",
},
)
assert result["type"] == data_entry_flow.FlowResultType.FORM # reset and test for success
assert result["step_id"] == "user" discovergy.meters.side_effect = None
assert result["errors"] == {"base": message} result = await hass.config_entries.flow.async_configure(
result["flow_id"],
{
CONF_EMAIL: "test@example.com",
CONF_PASSWORD: "test-password",
},
)
with patch( assert result["type"] == data_entry_flow.FlowResultType.CREATE_ENTRY
"homeassistant.components.discovergy.config_flow.pydiscovergy.Discovergy.meters", assert result["title"] == "test@example.com"
return_value=GET_METERS, assert "errors" not in result
):
result = await hass.config_entries.flow.async_configure(
result["flow_id"],
{
CONF_EMAIL: "test@example.com",
CONF_PASSWORD: "test-password",
},
)
assert result["type"] == data_entry_flow.FlowResultType.CREATE_ENTRY
assert result["title"] == "test@example.com"
assert "errors" not in result