Update bleak to 1.0.1 (#147742)

Co-authored-by: J. Nick Koston <nick@koston.org>
This commit is contained in:
Marc Mueller 2025-07-13 01:11:37 +02:00 committed by GitHub
parent 5287f4de81
commit fca6dc264f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
18 changed files with 121 additions and 142 deletions

View File

@ -15,12 +15,12 @@
],
"quality_scale": "internal",
"requirements": [
"bleak==0.22.3",
"bleak-retry-connector==3.9.0",
"bluetooth-adapters==0.21.4",
"bleak==1.0.1",
"bleak-retry-connector==4.0.0",
"bluetooth-adapters==2.0.0",
"bluetooth-auto-recovery==1.5.2",
"bluetooth-data-tools==1.28.2",
"dbus-fast==2.43.0",
"habluetooth==3.49.0"
"habluetooth==4.0.1"
]
}

View File

@ -22,5 +22,5 @@
"integration_type": "device",
"iot_class": "local_polling",
"loggers": ["eq3btsmart"],
"requirements": ["eq3btsmart==2.1.0", "bleak-esphome==2.16.0"]
"requirements": ["eq3btsmart==2.1.0", "bleak-esphome==3.1.0"]
}

View File

@ -19,7 +19,7 @@
"requirements": [
"aioesphomeapi==34.2.0",
"esphome-dashboard-api==1.3.0",
"bleak-esphome==2.16.0"
"bleak-esphome==3.1.0"
],
"zeroconf": ["_esphomelib._tcp.local."]
}

View File

@ -2,14 +2,42 @@
from __future__ import annotations
from microbot import MicroBotApiClient
from collections.abc import Generator
from contextlib import contextmanager
import bleak
from homeassistant.components import bluetooth
from homeassistant.const import CONF_ACCESS_TOKEN, CONF_ADDRESS, Platform
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryNotReady
from .coordinator import MicroBotConfigEntry, MicroBotDataUpdateCoordinator
@contextmanager
def patch_unused_bleak_discover_import() -> Generator[None]:
"""Patch bleak.discover import in microbot. It is unused and was removed in bleak 1.0.0."""
def getattr_bleak(name: str) -> object:
if name == "discover":
return None
raise AttributeError
original_func = bleak.__dict__.get("__getattr__")
bleak.__dict__["__getattr__"] = getattr_bleak
try:
yield
finally:
if original_func is not None:
bleak.__dict__["__getattr__"] = original_func
with patch_unused_bleak_discover_import():
from microbot import MicroBotApiClient
from .coordinator import ( # noqa: E402
MicroBotConfigEntry,
MicroBotDataUpdateCoordinator,
)
PLATFORMS: list[str] = [Platform.SWITCH]

View File

@ -20,9 +20,9 @@ audioop-lts==0.2.1
av==13.1.0
awesomeversion==25.5.0
bcrypt==4.3.0
bleak-retry-connector==3.9.0
bleak==0.22.3
bluetooth-adapters==0.21.4
bleak-retry-connector==4.0.0
bleak==1.0.1
bluetooth-adapters==2.0.0
bluetooth-auto-recovery==1.5.2
bluetooth-data-tools==1.28.2
cached-ipaddress==0.10.0
@ -34,7 +34,7 @@ dbus-fast==2.43.0
fnv-hash-fast==1.5.0
go2rtc-client==0.2.1
ha-ffmpeg==3.2.2
habluetooth==3.49.0
habluetooth==4.0.1
hass-nabucasa==0.106.0
hassil==2.2.3
home-assistant-bluetooth==1.13.1

10
requirements_all.txt generated
View File

@ -616,13 +616,13 @@ bizkaibus==0.1.1
# homeassistant.components.eq3btsmart
# homeassistant.components.esphome
bleak-esphome==2.16.0
bleak-esphome==3.1.0
# homeassistant.components.bluetooth
bleak-retry-connector==3.9.0
bleak-retry-connector==4.0.0
# homeassistant.components.bluetooth
bleak==0.22.3
bleak==1.0.1
# homeassistant.components.blebox
blebox-uniapi==2.5.0
@ -643,7 +643,7 @@ bluemaestro-ble==0.4.1
# bluepy==1.3.0
# homeassistant.components.bluetooth
bluetooth-adapters==0.21.4
bluetooth-adapters==2.0.0
# homeassistant.components.bluetooth
bluetooth-auto-recovery==1.5.2
@ -1124,7 +1124,7 @@ ha-silabs-firmware-client==0.2.0
habiticalib==0.4.0
# homeassistant.components.bluetooth
habluetooth==3.49.0
habluetooth==4.0.1
# homeassistant.components.cloud
hass-nabucasa==0.106.0

View File

@ -550,13 +550,13 @@ bimmer-connected[china]==0.17.2
# homeassistant.components.eq3btsmart
# homeassistant.components.esphome
bleak-esphome==2.16.0
bleak-esphome==3.1.0
# homeassistant.components.bluetooth
bleak-retry-connector==3.9.0
bleak-retry-connector==4.0.0
# homeassistant.components.bluetooth
bleak==0.22.3
bleak==1.0.1
# homeassistant.components.blebox
blebox-uniapi==2.5.0
@ -574,7 +574,7 @@ bluemaestro-ble==0.4.1
# bluepy==1.3.0
# homeassistant.components.bluetooth
bluetooth-adapters==0.21.4
bluetooth-adapters==2.0.0
# homeassistant.components.bluetooth
bluetooth-auto-recovery==1.5.2
@ -985,7 +985,7 @@ ha-silabs-firmware-client==0.2.0
habiticalib==0.4.0
# homeassistant.components.bluetooth
habluetooth==3.49.0
habluetooth==4.0.1
# homeassistant.components.cloud
hass-nabucasa==0.106.0

View File

@ -27,6 +27,7 @@ PACKAGE_CHECK_VERSION_RANGE = {
"aiohttp": "SemVer",
"attrs": "CalVer",
"awesomeversion": "CalVer",
"bleak": "SemVer",
"grpcio": "SemVer",
"httpx": "SemVer",
"mashumaro": "SemVer",
@ -297,10 +298,6 @@ PYTHON_VERSION_CHECK_EXCEPTIONS: dict[str, dict[str, set[str]]] = {
# - domain is the integration domain
# - package is the package (can be transitive) referencing the dependency
# - dependencyX should be the name of the referenced dependency
"bluetooth": {
# https://github.com/hbldh/bleak/pull/1718 (not yet released)
"homeassistant": {"bleak"}
},
"python_script": {
# Security audits are needed for each Python version
"homeassistant": {"restrictedpython"}
@ -501,17 +498,9 @@ def get_requirements(integration: Integration, packages: set[str]) -> set[str]:
continue
# Check for restrictive version limits on Python
if (
(requires_python := metadata(package)["Requires-Python"])
and not all(
_is_dependency_version_range_valid(version_part, "SemVer")
for version_part in requires_python.split(",")
)
# "bleak" is a transient dependency of 53 integrations, and we don't
# want to add the whole list to PYTHON_VERSION_CHECK_EXCEPTIONS
# This extra check can be removed when bleak is updated
# https://github.com/hbldh/bleak/pull/1718
and (package in packages or package != "bleak")
if (requires_python := metadata(package)["Requires-Python"]) and not all(
_is_dependency_version_range_valid(version_part, "SemVer")
for version_part in requires_python.split(",")
):
needs_python_version_check_exception = True
integration.add_warning_or_error(

View File

@ -1,11 +1,11 @@
"""Tests for the Bluetooth integration."""
from collections.abc import Iterable
from collections.abc import Generator, Iterable
from contextlib import contextmanager
import itertools
import time
from typing import Any
from unittest.mock import MagicMock, patch
from unittest.mock import MagicMock, PropertyMock, patch
from bleak import BleakClient
from bleak.backends.scanner import AdvertisementData, BLEDevice
@ -53,7 +53,6 @@ ADVERTISEMENT_DATA_DEFAULTS = {
BLE_DEVICE_DEFAULTS = {
"name": None,
"rssi": -127,
"details": None,
}
@ -89,7 +88,6 @@ def generate_ble_device(
address: str | None = None,
name: str | None = None,
details: Any | None = None,
rssi: int | None = None,
**kwargs: Any,
) -> BLEDevice:
"""Generate a BLEDevice with defaults."""
@ -100,8 +98,6 @@ def generate_ble_device(
new["name"] = name
if details is not None:
new["details"] = details
if rssi is not None:
new["rssi"] = rssi
for key, value in BLE_DEVICE_DEFAULTS.items():
new.setdefault(key, value)
return BLEDevice(**new)
@ -215,34 +211,35 @@ def inject_bluetooth_service_info(
@contextmanager
def patch_all_discovered_devices(mock_discovered: list[BLEDevice]) -> None:
def patch_all_discovered_devices(mock_discovered: list[BLEDevice]) -> Generator[None]:
"""Mock all the discovered devices from all the scanners."""
manager = _get_manager()
original_history = {}
scanners = list(
itertools.chain(
manager._connectable_scanners, manager._non_connectable_scanners
)
)
for scanner in scanners:
data = scanner.discovered_devices_and_advertisement_data
original_history[scanner] = data.copy()
data.clear()
if scanners:
data = scanners[0].discovered_devices_and_advertisement_data
data.clear()
data.update(
{device.address: (device, MagicMock()) for device in mock_discovered}
)
yield
for scanner in scanners:
data = scanner.discovered_devices_and_advertisement_data
data.clear()
data.update(original_history[scanner])
if scanners and getattr(scanners[0], "scanner", None):
with patch.object(
scanners[0].scanner.__class__,
"discovered_devices_and_advertisement_data",
new=PropertyMock(
side_effect=[
{
device.address: (device, MagicMock())
for device in mock_discovered
},
]
+ [{}] * (len(scanners))
),
):
yield
else:
yield
@contextmanager
def patch_discovered_devices(mock_discovered: list[BLEDevice]) -> None:
def patch_discovered_devices(mock_discovered: list[BLEDevice]) -> Generator[None]:
"""Mock the combined best path to discovered devices from all the scanners."""
manager = _get_manager()
original_all_history = manager._all_history
@ -305,6 +302,9 @@ class MockBleakClient(BleakClient):
"""Mock clear_cache."""
return True
def set_disconnected_callback(self, callback, **kwargs):
"""Mock set_disconnected_callback."""
class FakeScannerMixin:
def get_discovered_device_advertisement_data(

View File

@ -82,7 +82,6 @@ async def test_async_scanner_devices_by_address_connectable(
"44:44:33:11:23:45",
"wohand",
{},
rssi=-100,
)
switchbot_device_adv = generate_advertisement_data(
local_name="wohand",
@ -116,7 +115,6 @@ async def test_async_scanner_devices_by_address_non_connectable(
"44:44:33:11:23:45",
"wohand",
{},
rssi=-100,
)
switchbot_device_adv = generate_advertisement_data(
local_name="wohand",

View File

@ -54,7 +54,6 @@ async def test_remote_scanner(hass: HomeAssistant, name_2: str | None) -> None:
"44:44:33:11:23:45",
"wohand",
{},
rssi=-100,
)
switchbot_device_adv = generate_advertisement_data(
local_name="wohand",
@ -67,7 +66,6 @@ async def test_remote_scanner(hass: HomeAssistant, name_2: str | None) -> None:
"44:44:33:11:23:45",
name_2,
{},
rssi=-100,
)
switchbot_device_adv_2 = generate_advertisement_data(
local_name=name_2,
@ -80,7 +78,6 @@ async def test_remote_scanner(hass: HomeAssistant, name_2: str | None) -> None:
"44:44:33:11:23:45",
"wohandlonger",
{},
rssi=-100,
)
switchbot_device_adv_3 = generate_advertisement_data(
local_name="wohandlonger",
@ -146,7 +143,6 @@ async def test_remote_scanner_expires_connectable(hass: HomeAssistant) -> None:
"44:44:33:11:23:45",
"wohand",
{},
rssi=-100,
)
switchbot_device_adv = generate_advertisement_data(
local_name="wohand",
@ -199,7 +195,6 @@ async def test_remote_scanner_expires_non_connectable(hass: HomeAssistant) -> No
"44:44:33:11:23:45",
"wohand",
{},
rssi=-100,
)
switchbot_device_adv = generate_advertisement_data(
local_name="wohand",
@ -272,7 +267,6 @@ async def test_base_scanner_connecting_behavior(hass: HomeAssistant) -> None:
"44:44:33:11:23:45",
"wohand",
{},
rssi=-100,
)
switchbot_device_adv = generate_advertisement_data(
local_name="wohand",
@ -376,7 +370,6 @@ async def test_device_with_ten_minute_advertising_interval(hass: HomeAssistant)
"44:44:33:11:23:45",
"bparasite",
{},
rssi=-100,
)
bparasite_device_adv = generate_advertisement_data(
local_name="bparasite",
@ -501,7 +494,6 @@ async def test_scanner_stops_responding(hass: HomeAssistant) -> None:
"44:44:33:11:23:45",
"bparasite",
{},
rssi=-100,
)
bparasite_device_adv = generate_advertisement_data(
local_name="bparasite",
@ -545,7 +537,6 @@ async def test_remote_scanner_bluetooth_config_entry(
"44:44:33:11:23:45",
"wohand",
{},
rssi=-100,
)
switchbot_device_adv = generate_advertisement_data(
local_name="wohand",

View File

@ -37,7 +37,7 @@ class FakeHaScanner(FakeScannerMixin, HaScanner):
"""Return the discovered devices and advertisement data."""
return {
"44:44:33:11:23:45": (
generate_ble_device(name="x", rssi=-127, address="44:44:33:11:23:45"),
generate_ble_device(name="x", address="44:44:33:11:23:45"),
generate_advertisement_data(local_name="x"),
)
}

View File

@ -78,11 +78,9 @@ async def test_advertisements_do_not_switch_adapters_for_no_reason(
address = "44:44:33:11:23:12"
switchbot_device_signal_100 = generate_ble_device(
address, "wohand_signal_100", rssi=-100
)
switchbot_device_signal_100 = generate_ble_device(address, "wohand_signal_100")
switchbot_adv_signal_100 = generate_advertisement_data(
local_name="wohand_signal_100", service_uuids=[]
local_name="wohand_signal_100", service_uuids=[], rssi=-100
)
inject_advertisement_with_source(
hass, switchbot_device_signal_100, switchbot_adv_signal_100, HCI0_SOURCE_ADDRESS
@ -93,11 +91,9 @@ async def test_advertisements_do_not_switch_adapters_for_no_reason(
is switchbot_device_signal_100
)
switchbot_device_signal_99 = generate_ble_device(
address, "wohand_signal_99", rssi=-99
)
switchbot_device_signal_99 = generate_ble_device(address, "wohand_signal_99")
switchbot_adv_signal_99 = generate_advertisement_data(
local_name="wohand_signal_99", service_uuids=[]
local_name="wohand_signal_99", service_uuids=[], rssi=-99
)
inject_advertisement_with_source(
hass, switchbot_device_signal_99, switchbot_adv_signal_99, HCI0_SOURCE_ADDRESS
@ -108,11 +104,9 @@ async def test_advertisements_do_not_switch_adapters_for_no_reason(
is switchbot_device_signal_99
)
switchbot_device_signal_98 = generate_ble_device(
address, "wohand_good_signal", rssi=-98
)
switchbot_device_signal_98 = generate_ble_device(address, "wohand_good_signal")
switchbot_adv_signal_98 = generate_advertisement_data(
local_name="wohand_good_signal", service_uuids=[]
local_name="wohand_good_signal", service_uuids=[], rssi=-98
)
inject_advertisement_with_source(
hass, switchbot_device_signal_98, switchbot_adv_signal_98, HCI1_SOURCE_ADDRESS
@ -805,13 +799,11 @@ async def test_goes_unavailable_connectable_only_and_recovers(
"44:44:33:11:23:45",
"wohand",
{},
rssi=-100,
)
switchbot_device_non_connectable = generate_ble_device(
"44:44:33:11:23:45",
"wohand",
{},
rssi=-100,
)
switchbot_device_adv = generate_advertisement_data(
local_name="wohand",
@ -978,7 +970,6 @@ async def test_goes_unavailable_dismisses_discovery_and_makes_discoverable(
"44:44:33:11:23:45",
"wohand",
{},
rssi=-100,
)
switchbot_device_adv = generate_advertisement_data(
local_name="wohand",
@ -1394,7 +1385,6 @@ async def test_bluetooth_rediscover(
"44:44:33:11:23:45",
"wohand",
{},
rssi=-100,
)
switchbot_device_adv = generate_advertisement_data(
local_name="wohand",
@ -1571,7 +1561,6 @@ async def test_bluetooth_rediscover_no_match(
"44:44:33:11:23:45",
"wohand",
{},
rssi=-100,
)
switchbot_device_adv = generate_advertisement_data(
local_name="wohand",
@ -1693,11 +1682,9 @@ async def test_async_register_disappeared_callback(
"""Test bluetooth async_register_disappeared_callback handles failures."""
address = "44:44:33:11:23:12"
switchbot_device_signal_100 = generate_ble_device(
address, "wohand_signal_100", rssi=-100
)
switchbot_device_signal_100 = generate_ble_device(address, "wohand_signal_100")
switchbot_adv_signal_100 = generate_advertisement_data(
local_name="wohand_signal_100", service_uuids=[]
local_name="wohand_signal_100", service_uuids=[], rssi=-100
)
inject_advertisement_with_source(
hass, switchbot_device_signal_100, switchbot_adv_signal_100, "hci0"

View File

@ -124,7 +124,7 @@ async def test_wrapped_bleak_client_local_adapter_only(hass: HomeAssistant) -> N
"bleak.backends.bluezdbus.client.BleakClientBlueZDBus.is_connected", True
),
):
assert await client.connect() is True
await client.connect()
assert client.is_connected is True
client.set_disconnected_callback(lambda client: None)
await client.disconnect()
@ -145,7 +145,6 @@ async def test_wrapped_bleak_client_set_disconnected_callback_after_connected(
"source": "esp32_has_connection_slot",
"path": "/org/bluez/hci0/dev_44_44_33_11_23_45",
},
rssi=-40,
)
switchbot_proxy_device_adv_has_connection_slot = generate_advertisement_data(
local_name="wohand",
@ -215,7 +214,7 @@ async def test_wrapped_bleak_client_set_disconnected_callback_after_connected(
"bleak.backends.bluezdbus.client.BleakClientBlueZDBus.is_connected", True
),
):
assert await client.connect() is True
await client.connect()
assert client.is_connected is True
client.set_disconnected_callback(lambda client: None)
await client.disconnect()
@ -236,10 +235,9 @@ async def test_ble_device_with_proxy_client_out_of_connections_no_scanners(
"source": "esp32",
"path": "/org/bluez/hci0/dev_44_44_33_11_23_45",
},
rssi=-30,
)
switchbot_adv = generate_advertisement_data(
local_name="wohand", service_uuids=[], manufacturer_data={1: b"\x01"}
local_name="wohand", service_uuids=[], manufacturer_data={1: b"\x01"}, rssi=-30
)
inject_advertisement_with_source(
@ -275,10 +273,9 @@ async def test_ble_device_with_proxy_client_out_of_connections(
"source": "esp32",
"path": "/org/bluez/hci0/dev_44_44_33_11_23_45",
},
rssi=-30,
)
switchbot_adv = generate_advertisement_data(
local_name="wohand", service_uuids=[], manufacturer_data={1: b"\x01"}
local_name="wohand", service_uuids=[], manufacturer_data={1: b"\x01"}, rssi=-30
)
class FakeScanner(FakeScannerMixin, BaseHaRemoteScanner):
@ -340,10 +337,9 @@ async def test_ble_device_with_proxy_clear_cache(hass: HomeAssistant) -> None:
"source": "esp32",
"path": "/org/bluez/hci0/dev_44_44_33_11_23_45",
},
rssi=-30,
)
switchbot_adv = generate_advertisement_data(
local_name="wohand", service_uuids=[], manufacturer_data={1: b"\x01"}
local_name="wohand", service_uuids=[], manufacturer_data={1: b"\x01"}, rssi=-30
)
class FakeScanner(FakeScannerMixin, BaseHaRemoteScanner):
@ -417,7 +413,6 @@ async def test_ble_device_with_proxy_client_out_of_connections_uses_best_availab
"source": "esp32_has_connection_slot",
"path": "/org/bluez/hci0/dev_44_44_33_11_23_45",
},
rssi=-40,
)
switchbot_proxy_device_adv_has_connection_slot = generate_advertisement_data(
local_name="wohand",
@ -511,7 +506,6 @@ async def test_ble_device_with_proxy_client_out_of_connections_uses_best_availab
"source": "esp32_no_connection_slot",
"path": "/org/bluez/hci0/dev_44_44_33_11_23_45",
},
rssi=-30,
)
switchbot_proxy_device_no_connection_slot_adv = generate_advertisement_data(
local_name="wohand",
@ -538,7 +532,6 @@ async def test_ble_device_with_proxy_client_out_of_connections_uses_best_availab
"44:44:33:11:23:45",
"wohand",
{},
rssi=-100,
)
switchbot_device_adv = generate_advertisement_data(
local_name="wohand",

View File

@ -17,9 +17,7 @@ from . import generate_ble_device
MOCK_BLE_DEVICE = generate_ble_device(
"00:00:00:00:00:00",
"any",
delegate="",
details={"path": "/dev/hci0/device"},
rssi=-127,
)

View File

@ -38,11 +38,9 @@ async def test_subscribe_advertisements(
"""Test bluetooth subscribe_advertisements."""
address = "44:44:33:11:23:12"
switchbot_device_signal_100 = generate_ble_device(
address, "wohand_signal_100", rssi=-100
)
switchbot_device_signal_100 = generate_ble_device(address, "wohand_signal_100")
switchbot_adv_signal_100 = generate_advertisement_data(
local_name="wohand_signal_100", service_uuids=[]
local_name="wohand_signal_100", service_uuids=[], rssi=-100
)
inject_advertisement_with_source(
hass, switchbot_device_signal_100, switchbot_adv_signal_100, HCI0_SOURCE_ADDRESS
@ -68,7 +66,7 @@ async def test_subscribe_advertisements(
"connectable": True,
"manufacturer_data": {},
"name": "wohand_signal_100",
"rssi": -127,
"rssi": -100,
"service_data": {},
"service_uuids": [],
"source": HCI0_SOURCE_ADDRESS,
@ -134,11 +132,9 @@ async def test_subscribe_connection_allocations(
"""Test bluetooth subscribe_connection_allocations."""
address = "44:44:33:11:23:12"
switchbot_device_signal_100 = generate_ble_device(
address, "wohand_signal_100", rssi=-100
)
switchbot_device_signal_100 = generate_ble_device(address, "wohand_signal_100")
switchbot_adv_signal_100 = generate_advertisement_data(
local_name="wohand_signal_100", service_uuids=[]
local_name="wohand_signal_100", service_uuids=[], rssi=-100
)
inject_advertisement_with_source(
hass, switchbot_device_signal_100, switchbot_adv_signal_100, HCI0_SOURCE_ADDRESS

View File

@ -92,17 +92,13 @@ class FakeBleakClient(BaseFakeBleakClient):
async def connect(self, *args, **kwargs):
"""Connect."""
@property
def is_connected(self):
"""Connected."""
return True
class FakeBleakClientFailsToConnect(BaseFakeBleakClient):
"""Fake bleak client that fails to connect."""
async def connect(self, *args, **kwargs):
"""Connect."""
return False
class FakeBleakClientRaisesOnConnect(BaseFakeBleakClient):
"""Fake bleak client that raises on connect."""
@ -110,6 +106,11 @@ class FakeBleakClientRaisesOnConnect(BaseFakeBleakClient):
"""Connect."""
raise ConnectionError("Test exception")
@property
def is_connected(self):
"""Not connected."""
return False
def _generate_ble_device_and_adv_data(
interface: str, mac: str, rssi: int
@ -119,7 +120,6 @@ def _generate_ble_device_and_adv_data(
generate_ble_device(
mac,
"any",
delegate="",
details={"path": f"/org/bluez/{interface}/dev_{mac}"},
),
generate_advertisement_data(rssi=rssi),
@ -144,16 +144,6 @@ def mock_platform_client_fixture():
yield
@pytest.fixture(name="mock_platform_client_that_fails_to_connect")
def mock_platform_client_that_fails_to_connect_fixture():
"""Fixture that mocks the platform client that fails to connect."""
with patch(
"habluetooth.wrappers.get_platform_client_backend_type",
return_value=FakeBleakClientFailsToConnect,
):
yield
@pytest.fixture(name="mock_platform_client_that_raises_on_connect")
def mock_platform_client_that_raises_on_connect_fixture():
"""Fixture that mocks the platform client that fails to connect."""
@ -219,7 +209,8 @@ async def test_test_switch_adapters_when_out_of_slots(
):
ble_device = hci0_device_advs["00:00:00:00:00:01"][0]
client = bleak.BleakClient(ble_device)
assert await client.connect() is True
await client.connect()
assert client.is_connected is True
assert allocate_slot_mock.call_count == 1
assert release_slot_mock.call_count == 0
@ -251,7 +242,8 @@ async def test_test_switch_adapters_when_out_of_slots(
):
ble_device = hci0_device_advs["00:00:00:00:00:03"][0]
client = bleak.BleakClient(ble_device)
assert await client.connect() is True
await client.connect()
assert client.is_connected is True
assert release_slot_mock.call_count == 0
cancel_hci0()
@ -262,7 +254,7 @@ async def test_test_switch_adapters_when_out_of_slots(
async def test_release_slot_on_connect_failure(
hass: HomeAssistant,
install_bleak_catcher,
mock_platform_client_that_fails_to_connect,
mock_platform_client_that_raises_on_connect,
) -> None:
"""Ensure the slot gets released on connection failure."""
manager = _get_manager()
@ -278,7 +270,9 @@ async def test_release_slot_on_connect_failure(
):
ble_device = hci0_device_advs["00:00:00:00:00:01"][0]
client = bleak.BleakClient(ble_device)
assert await client.connect() is False
with pytest.raises(ConnectionError):
await client.connect()
assert client.is_connected is False
assert allocate_slot_mock.call_count == 1
assert release_slot_mock.call_count == 1
@ -335,13 +329,18 @@ async def test_passing_subclassed_str_as_address(
async def connect(self, *args, **kwargs):
"""Connect."""
@property
def is_connected(self):
"""Connected."""
return True
with patch(
"habluetooth.wrappers.get_platform_client_backend_type",
return_value=FakeBleakClient,
):
assert await client.connect() is True
await client.connect()
assert client.is_connected is True
cancel_hci0()
cancel_hci1()

View File

@ -55,4 +55,4 @@ async def test_client_usage_while_not_connected(client_data: ESPHomeClientData)
with pytest.raises(
BleakError, match=f"{ESP_NAME}.*{ESP_MAC_ADDRESS}.*not connected"
):
assert await client.write_gatt_char("test", b"test") is False
assert await client.write_gatt_char("test", b"test", False) is False