Skip to content

Commit 2c2ac4b

Browse files
karwostsjoostlek
andauthored
Throw an error from reload_themes if themes are invalid (home-assistant#148827)
Co-authored-by: Joost Lekkerkerker <[email protected]>
1 parent 3509760 commit 2c2ac4b

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

homeassistant/components/frontend/__init__.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
EVENT_THEMES_UPDATED,
2727
)
2828
from homeassistant.core import HomeAssistant, ServiceCall, callback
29+
from homeassistant.exceptions import HomeAssistantError
2930
from homeassistant.helpers import config_validation as cv, service
3031
from homeassistant.helpers.icon import async_get_icons
3132
from homeassistant.helpers.json import json_dumps_sorted
@@ -543,6 +544,12 @@ async def reload_themes(_: ServiceCall) -> None:
543544
"""Reload themes."""
544545
config = await async_hass_config_yaml(hass)
545546
new_themes = config.get(DOMAIN, {}).get(CONF_THEMES, {})
547+
548+
try:
549+
THEME_SCHEMA(new_themes)
550+
except vol.Invalid as err:
551+
raise HomeAssistantError(f"Failed to reload themes: {err}") from err
552+
546553
hass.data[DATA_THEMES] = new_themes
547554
if hass.data[DATA_DEFAULT_THEME] not in new_themes:
548555
hass.data[DATA_DEFAULT_THEME] = DEFAULT_THEME

tests/components/frontend/test_init.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
)
2727
from homeassistant.components.websocket_api import TYPE_RESULT
2828
from homeassistant.core import HomeAssistant
29+
from homeassistant.exceptions import HomeAssistantError
2930
from homeassistant.loader import async_get_integration
3031
from homeassistant.setup import async_setup_component
3132

@@ -408,6 +409,35 @@ async def test_themes_reload_themes(
408409
assert msg["result"]["default_theme"] == "default"
409410

410411

412+
@pytest.mark.usefixtures("frontend")
413+
async def test_themes_reload_invalid(
414+
hass: HomeAssistant, themes_ws_client: MockHAClientWebSocket
415+
) -> None:
416+
"""Test frontend.reload_themes service with an invalid theme."""
417+
418+
with patch(
419+
"homeassistant.components.frontend.async_hass_config_yaml",
420+
return_value={DOMAIN: {CONF_THEMES: {"happy": {"primary-color": "pink"}}}},
421+
):
422+
await hass.services.async_call(DOMAIN, "reload_themes", blocking=True)
423+
424+
with (
425+
patch(
426+
"homeassistant.components.frontend.async_hass_config_yaml",
427+
return_value={DOMAIN: {CONF_THEMES: {"sad": "blue"}}},
428+
),
429+
pytest.raises(HomeAssistantError, match="Failed to reload themes"),
430+
):
431+
await hass.services.async_call(DOMAIN, "reload_themes", blocking=True)
432+
433+
await themes_ws_client.send_json({"id": 5, "type": "frontend/get_themes"})
434+
435+
msg = await themes_ws_client.receive_json()
436+
437+
assert msg["result"]["themes"] == {"happy": {"primary-color": "pink"}}
438+
assert msg["result"]["default_theme"] == "default"
439+
440+
411441
async def test_missing_themes(ws_client: MockHAClientWebSocket) -> None:
412442
"""Test that themes API works when themes are not defined."""
413443
await ws_client.send_json({"id": 5, "type": "frontend/get_themes"})

0 commit comments

Comments
 (0)