diff --git a/homeassistant/components/backblaze_b2/__init__.py b/homeassistant/components/backblaze_b2/__init__.py index 3a8d53f5b2a5..a2767d2f0afa 100644 --- a/homeassistant/components/backblaze_b2/__init__.py +++ b/homeassistant/components/backblaze_b2/__init__.py @@ -74,6 +74,12 @@ async def async_setup_entry(hass: HomeAssistant, entry: BackblazeConfigEntry) -> translation_domain=DOMAIN, translation_key="invalid_bucket_name", ) from err + except exception.BadRequest as err: + raise ConfigEntryNotReady( + translation_domain=DOMAIN, + translation_key="bad_request", + translation_placeholders={"error_message": str(err)}, + ) from err except ( exception.B2ConnectionError, exception.B2RequestTimeout, diff --git a/homeassistant/components/backblaze_b2/config_flow.py b/homeassistant/components/backblaze_b2/config_flow.py index 45acf01c8749..fc718505bd18 100644 --- a/homeassistant/components/backblaze_b2/config_flow.py +++ b/homeassistant/components/backblaze_b2/config_flow.py @@ -174,6 +174,14 @@ class BackblazeConfigFlow(ConfigFlow, domain=DOMAIN): "Backblaze B2 bucket '%s' does not exist", user_input[CONF_BUCKET] ) errors[CONF_BUCKET] = "invalid_bucket_name" + except exception.BadRequest as err: + _LOGGER.error( + "Backblaze B2 API rejected the request for Key ID '%s': %s", + user_input[CONF_KEY_ID], + err, + ) + errors["base"] = "bad_request" + placeholders["error_message"] = str(err) except ( exception.B2ConnectionError, exception.B2RequestTimeout, diff --git a/homeassistant/components/backblaze_b2/strings.json b/homeassistant/components/backblaze_b2/strings.json index 15bc4a998d2a..ce8944a7375e 100644 --- a/homeassistant/components/backblaze_b2/strings.json +++ b/homeassistant/components/backblaze_b2/strings.json @@ -6,6 +6,7 @@ "reconfigure_successful": "[%key:common::config_flow::abort::reconfigure_successful%]" }, "error": { + "bad_request": "The Backblaze B2 API rejected the request: {error_message}", "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]", "invalid_bucket_name": "[%key:component::backblaze_b2::exceptions::invalid_bucket_name::message%]", "invalid_capability": "[%key:component::backblaze_b2::exceptions::invalid_capability::message%]", @@ -60,6 +61,9 @@ } }, "exceptions": { + "bad_request": { + "message": "The Backblaze B2 API rejected the request: {error_message}" + }, "cannot_connect": { "message": "Cannot connect to endpoint" }, diff --git a/tests/components/backblaze_b2/test_config_flow.py b/tests/components/backblaze_b2/test_config_flow.py index 2699576a6e2b..86841deb6a1f 100644 --- a/tests/components/backblaze_b2/test_config_flow.py +++ b/tests/components/backblaze_b2/test_config_flow.py @@ -177,6 +177,16 @@ async def test_already_configured( "cannot_connect", "base", ), + ( + "bad_request", + { + "patch": "b2sdk.v2.RawSimulator.authorize_account", + "exception": exception.BadRequest, + "args": ["test", "bad_request"], + }, + "bad_request", + "base", + ), ( "unknown_error", { @@ -252,6 +262,11 @@ async def test_config_flow_errors( "brand_name": "Backblaze B2", "allowed_prefix": "test/", } + elif error_type == "bad_request": + assert result.get("description_placeholders") == { + "brand_name": "Backblaze B2", + "error_message": "test (bad_request)", + } @pytest.mark.parametrize( diff --git a/tests/components/backblaze_b2/test_init.py b/tests/components/backblaze_b2/test_init.py index 533364381475..2a15e0bd5c4c 100644 --- a/tests/components/backblaze_b2/test_init.py +++ b/tests/components/backblaze_b2/test_init.py @@ -57,6 +57,7 @@ async def test_setup_entry_invalid_auth( (exception.RestrictedBucket("testBucket"), ConfigEntryState.SETUP_RETRY), (exception.NonExistentBucket(), ConfigEntryState.SETUP_RETRY), (exception.ConnectionReset(), ConfigEntryState.SETUP_RETRY), + (exception.BadRequest("test", "bad_request"), ConfigEntryState.SETUP_RETRY), (exception.MissingAccountData("key"), ConfigEntryState.SETUP_ERROR), ], )