Fix PVOutput when no data is available (#66338)

This commit is contained in:
Franck Nijhof 2022-02-11 19:11:06 +01:00 committed by GitHub
parent df994a1e84
commit 8ff987d90c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 30 additions and 22 deletions

View File

@ -23,7 +23,7 @@ async def validate_input(hass: HomeAssistant, *, api_key: str, system_id: int) -
api_key=api_key,
system_id=system_id,
)
await pvoutput.status()
await pvoutput.system()
class PVOutputFlowHandler(ConfigFlow, domain=DOMAIN):

View File

@ -1,14 +1,14 @@
"""DataUpdateCoordinator for the PVOutput integration."""
from __future__ import annotations
from pvo import PVOutput, PVOutputAuthenticationError, Status
from pvo import PVOutput, PVOutputAuthenticationError, PVOutputNoDataError, Status
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_API_KEY
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryAuthFailed
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from .const import CONF_SYSTEM_ID, DOMAIN, LOGGER, SCAN_INTERVAL
@ -33,5 +33,7 @@ class PVOutputDataUpdateCoordinator(DataUpdateCoordinator[Status]):
"""Fetch system status from PVOutput."""
try:
return await self.pvoutput.status()
except PVOutputNoDataError as err:
raise UpdateFailed("PVOutput has no data available") from err
except PVOutputAuthenticationError as err:
raise ConfigEntryAuthFailed from err

View File

@ -4,7 +4,7 @@
"documentation": "https://www.home-assistant.io/integrations/pvoutput",
"config_flow": true,
"codeowners": ["@fabaff", "@frenck"],
"requirements": ["pvo==0.2.1"],
"requirements": ["pvo==0.2.2"],
"iot_class": "cloud_polling",
"quality_scale": "platinum"
}

View File

@ -1313,7 +1313,7 @@ pushbullet.py==0.11.0
pushover_complete==1.1.1
# homeassistant.components.pvoutput
pvo==0.2.1
pvo==0.2.2
# homeassistant.components.rpi_gpio_pwm
pwmled==1.6.9

View File

@ -820,7 +820,7 @@ pure-python-adb[async]==0.3.0.dev0
pushbullet.py==0.11.0
# homeassistant.components.pvoutput
pvo==0.2.1
pvo==0.2.2
# homeassistant.components.canary
py-canary==0.5.1

View File

@ -47,7 +47,7 @@ async def test_full_user_flow(
}
assert len(mock_setup_entry.mock_calls) == 1
assert len(mock_pvoutput_config_flow.status.mock_calls) == 1
assert len(mock_pvoutput_config_flow.system.mock_calls) == 1
async def test_full_flow_with_authentication_error(
@ -68,7 +68,7 @@ async def test_full_flow_with_authentication_error(
assert result.get("step_id") == SOURCE_USER
assert "flow_id" in result
mock_pvoutput_config_flow.status.side_effect = PVOutputAuthenticationError
mock_pvoutput_config_flow.system.side_effect = PVOutputAuthenticationError
result2 = await hass.config_entries.flow.async_configure(
result["flow_id"],
user_input={
@ -83,9 +83,9 @@ async def test_full_flow_with_authentication_error(
assert "flow_id" in result2
assert len(mock_setup_entry.mock_calls) == 0
assert len(mock_pvoutput_config_flow.status.mock_calls) == 1
assert len(mock_pvoutput_config_flow.system.mock_calls) == 1
mock_pvoutput_config_flow.status.side_effect = None
mock_pvoutput_config_flow.system.side_effect = None
result3 = await hass.config_entries.flow.async_configure(
result2["flow_id"],
user_input={
@ -102,14 +102,14 @@ async def test_full_flow_with_authentication_error(
}
assert len(mock_setup_entry.mock_calls) == 1
assert len(mock_pvoutput_config_flow.status.mock_calls) == 2
assert len(mock_pvoutput_config_flow.system.mock_calls) == 2
async def test_connection_error(
hass: HomeAssistant, mock_pvoutput_config_flow: MagicMock
) -> None:
"""Test API connection error."""
mock_pvoutput_config_flow.status.side_effect = PVOutputConnectionError
mock_pvoutput_config_flow.system.side_effect = PVOutputConnectionError
result = await hass.config_entries.flow.async_init(
DOMAIN,
@ -123,7 +123,7 @@ async def test_connection_error(
assert result.get("type") == RESULT_TYPE_FORM
assert result.get("errors") == {"base": "cannot_connect"}
assert len(mock_pvoutput_config_flow.status.mock_calls) == 1
assert len(mock_pvoutput_config_flow.system.mock_calls) == 1
async def test_already_configured(
@ -175,7 +175,7 @@ async def test_import_flow(
}
assert len(mock_setup_entry.mock_calls) == 1
assert len(mock_pvoutput_config_flow.status.mock_calls) == 1
assert len(mock_pvoutput_config_flow.system.mock_calls) == 1
async def test_reauth_flow(
@ -214,7 +214,7 @@ async def test_reauth_flow(
}
assert len(mock_setup_entry.mock_calls) == 1
assert len(mock_pvoutput_config_flow.status.mock_calls) == 1
assert len(mock_pvoutput_config_flow.system.mock_calls) == 1
async def test_reauth_with_authentication_error(
@ -243,7 +243,7 @@ async def test_reauth_with_authentication_error(
assert result.get("step_id") == "reauth_confirm"
assert "flow_id" in result
mock_pvoutput_config_flow.status.side_effect = PVOutputAuthenticationError
mock_pvoutput_config_flow.system.side_effect = PVOutputAuthenticationError
result2 = await hass.config_entries.flow.async_configure(
result["flow_id"],
{CONF_API_KEY: "invalid_key"},
@ -256,9 +256,9 @@ async def test_reauth_with_authentication_error(
assert "flow_id" in result2
assert len(mock_setup_entry.mock_calls) == 0
assert len(mock_pvoutput_config_flow.status.mock_calls) == 1
assert len(mock_pvoutput_config_flow.system.mock_calls) == 1
mock_pvoutput_config_flow.status.side_effect = None
mock_pvoutput_config_flow.system.side_effect = None
result3 = await hass.config_entries.flow.async_configure(
result2["flow_id"],
user_input={CONF_API_KEY: "valid_key"},
@ -273,7 +273,7 @@ async def test_reauth_with_authentication_error(
}
assert len(mock_setup_entry.mock_calls) == 1
assert len(mock_pvoutput_config_flow.status.mock_calls) == 2
assert len(mock_pvoutput_config_flow.system.mock_calls) == 2
async def test_reauth_api_error(
@ -297,7 +297,7 @@ async def test_reauth_api_error(
assert result.get("step_id") == "reauth_confirm"
assert "flow_id" in result
mock_pvoutput_config_flow.status.side_effect = PVOutputConnectionError
mock_pvoutput_config_flow.system.side_effect = PVOutputConnectionError
result2 = await hass.config_entries.flow.async_configure(
result["flow_id"],
{CONF_API_KEY: "some_new_key"},

View File

@ -1,7 +1,11 @@
"""Tests for the PVOutput integration."""
from unittest.mock import MagicMock
from pvo import PVOutputAuthenticationError, PVOutputConnectionError
from pvo import (
PVOutputAuthenticationError,
PVOutputConnectionError,
PVOutputNoDataError,
)
import pytest
from homeassistant.components.pvoutput.const import CONF_SYSTEM_ID, DOMAIN
@ -35,13 +39,15 @@ async def test_load_unload_config_entry(
assert mock_config_entry.state is ConfigEntryState.NOT_LOADED
@pytest.mark.parametrize("side_effect", [PVOutputConnectionError, PVOutputNoDataError])
async def test_config_entry_not_ready(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_pvoutput: MagicMock,
side_effect: Exception,
) -> None:
"""Test the PVOutput configuration entry not ready."""
mock_pvoutput.status.side_effect = PVOutputConnectionError
mock_pvoutput.status.side_effect = side_effect
mock_config_entry.add_to_hass(hass)
await hass.config_entries.async_setup(mock_config_entry.entry_id)