Allow ignored Bluetooth adapters to be set up from the user flow (#137373)

This commit is contained in:
J. Nick Koston 2025-02-04 17:11:05 -06:00 committed by GitHub
parent 1e99b87868
commit 6b32587d10
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 19 additions and 11 deletions

View File

@ -140,7 +140,7 @@ class BluetoothConfigFlow(ConfigFlow, domain=DOMAIN):
title=adapter_title(adapter, details), data={} title=adapter_title(adapter, details), data={}
) )
configured_addresses = self._async_current_ids() configured_addresses = self._async_current_ids(include_ignore=False)
bluetooth_adapters = get_adapters() bluetooth_adapters = get_adapters()
await bluetooth_adapters.refresh() await bluetooth_adapters.refresh()
self._adapters = bluetooth_adapters.adapters self._adapters = bluetooth_adapters.adapters
@ -155,12 +155,8 @@ class BluetoothConfigFlow(ConfigFlow, domain=DOMAIN):
and not (system == "Linux" and details[ADAPTER_ADDRESS] == DEFAULT_ADDRESS) and not (system == "Linux" and details[ADAPTER_ADDRESS] == DEFAULT_ADDRESS)
] ]
if not unconfigured_adapters: if not unconfigured_adapters:
ignored_adapters = len(
self._async_current_entries(include_ignore=True)
) - len(self._async_current_entries(include_ignore=False))
return self.async_abort( return self.async_abort(
reason="no_adapters", reason="no_adapters",
description_placeholders={"ignored_adapters": str(ignored_adapters)},
) )
if len(unconfigured_adapters) == 1: if len(unconfigured_adapters) == 1:
self._adapter = list(self._adapters)[0] self._adapter = list(self._adapters)[0]

View File

@ -23,7 +23,7 @@
}, },
"abort": { "abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_service%]", "already_configured": "[%key:common::config_flow::abort::already_configured_service%]",
"no_adapters": "No unconfigured Bluetooth adapters found. There are {ignored_adapters} ignored adapters." "no_adapters": "No unconfigured Bluetooth adapters found."
} }
}, },
"options": { "options": {

View File

@ -517,8 +517,10 @@ async def test_options_flow_local_no_passive_support(hass: HomeAssistant) -> Non
@pytest.mark.usefixtures("one_adapter") @pytest.mark.usefixtures("one_adapter")
async def test_async_step_user_linux_adapter_is_ignored(hass: HomeAssistant) -> None: async def test_async_step_user_linux_adapter_replace_ignored(
"""Test we give a hint that the adapter is ignored.""" hass: HomeAssistant,
) -> None:
"""Test we can replace an ignored adapter from user flow."""
entry = MockConfigEntry( entry = MockConfigEntry(
domain=DOMAIN, domain=DOMAIN,
unique_id="00:00:00:00:00:01", unique_id="00:00:00:00:00:01",
@ -530,9 +532,19 @@ async def test_async_step_user_linux_adapter_is_ignored(hass: HomeAssistant) ->
context={"source": config_entries.SOURCE_USER}, context={"source": config_entries.SOURCE_USER},
data={}, data={},
) )
assert result["type"] is FlowResultType.ABORT with (
assert result["reason"] == "no_adapters" patch("homeassistant.components.bluetooth.async_setup", return_value=True),
assert result["description_placeholders"] == {"ignored_adapters": "1"} patch(
"homeassistant.components.bluetooth.async_setup_entry", return_value=True
) as mock_setup_entry,
):
result2 = await hass.config_entries.flow.async_configure(
result["flow_id"], user_input={}
)
assert result2["type"] is FlowResultType.CREATE_ENTRY
assert result2["title"] == "ACME Bluetooth Adapter 5.0 (00:00:00:00:00:01)"
assert result2["data"] == {}
assert len(mock_setup_entry.mock_calls) == 1
@pytest.mark.usefixtures("enable_bluetooth") @pytest.mark.usefixtures("enable_bluetooth")