core/tests/components/efergy/__init__.py

152 lines
4.4 KiB
Python

"""Tests for Efergy integration."""
from unittest.mock import AsyncMock, patch
from pyefergy import exceptions
from homeassistant.components.efergy.const import DOMAIN
from homeassistant.const import CONF_API_KEY
from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component
from tests.common import MockConfigEntry, load_fixture
from tests.test_util.aiohttp import AiohttpClientMocker
TOKEN = "9p6QGJ7dpZfO3fqPTBk1fyEmjV1cGoLT"
MULTI_SENSOR_TOKEN = "9r6QGF7dpZfO3fqPTBl1fyRmjV1cGoLT"
CONF_DATA = {CONF_API_KEY: TOKEN}
HID = "12345678901234567890123456789012"
BASE_URL = "https://engage.efergy.com/mobile_proxy/"
def create_entry(hass: HomeAssistant, token: str = TOKEN) -> MockConfigEntry:
"""Create Efergy entry in Home Assistant."""
entry = MockConfigEntry(
domain=DOMAIN,
unique_id=HID,
data={CONF_API_KEY: token},
)
entry.add_to_hass(hass)
return entry
async def init_integration(
hass: HomeAssistant,
aioclient_mock: AiohttpClientMocker,
token: str = TOKEN,
error: bool = False,
) -> MockConfigEntry:
"""Set up the Efergy integration in Home Assistant."""
entry = create_entry(hass, token=token)
await mock_responses(hass, aioclient_mock, token=token, error=error)
await hass.config_entries.async_setup(entry.entry_id)
await hass.async_block_till_done()
return entry
async def mock_responses(
hass: HomeAssistant,
aioclient_mock: AiohttpClientMocker,
token: str = TOKEN,
error: bool = False,
):
"""Mock responses from Efergy."""
base_url = "https://engage.efergy.com/mobile_proxy/"
if error:
aioclient_mock.get(
f"{base_url}getInstant?token={token}",
exc=exceptions.ConnectError,
)
return
aioclient_mock.get(
f"{base_url}getStatus?token={token}",
text=load_fixture("efergy/status.json"),
)
aioclient_mock.get(
f"{base_url}getInstant?token={token}",
text=load_fixture("efergy/instant.json"),
)
aioclient_mock.get(
f"{base_url}getEnergy?period=day",
text=load_fixture("efergy/daily_energy.json"),
)
aioclient_mock.get(
f"{base_url}getEnergy?period=week",
text=load_fixture("efergy/weekly_energy.json"),
)
aioclient_mock.get(
f"{base_url}getEnergy?period=month",
text=load_fixture("efergy/monthly_energy.json"),
)
aioclient_mock.get(
f"{base_url}getEnergy?period=year",
text=load_fixture("efergy/yearly_energy.json"),
)
aioclient_mock.get(
f"{base_url}getBudget?token={token}",
text=load_fixture("efergy/budget.json"),
)
aioclient_mock.get(
f"{base_url}getCost?period=day",
text=load_fixture("efergy/daily_cost.json"),
)
aioclient_mock.get(
f"{base_url}getCost?period=week",
text=load_fixture("efergy/weekly_cost.json"),
)
aioclient_mock.get(
f"{base_url}getCost?period=month",
text=load_fixture("efergy/monthly_cost.json"),
)
aioclient_mock.get(
f"{base_url}getCost?period=year",
text=load_fixture("efergy/yearly_cost.json"),
)
if token == TOKEN:
aioclient_mock.get(
f"{base_url}getCurrentValuesSummary?token={token}",
text=load_fixture("efergy/current_values_single.json"),
)
else:
aioclient_mock.get(
f"{base_url}getCurrentValuesSummary?token={token}",
text=load_fixture("efergy/current_values_multi.json"),
)
def _patch_efergy():
mocked_efergy = AsyncMock()
mocked_efergy.info = {}
mocked_efergy.info["hid"] = HID
mocked_efergy.info["mac"] = "AA:BB:CC:DD:EE:FF"
mocked_efergy.info["status"] = "on"
mocked_efergy.info["type"] = "EEEHub"
mocked_efergy.info["version"] = "2.3.7"
return patch(
"homeassistant.components.efergy.config_flow.Efergy",
return_value=mocked_efergy,
)
def _patch_efergy_status():
return patch("homeassistant.components.efergy.config_flow.Efergy.async_status")
async def setup_platform(
hass: HomeAssistant,
aioclient_mock: AiohttpClientMocker,
platform: str,
token: str = TOKEN,
error: bool = False,
):
"""Set up the platform."""
entry = await init_integration(hass, aioclient_mock, token=token, error=error)
with patch("homeassistant.components.efergy.PLATFORMS", [platform]):
assert await async_setup_component(hass, DOMAIN, {})
return entry