Update huisbaasje-client 0.1.0 to energyflip-client 0.2.0 (#79233)

This commit is contained in:
Dennis Schroer 2022-09-29 19:25:23 +02:00 committed by GitHub
parent b659a19f4a
commit ee32e0eb3f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 131 additions and 58 deletions

View File

@ -3,7 +3,7 @@ from datetime import timedelta
import logging import logging
import async_timeout import async_timeout
from huisbaasje import Huisbaasje, HuisbaasjeException from energyflip import EnergyFlip, EnergyFlipException
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_PASSWORD, CONF_USERNAME, Platform from homeassistant.const import CONF_PASSWORD, CONF_USERNAME, Platform
@ -31,7 +31,7 @@ _LOGGER = logging.getLogger(__name__)
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Set up Huisbaasje from a config entry.""" """Set up Huisbaasje from a config entry."""
# Create the Huisbaasje client # Create the Huisbaasje client
huisbaasje = Huisbaasje( energyflip = EnergyFlip(
username=entry.data[CONF_USERNAME], username=entry.data[CONF_USERNAME],
password=entry.data[CONF_PASSWORD], password=entry.data[CONF_PASSWORD],
source_types=SOURCE_TYPES, source_types=SOURCE_TYPES,
@ -40,13 +40,13 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
# Attempt authentication. If this fails, an exception is thrown # Attempt authentication. If this fails, an exception is thrown
try: try:
await huisbaasje.authenticate() await energyflip.authenticate()
except HuisbaasjeException as exception: except EnergyFlipException as exception:
_LOGGER.error("Authentication failed: %s", str(exception)) _LOGGER.error("Authentication failed: %s", str(exception))
return False return False
async def async_update_data(): async def async_update_data():
return await async_update_huisbaasje(huisbaasje) return await async_update_huisbaasje(energyflip)
# Create a coordinator for polling updates # Create a coordinator for polling updates
coordinator = DataUpdateCoordinator( coordinator = DataUpdateCoordinator(
@ -80,17 +80,17 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
return unload_ok return unload_ok
async def async_update_huisbaasje(huisbaasje): async def async_update_huisbaasje(energyflip):
"""Update the data by performing a request to Huisbaasje.""" """Update the data by performing a request to Huisbaasje."""
try: try:
# Note: asyncio.TimeoutError and aiohttp.ClientError are already # Note: asyncio.TimeoutError and aiohttp.ClientError are already
# handled by the data update coordinator. # handled by the data update coordinator.
async with async_timeout.timeout(FETCH_TIMEOUT): async with async_timeout.timeout(FETCH_TIMEOUT):
if not huisbaasje.is_authenticated(): if not energyflip.is_authenticated():
_LOGGER.warning("Huisbaasje is unauthenticated. Reauthenticating") _LOGGER.warning("Huisbaasje is unauthenticated. Reauthenticating")
await huisbaasje.authenticate() await energyflip.authenticate()
current_measurements = await huisbaasje.current_measurements() current_measurements = await energyflip.current_measurements()
return { return {
source_type: { source_type: {
@ -112,7 +112,7 @@ async def async_update_huisbaasje(huisbaasje):
} }
for source_type in SOURCE_TYPES for source_type in SOURCE_TYPES
} }
except HuisbaasjeException as exception: except EnergyFlipException as exception:
raise UpdateFailed(f"Error communicating with API: {exception}") from exception raise UpdateFailed(f"Error communicating with API: {exception}") from exception

View File

@ -1,7 +1,7 @@
"""Config flow for Huisbaasje integration.""" """Config flow for Huisbaasje integration."""
import logging import logging
from huisbaasje import Huisbaasje, HuisbaasjeConnectionException, HuisbaasjeException from energyflip import EnergyFlip, EnergyFlipConnectionException, EnergyFlipException
import voluptuous as vol import voluptuous as vol
from homeassistant import config_entries from homeassistant import config_entries
@ -31,10 +31,10 @@ class HuisbaasjeConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
try: try:
user_id = await self._validate_input(user_input) user_id = await self._validate_input(user_input)
except HuisbaasjeConnectionException as exception: except EnergyFlipConnectionException as exception:
_LOGGER.warning(exception) _LOGGER.warning(exception)
errors["base"] = "cannot_connect" errors["base"] = "cannot_connect"
except HuisbaasjeException as exception: except EnergyFlipException as exception:
_LOGGER.warning(exception) _LOGGER.warning(exception)
errors["base"] = "invalid_auth" errors["base"] = "invalid_auth"
except AbortFlow: except AbortFlow:
@ -72,9 +72,12 @@ class HuisbaasjeConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
username = user_input[CONF_USERNAME] username = user_input[CONF_USERNAME]
password = user_input[CONF_PASSWORD] password = user_input[CONF_PASSWORD]
huisbaasje = Huisbaasje(username, password) energyflip = EnergyFlip(username, password)
# Attempt authentication. If this fails, an HuisbaasjeException will be thrown # Attempt authentication. If this fails, an EnergyFlipException will be thrown
await huisbaasje.authenticate() await energyflip.authenticate()
return huisbaasje.get_user_id() # Request customer overview. This also sets the user id on the client
await energyflip.customer_overview()
return energyflip.get_user_id()

View File

@ -1,5 +1,5 @@
"""Constants for the Huisbaasje integration.""" """Constants for the Huisbaasje integration."""
from huisbaasje.const import ( from energyflip.const import (
SOURCE_TYPE_ELECTRICITY, SOURCE_TYPE_ELECTRICITY,
SOURCE_TYPE_ELECTRICITY_IN, SOURCE_TYPE_ELECTRICITY_IN,
SOURCE_TYPE_ELECTRICITY_IN_LOW, SOURCE_TYPE_ELECTRICITY_IN_LOW,

View File

@ -3,7 +3,7 @@
"name": "Huisbaasje", "name": "Huisbaasje",
"config_flow": true, "config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/huisbaasje", "documentation": "https://www.home-assistant.io/integrations/huisbaasje",
"requirements": ["huisbaasje-client==0.1.0"], "requirements": ["energyflip-client==0.2.1"],
"codeowners": ["@dennisschroer"], "codeowners": ["@dennisschroer"],
"iot_class": "cloud_polling", "iot_class": "cloud_polling",
"loggers": ["huisbaasje"] "loggers": ["huisbaasje"]

View File

@ -622,6 +622,9 @@ elmax_api==0.0.2
# homeassistant.components.emulated_roku # homeassistant.components.emulated_roku
emulated_roku==0.2.1 emulated_roku==0.2.1
# homeassistant.components.huisbaasje
energyflip-client==0.2.1
# homeassistant.components.enocean # homeassistant.components.enocean
enocean==0.50 enocean==0.50
@ -882,9 +885,6 @@ httplib2==0.20.4
# homeassistant.components.huawei_lte # homeassistant.components.huawei_lte
huawei-lte-api==1.6.1 huawei-lte-api==1.6.1
# homeassistant.components.huisbaasje
huisbaasje-client==0.1.0
# homeassistant.components.hydrawise # homeassistant.components.hydrawise
hydrawiser==0.2 hydrawiser==0.2

View File

@ -475,6 +475,9 @@ elmax_api==0.0.2
# homeassistant.components.emulated_roku # homeassistant.components.emulated_roku
emulated_roku==0.2.1 emulated_roku==0.2.1
# homeassistant.components.huisbaasje
energyflip-client==0.2.1
# homeassistant.components.enocean # homeassistant.components.enocean
enocean==0.50 enocean==0.50
@ -659,9 +662,6 @@ httplib2==0.20.4
# homeassistant.components.huawei_lte # homeassistant.components.huawei_lte
huawei-lte-api==1.6.1 huawei-lte-api==1.6.1
# homeassistant.components.huisbaasje
huisbaasje-client==0.1.0
# homeassistant.components.hyperion # homeassistant.components.hyperion
hyperion-py==0.7.5 hyperion-py==0.7.5

View File

@ -1,11 +1,13 @@
"""Test the Huisbaasje config flow.""" """Test the Huisbaasje config flow."""
from unittest.mock import patch from unittest.mock import patch
from homeassistant import config_entries, data_entry_flow from energyflip import (
from homeassistant.components.huisbaasje.config_flow import ( EnergyFlipConnectionException,
HuisbaasjeConnectionException, EnergyFlipException,
HuisbaasjeException, EnergyFlipUnauthenticatedException,
) )
from homeassistant import config_entries, data_entry_flow
from homeassistant.components.huisbaasje.const import DOMAIN from homeassistant.components.huisbaasje.const import DOMAIN
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
@ -21,9 +23,11 @@ async def test_form(hass):
assert result["errors"] == {} assert result["errors"] == {}
with patch( with patch(
"huisbaasje.Huisbaasje.authenticate", return_value=None "energyflip.EnergyFlip.authenticate", return_value=None
) as mock_authenticate, patch( ) as mock_authenticate, patch(
"huisbaasje.Huisbaasje.get_user_id", "energyflip.EnergyFlip.customer_overview", return_value=None
) as mock_customer_overview, patch(
"energyflip.EnergyFlip.get_user_id",
return_value="test-id", return_value="test-id",
) as mock_get_user_id, patch( ) as mock_get_user_id, patch(
"homeassistant.components.huisbaasje.async_setup_entry", "homeassistant.components.huisbaasje.async_setup_entry",
@ -46,6 +50,7 @@ async def test_form(hass):
"password": "test-password", "password": "test-password",
} }
assert len(mock_authenticate.mock_calls) == 1 assert len(mock_authenticate.mock_calls) == 1
assert len(mock_customer_overview.mock_calls) == 1
assert len(mock_get_user_id.mock_calls) == 1 assert len(mock_get_user_id.mock_calls) == 1
assert len(mock_setup_entry.mock_calls) == 1 assert len(mock_setup_entry.mock_calls) == 1
@ -57,8 +62,8 @@ async def test_form_invalid_auth(hass):
) )
with patch( with patch(
"huisbaasje.Huisbaasje.authenticate", "energyflip.EnergyFlip.authenticate",
side_effect=HuisbaasjeException, side_effect=EnergyFlipException,
): ):
form_result = await hass.config_entries.flow.async_configure( form_result = await hass.config_entries.flow.async_configure(
result["flow_id"], result["flow_id"],
@ -72,15 +77,15 @@ async def test_form_invalid_auth(hass):
assert form_result["errors"] == {"base": "invalid_auth"} assert form_result["errors"] == {"base": "invalid_auth"}
async def test_form_cannot_connect(hass): async def test_form_authenticate_cannot_connect(hass):
"""Test we handle cannot connect error.""" """Test we handle cannot connect error in authenticate."""
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": config_entries.SOURCE_USER} DOMAIN, context={"source": config_entries.SOURCE_USER}
) )
with patch( with patch(
"huisbaasje.Huisbaasje.authenticate", "energyflip.EnergyFlip.authenticate",
side_effect=HuisbaasjeConnectionException, side_effect=EnergyFlipConnectionException,
): ):
form_result = await hass.config_entries.flow.async_configure( form_result = await hass.config_entries.flow.async_configure(
result["flow_id"], result["flow_id"],
@ -94,14 +99,80 @@ async def test_form_cannot_connect(hass):
assert form_result["errors"] == {"base": "cannot_connect"} assert form_result["errors"] == {"base": "cannot_connect"}
async def test_form_unknown_error(hass): async def test_form_authenticate_unknown_error(hass):
"""Test we handle an unknown error.""" """Test we handle an unknown error in authenticate."""
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": config_entries.SOURCE_USER} DOMAIN, context={"source": config_entries.SOURCE_USER}
) )
with patch( with patch(
"huisbaasje.Huisbaasje.authenticate", "energyflip.EnergyFlip.authenticate",
side_effect=Exception,
):
form_result = await hass.config_entries.flow.async_configure(
result["flow_id"],
{
"username": "test-username",
"password": "test-password",
},
)
assert form_result["type"] == data_entry_flow.FlowResultType.FORM
assert form_result["errors"] == {"base": "unknown"}
async def test_form_customer_overview_cannot_connect(hass):
"""Test we handle cannot connect error in customer_overview."""
result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": config_entries.SOURCE_USER}
)
with patch("energyflip.EnergyFlip.authenticate", return_value=None), patch(
"energyflip.EnergyFlip.customer_overview",
side_effect=EnergyFlipConnectionException,
):
form_result = await hass.config_entries.flow.async_configure(
result["flow_id"],
{
"username": "test-username",
"password": "test-password",
},
)
assert form_result["type"] == data_entry_flow.FlowResultType.FORM
assert form_result["errors"] == {"base": "cannot_connect"}
async def test_form_customer_overview_authentication_error(hass):
"""Test we handle an unknown error in customer_overview."""
result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": config_entries.SOURCE_USER}
)
with patch("energyflip.EnergyFlip.authenticate", return_value=None), patch(
"energyflip.EnergyFlip.customer_overview",
side_effect=EnergyFlipUnauthenticatedException,
):
form_result = await hass.config_entries.flow.async_configure(
result["flow_id"],
{
"username": "test-username",
"password": "test-password",
},
)
assert form_result["type"] == data_entry_flow.FlowResultType.FORM
assert form_result["errors"] == {"base": "invalid_auth"}
async def test_form_customer_overview_unknown_error(hass):
"""Test we handle an unknown error in customer_overview."""
result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": config_entries.SOURCE_USER}
)
with patch("energyflip.EnergyFlip.authenticate", return_value=None), patch(
"energyflip.EnergyFlip.customer_overview",
side_effect=Exception, side_effect=Exception,
): ):
form_result = await hass.config_entries.flow.async_configure( form_result = await hass.config_entries.flow.async_configure(
@ -133,10 +204,9 @@ async def test_form_entry_exists(hass):
DOMAIN, context={"source": config_entries.SOURCE_USER} DOMAIN, context={"source": config_entries.SOURCE_USER}
) )
with patch("huisbaasje.Huisbaasje.authenticate", return_value=None), patch( with patch("energyflip.EnergyFlip.authenticate", return_value=None), patch(
"huisbaasje.Huisbaasje.get_user_id", "energyflip.EnergyFlip.customer_overview", return_value=None
return_value="test-id", ), patch("energyflip.EnergyFlip.get_user_id", return_value="test-id",), patch(
), patch(
"homeassistant.components.huisbaasje.async_setup_entry", "homeassistant.components.huisbaasje.async_setup_entry",
return_value=True, return_value=True,
): ):

View File

@ -1,7 +1,7 @@
"""Test cases for the initialisation of the Huisbaasje integration.""" """Test cases for the initialisation of the Huisbaasje integration."""
from unittest.mock import patch from unittest.mock import patch
from huisbaasje import HuisbaasjeException from energyflip import EnergyFlipException
from homeassistant.components import huisbaasje from homeassistant.components import huisbaasje
from homeassistant.config_entries import ConfigEntryState from homeassistant.config_entries import ConfigEntryState
@ -24,11 +24,11 @@ async def test_setup(hass: HomeAssistant):
async def test_setup_entry(hass: HomeAssistant): async def test_setup_entry(hass: HomeAssistant):
"""Test for successfully setting a config entry.""" """Test for successfully setting a config entry."""
with patch( with patch(
"huisbaasje.Huisbaasje.authenticate", return_value=None "energyflip.EnergyFlip.authenticate", return_value=None
) as mock_authenticate, patch( ) as mock_authenticate, patch(
"huisbaasje.Huisbaasje.is_authenticated", return_value=True "energyflip.EnergyFlip.is_authenticated", return_value=True
) as mock_is_authenticated, patch( ) as mock_is_authenticated, patch(
"huisbaasje.Huisbaasje.current_measurements", "energyflip.EnergyFlip.current_measurements",
return_value=MOCK_CURRENT_MEASUREMENTS, return_value=MOCK_CURRENT_MEASUREMENTS,
) as mock_current_measurements: ) as mock_current_measurements:
hass.config.components.add(huisbaasje.DOMAIN) hass.config.components.add(huisbaasje.DOMAIN)
@ -68,7 +68,7 @@ async def test_setup_entry(hass: HomeAssistant):
async def test_setup_entry_error(hass: HomeAssistant): async def test_setup_entry_error(hass: HomeAssistant):
"""Test for successfully setting a config entry.""" """Test for successfully setting a config entry."""
with patch( with patch(
"huisbaasje.Huisbaasje.authenticate", side_effect=HuisbaasjeException "energyflip.EnergyFlip.authenticate", side_effect=EnergyFlipException
) as mock_authenticate: ) as mock_authenticate:
hass.config.components.add(huisbaasje.DOMAIN) hass.config.components.add(huisbaasje.DOMAIN)
config_entry = MockConfigEntry( config_entry = MockConfigEntry(
@ -103,11 +103,11 @@ async def test_setup_entry_error(hass: HomeAssistant):
async def test_unload_entry(hass: HomeAssistant): async def test_unload_entry(hass: HomeAssistant):
"""Test for successfully unloading the config entry.""" """Test for successfully unloading the config entry."""
with patch( with patch(
"huisbaasje.Huisbaasje.authenticate", return_value=None "energyflip.EnergyFlip.authenticate", return_value=None
) as mock_authenticate, patch( ) as mock_authenticate, patch(
"huisbaasje.Huisbaasje.is_authenticated", return_value=True "energyflip.EnergyFlip.is_authenticated", return_value=True
) as mock_is_authenticated, patch( ) as mock_is_authenticated, patch(
"huisbaasje.Huisbaasje.current_measurements", "energyflip.EnergyFlip.current_measurements",
return_value=MOCK_CURRENT_MEASUREMENTS, return_value=MOCK_CURRENT_MEASUREMENTS,
) as mock_current_measurements: ) as mock_current_measurements:
hass.config.components.add(huisbaasje.DOMAIN) hass.config.components.add(huisbaasje.DOMAIN)

View File

@ -29,11 +29,11 @@ from tests.common import MockConfigEntry
async def test_setup_entry(hass: HomeAssistant): async def test_setup_entry(hass: HomeAssistant):
"""Test for successfully loading sensor states.""" """Test for successfully loading sensor states."""
with patch( with patch(
"huisbaasje.Huisbaasje.authenticate", return_value=None "energyflip.EnergyFlip.authenticate", return_value=None
) as mock_authenticate, patch( ) as mock_authenticate, patch(
"huisbaasje.Huisbaasje.is_authenticated", return_value=True "energyflip.EnergyFlip.is_authenticated", return_value=True
) as mock_is_authenticated, patch( ) as mock_is_authenticated, patch(
"huisbaasje.Huisbaasje.current_measurements", "energyflip.EnergyFlip.current_measurements",
return_value=MOCK_CURRENT_MEASUREMENTS, return_value=MOCK_CURRENT_MEASUREMENTS,
) as mock_current_measurements: ) as mock_current_measurements:
@ -344,11 +344,11 @@ async def test_setup_entry(hass: HomeAssistant):
async def test_setup_entry_absent_measurement(hass: HomeAssistant): async def test_setup_entry_absent_measurement(hass: HomeAssistant):
"""Test for successfully loading sensor states when response does not contain all measurements.""" """Test for successfully loading sensor states when response does not contain all measurements."""
with patch( with patch(
"huisbaasje.Huisbaasje.authenticate", return_value=None "energyflip.EnergyFlip.authenticate", return_value=None
) as mock_authenticate, patch( ) as mock_authenticate, patch(
"huisbaasje.Huisbaasje.is_authenticated", return_value=True "energyflip.EnergyFlip.is_authenticated", return_value=True
) as mock_is_authenticated, patch( ) as mock_is_authenticated, patch(
"huisbaasje.Huisbaasje.current_measurements", "energyflip.EnergyFlip.current_measurements",
return_value=MOCK_LIMITED_CURRENT_MEASUREMENTS, return_value=MOCK_LIMITED_CURRENT_MEASUREMENTS,
) as mock_current_measurements: ) as mock_current_measurements: