Store Hue bridge in hass.data before setting up platforms (#50703)

* Store bridge in hass.data before setting up platforms

* Self
This commit is contained in:
Paulus Schoutsen 2021-05-20 00:08:23 -07:00 committed by GitHub
parent 7350942e9e
commit 2976bbbbdd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 43 additions and 8 deletions

View file

@ -66,7 +66,6 @@ async def async_setup_entry(
_register_services(hass)
hass.data.setdefault(DOMAIN, {})[entry.entry_id] = bridge
config = bridge.api.config
# For backwards compat
@ -133,11 +132,11 @@ async def async_setup_entry(
async def async_unload_entry(hass, entry):
"""Unload a config entry."""
bridge = hass.data[DOMAIN].pop(entry.entry_id)
unload_success = await hass.data[DOMAIN][entry.entry_id].async_reset()
if len(hass.data[DOMAIN]) == 0:
hass.data.pop(DOMAIN)
hass.services.async_remove(DOMAIN, SERVICE_HUE_SCENE)
return await bridge.async_reset()
return unload_success
@core.callback
@ -172,7 +171,7 @@ def _register_services(hass):
group_name,
)
if DOMAIN not in hass.data:
if not hass.services.has_service(DOMAIN, SERVICE_HUE_SCENE):
# Register a local handler for scene activation
hass.services.async_register(
DOMAIN,

View file

@ -23,6 +23,7 @@ from .const import (
CONF_ALLOW_UNREACHABLE,
DEFAULT_ALLOW_HUE_GROUPS,
DEFAULT_ALLOW_UNREACHABLE,
DOMAIN,
LOGGER,
)
from .errors import AuthenticationRequired, CannotConnect
@ -107,6 +108,7 @@ class HueBridge:
if bridge.sensors is not None:
self.sensor_manager = SensorManager(self)
hass.data.setdefault(DOMAIN, {})[self.config_entry.entry_id] = self
hass.config_entries.async_setup_platforms(self.config_entry, PLATFORMS)
self.parallel_updates_semaphore = asyncio.Semaphore(
@ -173,10 +175,15 @@ class HueBridge:
# If setup was successful, we set api variable, forwarded entry and
# register service
return await self.hass.config_entries.async_unload_platforms(
unload_success = await self.hass.config_entries.async_unload_platforms(
self.config_entry, PLATFORMS
)
if unload_success:
self.hass.data[DOMAIN].pop(self.config_entry.entry_id)
return unload_success
async def hue_activate_scene(self, data, skip_reload=False, hide_warnings=False):
"""Service to call directly into bridge to set scenes."""
if self.api.scenes is None:

View file

@ -32,6 +32,7 @@ def create_mock_bridge(hass):
allow_unreachable=False,
allow_groups=False,
api=create_mock_api(hass),
config_entry=None,
reset_jobs=[],
spec=hue.HueBridge,
)
@ -41,10 +42,25 @@ def create_mock_bridge(hass):
bridge.mock_group_responses = bridge.api.mock_group_responses
bridge.mock_sensor_responses = bridge.api.mock_sensor_responses
async def async_setup():
if bridge.config_entry:
hass.data.setdefault(hue.DOMAIN, {})[bridge.config_entry.entry_id] = bridge
return True
bridge.async_setup = async_setup
async def async_request_call(task):
await task()
bridge.async_request_call = async_request_call
async def async_reset():
if bridge.config_entry:
hass.data[hue.DOMAIN].pop(bridge.config_entry.entry_id)
return True
bridge.async_reset = async_reset
return bridge
@ -80,7 +96,15 @@ def create_mock_api(hass):
logger = logging.getLogger(__name__)
api.config.apiversion = "9.9.9"
api.config = Mock(
bridgeid="ff:ff:ff:ff:ff:ff",
mac="aa:bb:cc:dd:ee:ff",
modelid="BSB002",
apiversion="9.9.9",
swversion="1935144040",
)
api.config.name = "Home"
api.lights = Lights(logger, {}, [], mock_request)
api.groups = Groups(logger, {}, [], mock_request)
api.sensors = Sensors(logger, {}, [], mock_request)

View file

@ -38,9 +38,14 @@ async def test_unload_entry(hass, mock_bridge_setup):
assert await async_setup_component(hass, hue.DOMAIN, {}) is True
assert len(mock_bridge_setup.mock_calls) == 1
mock_bridge_setup.async_reset = AsyncMock(return_value=True)
hass.data[hue.DOMAIN] = {entry.entry_id: mock_bridge_setup}
async def mock_reset():
hass.data[hue.DOMAIN].pop(entry.entry_id)
return True
mock_bridge_setup.async_reset = mock_reset
assert await hue.async_unload_entry(hass, entry)
assert len(mock_bridge_setup.async_reset.mock_calls) == 1
assert hue.DOMAIN not in hass.data