Allow cancelling async_at_start helper (#71196)

This commit is contained in:
Erik Montnemery 2022-05-02 16:41:14 +02:00 committed by GitHub
parent 1e18307a66
commit f35e7d1129
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 69 additions and 7 deletions

View file

@ -20,8 +20,19 @@ def async_at_start(
hass.async_run_hass_job(at_start_job, hass)
return lambda: None
async def _matched_event(event: Event) -> None:
unsub: None | CALLBACK_TYPE = None
@callback
def _matched_event(event: Event) -> None:
"""Call the callback when Home Assistant started."""
hass.async_run_hass_job(at_start_job, hass)
nonlocal unsub
unsub = None
return hass.bus.async_listen_once(EVENT_HOMEASSISTANT_START, _matched_event)
@callback
def cancel() -> None:
if unsub:
unsub()
unsub = hass.bus.async_listen_once(EVENT_HOMEASSISTANT_START, _matched_event)
return cancel

View file

@ -27,7 +27,7 @@ async def test_at_start_when_running_awaitable(hass):
assert len(calls) == 2
async def test_at_start_when_running_callback(hass):
async def test_at_start_when_running_callback(hass, caplog):
"""Test at start when already running."""
assert hass.state == core.CoreState.running
assert hass.is_running
@ -39,15 +39,19 @@ async def test_at_start_when_running_callback(hass):
"""Home Assistant is started."""
calls.append(1)
start.async_at_start(hass, cb_at_start)
start.async_at_start(hass, cb_at_start)()
assert len(calls) == 1
hass.state = core.CoreState.starting
assert hass.is_running
start.async_at_start(hass, cb_at_start)
start.async_at_start(hass, cb_at_start)()
assert len(calls) == 2
# Check the unnecessary cancel did not generate warnings or errors
for record in caplog.records:
assert record.levelname in ("DEBUG", "INFO")
async def test_at_start_when_starting_awaitable(hass):
"""Test at start when yet to start."""
@ -69,7 +73,7 @@ async def test_at_start_when_starting_awaitable(hass):
assert len(calls) == 1
async def test_at_start_when_starting_callback(hass):
async def test_at_start_when_starting_callback(hass, caplog):
"""Test at start when yet to start."""
hass.state = core.CoreState.not_running
assert not hass.is_running
@ -81,10 +85,57 @@ async def test_at_start_when_starting_callback(hass):
"""Home Assistant is started."""
calls.append(1)
start.async_at_start(hass, cb_at_start)
cancel = start.async_at_start(hass, cb_at_start)
await hass.async_block_till_done()
assert len(calls) == 0
hass.bus.async_fire(EVENT_HOMEASSISTANT_START)
await hass.async_block_till_done()
assert len(calls) == 1
cancel()
# Check the unnecessary cancel did not generate warnings or errors
for record in caplog.records:
assert record.levelname in ("DEBUG", "INFO")
async def test_cancelling_when_running(hass, caplog):
"""Test cancelling at start when already running."""
assert hass.state == core.CoreState.running
assert hass.is_running
calls = []
async def cb_at_start(hass):
"""Home Assistant is started."""
calls.append(1)
start.async_at_start(hass, cb_at_start)()
await hass.async_block_till_done()
assert len(calls) == 1
# Check the unnecessary cancel did not generate warnings or errors
for record in caplog.records:
assert record.levelname in ("DEBUG", "INFO")
async def test_cancelling_when_starting(hass):
"""Test cancelling at start when yet to start."""
hass.state = core.CoreState.not_running
assert not hass.is_running
calls = []
@core.callback
def cb_at_start(hass):
"""Home Assistant is started."""
calls.append(1)
start.async_at_start(hass, cb_at_start)()
await hass.async_block_till_done()
assert len(calls) == 0
hass.bus.async_fire(EVENT_HOMEASSISTANT_START)
await hass.async_block_till_done()
assert len(calls) == 0