From 5f6a970826fe0c1921862a05193b587320def6ca Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 15 Apr 2022 10:54:20 -0700 Subject: [PATCH] Bump pyevilgenius to 2.0.0 (#70074) * Bump pyevilgenius to 2.0.0 * Fix tests --- .../components/evil_genius_labs/__init__.py | 22 ++++++++++++++++++- .../evil_genius_labs/config_flow.py | 2 +- .../evil_genius_labs/diagnostics.py | 2 +- .../components/evil_genius_labs/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/evil_genius_labs/conftest.py | 17 ++++++++++---- .../evil_genius_labs/test_config_flow.py | 17 +++++++++----- .../evil_genius_labs/test_diagnostics.py | 4 ++-- 9 files changed, 52 insertions(+), 18 deletions(-) diff --git a/homeassistant/components/evil_genius_labs/__init__.py b/homeassistant/components/evil_genius_labs/__init__.py index ff858db566a..da3cbb51717 100644 --- a/homeassistant/components/evil_genius_labs/__init__.py +++ b/homeassistant/components/evil_genius_labs/__init__.py @@ -5,6 +5,7 @@ from datetime import timedelta import logging from typing import cast +from aiohttp import ContentTypeError from async_timeout import timeout import pyevilgenius @@ -54,6 +55,8 @@ class EvilGeniusUpdateCoordinator(DataUpdateCoordinator[dict]): info: dict + product: dict | None + def __init__( self, hass: HomeAssistant, name: str, client: pyevilgenius.EvilGeniusDevice ) -> None: @@ -71,14 +74,30 @@ class EvilGeniusUpdateCoordinator(DataUpdateCoordinator[dict]): """Return the device name.""" return cast(str, self.data["name"]["value"]) + @property + def product_name(self) -> str | None: + """Return the product name.""" + if self.product is None: + return None + + return cast(str, self.product["productName"]) + async def _async_update_data(self) -> dict: """Update Evil Genius data.""" if not hasattr(self, "info"): async with timeout(5): self.info = await self.client.get_info() + if not hasattr(self, "product"): + async with timeout(5): + try: + self.product = await self.client.get_product() + except ContentTypeError: + # Older versions of the API don't support this + self.product = None + async with timeout(5): - return cast(dict, await self.client.get_data()) + return cast(dict, await self.client.get_all()) class EvilGeniusEntity(CoordinatorEntity[EvilGeniusUpdateCoordinator]): @@ -92,6 +111,7 @@ class EvilGeniusEntity(CoordinatorEntity[EvilGeniusUpdateCoordinator]): identifiers={(DOMAIN, info["wiFiChipId"])}, connections={(dr.CONNECTION_NETWORK_MAC, info["macAddress"])}, name=self.coordinator.device_name, + model=self.coordinator.product_name, manufacturer="Evil Genius Labs", sw_version=info["coreVersion"].replace("_", "."), configuration_url=self.coordinator.client.url, diff --git a/homeassistant/components/evil_genius_labs/config_flow.py b/homeassistant/components/evil_genius_labs/config_flow.py index 744e0194ded..53303d738a5 100644 --- a/homeassistant/components/evil_genius_labs/config_flow.py +++ b/homeassistant/components/evil_genius_labs/config_flow.py @@ -32,7 +32,7 @@ async def validate_input(hass: HomeAssistant, data: dict[str, Any]) -> dict[str, try: async with async_timeout.timeout(10): - data = await hub.get_data() + data = await hub.get_all() info = await hub.get_info() except aiohttp.ClientError as err: _LOGGER.debug("Unable to connect: %s", err) diff --git a/homeassistant/components/evil_genius_labs/diagnostics.py b/homeassistant/components/evil_genius_labs/diagnostics.py index c269f699c11..18b8c8ed572 100644 --- a/homeassistant/components/evil_genius_labs/diagnostics.py +++ b/homeassistant/components/evil_genius_labs/diagnostics.py @@ -19,5 +19,5 @@ async def async_get_config_entry_diagnostics( return { "info": async_redact_data(coordinator.info, TO_REDACT), - "data": coordinator.data, + "all": coordinator.data, } diff --git a/homeassistant/components/evil_genius_labs/manifest.json b/homeassistant/components/evil_genius_labs/manifest.json index 698c13b43e6..f0c0ba69311 100644 --- a/homeassistant/components/evil_genius_labs/manifest.json +++ b/homeassistant/components/evil_genius_labs/manifest.json @@ -3,7 +3,7 @@ "name": "Evil Genius Labs", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/evil_genius_labs", - "requirements": ["pyevilgenius==1.0.0"], + "requirements": ["pyevilgenius==2.0.0"], "codeowners": ["@balloob"], "iot_class": "local_polling" } diff --git a/requirements_all.txt b/requirements_all.txt index ce467ff0c30..6b02209eb9e 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1468,7 +1468,7 @@ pyephember==0.3.1 pyeverlights==0.1.0 # homeassistant.components.evil_genius_labs -pyevilgenius==1.0.0 +pyevilgenius==2.0.0 # homeassistant.components.ezviz pyezviz==0.2.0.6 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 391cb00eefb..7ceaa0d708e 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -962,7 +962,7 @@ pyefergy==22.1.1 pyeverlights==0.1.0 # homeassistant.components.evil_genius_labs -pyevilgenius==1.0.0 +pyevilgenius==2.0.0 # homeassistant.components.ezviz pyezviz==0.2.0.6 diff --git a/tests/components/evil_genius_labs/conftest.py b/tests/components/evil_genius_labs/conftest.py index 063e31704a5..66dd8979d67 100644 --- a/tests/components/evil_genius_labs/conftest.py +++ b/tests/components/evil_genius_labs/conftest.py @@ -10,7 +10,7 @@ from tests.common import MockConfigEntry, load_fixture @pytest.fixture(scope="session") -def data_fixture(): +def all_fixture(): """Fixture data.""" data = json.loads(load_fixture("data.json", "evil_genius_labs")) return {item["name"]: item for item in data} @@ -22,6 +22,12 @@ def info_fixture(): return json.loads(load_fixture("info.json", "evil_genius_labs")) +@pytest.fixture(scope="session") +def product_fixture(): + """Fixture info.""" + return {"productName": "Fibonacci256"} + + @pytest.fixture def config_entry(hass): """Evil genius labs config entry.""" @@ -32,15 +38,18 @@ def config_entry(hass): @pytest.fixture async def setup_evil_genius_labs( - hass, config_entry, data_fixture, info_fixture, platforms + hass, config_entry, all_fixture, info_fixture, product_fixture, platforms ): """Test up Evil Genius Labs instance.""" with patch( - "pyevilgenius.EvilGeniusDevice.get_data", - return_value=data_fixture, + "pyevilgenius.EvilGeniusDevice.get_all", + return_value=all_fixture, ), patch( "pyevilgenius.EvilGeniusDevice.get_info", return_value=info_fixture, + ), patch( + "pyevilgenius.EvilGeniusDevice.get_product", + return_value=product_fixture, ), patch( "homeassistant.components.evil_genius_labs.PLATFORMS", platforms ): diff --git a/tests/components/evil_genius_labs/test_config_flow.py b/tests/components/evil_genius_labs/test_config_flow.py index 6a5d4ea816a..e3354f4b9cc 100644 --- a/tests/components/evil_genius_labs/test_config_flow.py +++ b/tests/components/evil_genius_labs/test_config_flow.py @@ -10,7 +10,9 @@ from homeassistant.core import HomeAssistant from homeassistant.data_entry_flow import RESULT_TYPE_CREATE_ENTRY, RESULT_TYPE_FORM -async def test_form(hass: HomeAssistant, data_fixture, info_fixture) -> None: +async def test_form( + hass: HomeAssistant, all_fixture, info_fixture, product_fixture +) -> None: """Test we get the form.""" result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": config_entries.SOURCE_USER} @@ -19,11 +21,14 @@ async def test_form(hass: HomeAssistant, data_fixture, info_fixture) -> None: assert result["errors"] is None with patch( - "pyevilgenius.EvilGeniusDevice.get_data", - return_value=data_fixture, + "pyevilgenius.EvilGeniusDevice.get_all", + return_value=all_fixture, ), patch( "pyevilgenius.EvilGeniusDevice.get_info", return_value=info_fixture, + ), patch( + "pyevilgenius.EvilGeniusDevice.get_product", + return_value=product_fixture, ), patch( "homeassistant.components.evil_genius_labs.async_setup_entry", return_value=True, @@ -51,7 +56,7 @@ async def test_form_cannot_connect(hass: HomeAssistant, caplog) -> None: ) with patch( - "pyevilgenius.EvilGeniusDevice.get_data", + "pyevilgenius.EvilGeniusDevice.get_all", side_effect=aiohttp.ClientError, ): result2 = await hass.config_entries.flow.async_configure( @@ -73,7 +78,7 @@ async def test_form_timeout(hass: HomeAssistant) -> None: ) with patch( - "pyevilgenius.EvilGeniusDevice.get_data", + "pyevilgenius.EvilGeniusDevice.get_all", side_effect=asyncio.TimeoutError, ): result2 = await hass.config_entries.flow.async_configure( @@ -94,7 +99,7 @@ async def test_form_unknown(hass: HomeAssistant) -> None: ) with patch( - "pyevilgenius.EvilGeniusDevice.get_data", + "pyevilgenius.EvilGeniusDevice.get_all", side_effect=ValueError("BOOM"), ): result2 = await hass.config_entries.flow.async_configure( diff --git a/tests/components/evil_genius_labs/test_diagnostics.py b/tests/components/evil_genius_labs/test_diagnostics.py index 35026bf37e3..2d873e9c447 100644 --- a/tests/components/evil_genius_labs/test_diagnostics.py +++ b/tests/components/evil_genius_labs/test_diagnostics.py @@ -8,7 +8,7 @@ from tests.components.diagnostics import get_diagnostics_for_config_entry @pytest.mark.parametrize("platforms", [[]]) async def test_entry_diagnostics( - hass, hass_client, setup_evil_genius_labs, config_entry, data_fixture, info_fixture + hass, hass_client, setup_evil_genius_labs, config_entry, all_fixture, info_fixture ): """Test config entry diagnostics.""" assert await get_diagnostics_for_config_entry(hass, hass_client, config_entry) == { @@ -17,5 +17,5 @@ async def test_entry_diagnostics( "wiFiSsidDefault": REDACTED, "wiFiSSID": REDACTED, }, - "data": data_fixture, + "all": all_fixture, }