Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions homeassistant/components/hassio/discovery.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from aiohttp import web
from aiohttp.web_exceptions import HTTPServiceUnavailable

from homeassistant.core import callback
from homeassistant.core import callback, CoreState
from homeassistant.const import EVENT_HOMEASSISTANT_START
from homeassistant.components.http import HomeAssistantView

Expand Down Expand Up @@ -40,8 +40,11 @@ async def async_discovery_start_handler(event):
if jobs:
await asyncio.wait(jobs)

hass.bus.async_listen_once(
EVENT_HOMEASSISTANT_START, async_discovery_start_handler)
if hass.state == CoreState.running:
hass.async_create_task(async_discovery_start_handler(None))
else:
hass.bus.async_listen_once(
EVENT_HOMEASSISTANT_START, async_discovery_start_handler)

hass.http.register_view(hassio_discovery)

Expand Down
2 changes: 2 additions & 0 deletions tests/components/hassio/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import pytest

from homeassistant.core import CoreState
from homeassistant.setup import async_setup_component
from homeassistant.components.hassio.handler import HassIO, HassioAPIError

Expand Down Expand Up @@ -33,6 +34,7 @@ def hassio_client(hassio_env, hass, aiohttp_client):
patch('homeassistant.components.hassio.HassIO.'
'get_homeassistant_info',
Mock(side_effect=HassioAPIError())):
hass.state = CoreState.starting
hass.loop.run_until_complete(async_setup_component(hass, 'hassio', {
'http': {
'api_password': API_PASSWORD
Expand Down
53 changes: 53 additions & 0 deletions tests/components/hassio/test_discovery.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
"""Test config flow."""
from unittest.mock import patch, Mock

from homeassistant.setup import async_setup_component
from homeassistant.components.hassio.handler import HassioAPIError
from homeassistant.const import EVENT_HOMEASSISTANT_START, HTTP_HEADER_HA_AUTH

from tests.common import mock_coro
Expand Down Expand Up @@ -29,6 +31,8 @@ async def test_hassio_discovery_startup(hass, aioclient_mock, hassio_client):
'result': 'ok', 'data': {'name': "Mosquitto Test"}
})

assert aioclient_mock.call_count == 0

with patch('homeassistant.components.mqtt.'
'config_flow.FlowHandler.async_step_hassio',
Mock(return_value=mock_coro({"type": "abort"}))) as mock_mqtt:
Expand All @@ -44,6 +48,55 @@ async def test_hassio_discovery_startup(hass, aioclient_mock, hassio_client):
})


async def test_hassio_discovery_startup_done(hass, aioclient_mock,
hassio_client):
"""Test startup and discovery with hass discovery."""
aioclient_mock.get(
"http://127.0.0.1/discovery", json={
'result': 'ok', 'data': {'discovery': [
{
"service": "mqtt", "uuid": "test",
"addon": "mosquitto", "config":
{
'broker': 'mock-broker',
'port': 1883,
'username': 'mock-user',
'password': 'mock-pass',
'protocol': '3.1.1'
}
}
]}})
aioclient_mock.get(
"http://127.0.0.1/addons/mosquitto/info", json={
'result': 'ok', 'data': {'name': "Mosquitto Test"}
})

with patch('homeassistant.components.hassio.HassIO.update_hass_api',
Mock(return_value=mock_coro({"result": "ok"}))), \
patch('homeassistant.components.hassio.HassIO.'
'get_homeassistant_info',
Mock(side_effect=HassioAPIError())), \
patch('homeassistant.components.mqtt.'
'config_flow.FlowHandler.async_step_hassio',
Mock(return_value=mock_coro({"type": "abort"}))
) as mock_mqtt:
await hass.async_start()
await async_setup_component(hass, 'hassio', {
'http': {
'api_password': API_PASSWORD
}
})
await hass.async_block_till_done()

assert aioclient_mock.call_count == 2
assert mock_mqtt.called
mock_mqtt.assert_called_with({
'broker': 'mock-broker', 'port': 1883, 'username': 'mock-user',
'password': 'mock-pass', 'protocol': '3.1.1',
'addon': 'Mosquitto Test',
})


async def test_hassio_discovery_webhook(hass, aioclient_mock, hassio_client):
"""Test discovery webhook."""
aioclient_mock.get(
Expand Down