From 8eb6b7a9628f8dcc3437a06f00a1d7fbd24ce940 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 4 Oct 2026 10:16:29 +0200 Subject: [PATCH] Translate the Radio Browser setup error (#184194) --- .../components/radio_browser/__init__.py | 11 ++++- .../components/radio_browser/strings.json | 3 ++ tests/components/radio_browser/test_init.py | 49 +++++++++++++++++++ 3 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 tests/components/radio_browser/test_init.py diff --git a/homeassistant/components/radio_browser/__init__.py b/homeassistant/components/radio_browser/__init__.py index c1167090fb44..20e65299301f 100644 --- a/homeassistant/components/radio_browser/__init__.py +++ b/homeassistant/components/radio_browser/__init__.py @@ -8,6 +8,8 @@ from homeassistant.core import HomeAssistant from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers.aiohttp_client import async_get_clientsession +from .const import DOMAIN + type RadioBrowserConfigEntry = ConfigEntry[RadioBrowser] @@ -25,12 +27,17 @@ async def async_setup_entry( try: await radios.stats() except RadioBrowserError as err: - raise ConfigEntryNotReady("Could not connect to Radio Browser API") from err + raise ConfigEntryNotReady( + translation_domain=DOMAIN, + translation_key="cannot_connect", + ) from err entry.runtime_data = radios return True -async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: +async def async_unload_entry( + hass: HomeAssistant, entry: RadioBrowserConfigEntry +) -> bool: """Unload a config entry.""" return True diff --git a/homeassistant/components/radio_browser/strings.json b/homeassistant/components/radio_browser/strings.json index bf4cf8c45864..8e5cdf4a4adc 100644 --- a/homeassistant/components/radio_browser/strings.json +++ b/homeassistant/components/radio_browser/strings.json @@ -10,6 +10,9 @@ } }, "exceptions": { + "cannot_connect": { + "message": "Could not connect to Radio Browser" + }, "config_entry_not_ready": { "message": "Radio Browser integration is not ready" }, diff --git a/tests/components/radio_browser/test_init.py b/tests/components/radio_browser/test_init.py new file mode 100644 index 000000000000..de85c6d146c2 --- /dev/null +++ b/tests/components/radio_browser/test_init.py @@ -0,0 +1,49 @@ +"""Tests for the Radio Browser integration setup.""" + +from unittest.mock import patch + +from radios import RadioBrowserConnectionError + +from homeassistant.components.radio_browser.const import DOMAIN +from homeassistant.config_entries import ConfigEntryState +from homeassistant.core import HomeAssistant + +from tests.common import MockConfigEntry + + +async def test_setup_and_unload( + hass: HomeAssistant, mock_config_entry: MockConfigEntry +) -> None: + """Test setting up and unloading the integration.""" + mock_config_entry.add_to_hass(hass) + with patch( + "homeassistant.components.radio_browser.RadioBrowser", + autospec=True, + ): + await hass.config_entries.async_setup(mock_config_entry.entry_id) + await hass.async_block_till_done() + + assert mock_config_entry.state is ConfigEntryState.LOADED + + await hass.config_entries.async_unload(mock_config_entry.entry_id) + await hass.async_block_till_done() + + assert mock_config_entry.state is ConfigEntryState.NOT_LOADED + + +async def test_setup_retry( + hass: HomeAssistant, mock_config_entry: MockConfigEntry +) -> None: + """Test setup is retried, with a translated reason, when the API is down.""" + mock_config_entry.add_to_hass(hass) + with patch( + "homeassistant.components.radio_browser.RadioBrowser", + autospec=True, + ) as mock_browser: + mock_browser.return_value.stats.side_effect = RadioBrowserConnectionError + await hass.config_entries.async_setup(mock_config_entry.entry_id) + await hass.async_block_till_done() + + assert mock_config_entry.state is ConfigEntryState.SETUP_RETRY + assert mock_config_entry.error_reason_translation_domain == DOMAIN + assert mock_config_entry.error_reason_translation_key == "cannot_connect"