Make google calendar fail louder on invalid google_calendars.yaml (#83668)

* Make google calendar fail louder on invalid google_calendars.yaml

* Update homeassistant/components/google/__init__.py

Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>

* Update homeassistant/components/google/__init__.py

Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
This commit is contained in:
Allen Porter 2022-12-10 09:26:28 -08:00 committed by GitHub
parent af1c326cff
commit 1ac7f5f013
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 15 additions and 22 deletions

View File

@ -11,7 +11,6 @@ from gcal_sync.api import GoogleCalendarService
from gcal_sync.exceptions import ApiException, AuthException
from gcal_sync.model import DateOrDatetime, Event
import voluptuous as vol
from voluptuous.error import Error as VoluptuousError
import yaml
from homeassistant.config_entries import ConfigEntry
@ -143,6 +142,14 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
hass.data.setdefault(DOMAIN, {})
hass.data[DOMAIN][entry.entry_id] = {}
# Validate google_calendars.yaml (if present) as soon as possible to return
# helpful error messages.
try:
await hass.async_add_executor_job(load_config, hass.config.path(YAML_DEVICES))
except vol.Invalid as err:
_LOGGER.error("Configuration error in %s: %s", YAML_DEVICES, str(err))
return False
implementation = (
await config_entry_oauth2_flow.async_get_config_entry_implementation(
hass, entry
@ -322,11 +329,7 @@ def load_config(path: str) -> dict[str, Any]:
with open(path, encoding="utf8") as file:
data = yaml.safe_load(file)
for calendar in data:
try:
calendars.update({calendar[CONF_CAL_ID]: DEVICE_SCHEMA(calendar)})
except VoluptuousError as exception:
# keep going
_LOGGER.warning("Calendar Invalid Data: %s", exception)
calendars[calendar[CONF_CAL_ID]] = DEVICE_SCHEMA(calendar)
except FileNotFoundError as err:
_LOGGER.debug("Error reading calendar configuration: %s", err)
# When YAML file could not be loaded/did not contain a dict

View File

@ -152,11 +152,12 @@ async def test_calendar_yaml_missing_required_fields(
component_setup: ComponentSetup,
calendars_config: list[dict[str, Any]],
mock_calendars_yaml: None,
config_entry: MockConfigEntry,
) -> None:
"""Test setup with a missing schema fields, ignores the error and continues."""
assert await component_setup()
assert not await component_setup()
assert not hass.states.get(TEST_YAML_ENTITY)
assert config_entry.state is ConfigEntryState.SETUP_ERROR
@pytest.mark.parametrize("calendars_config", [[{"missing-cal_id": "invalid-schema"}]])
@ -165,23 +166,12 @@ async def test_invalid_calendar_yaml(
component_setup: ComponentSetup,
calendars_config: list[dict[str, Any]],
mock_calendars_yaml: None,
mock_calendars_list: ApiResult,
test_api_calendar: dict[str, Any],
mock_events_list: ApiResult,
config_entry: MockConfigEntry,
) -> None:
"""Test setup with missing entity id fields fails to load the platform."""
mock_calendars_list({"items": [test_api_calendar]})
mock_events_list({})
assert not await component_setup()
assert await component_setup()
entries = hass.config_entries.async_entries(DOMAIN)
assert len(entries) == 1
entry = entries[0]
assert entry.state is ConfigEntryState.LOADED
assert not hass.states.get(TEST_YAML_ENTITY)
assert not hass.states.get(TEST_API_ENTITY)
assert config_entry.state is ConfigEntryState.SETUP_ERROR
async def test_calendar_yaml_error(