Use dataclass for HassioServiceInfo (#60824)

Co-authored-by: epenet <epenet@users.noreply.github.com>
This commit is contained in:
epenet 2021-12-03 14:05:56 +01:00 committed by GitHub
parent e8b4b70747
commit 358922db56
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 131 additions and 150 deletions

View File

@ -6,6 +6,7 @@ from typing import Any
from adguardhome import AdGuardHome, AdGuardHomeConnectionError from adguardhome import AdGuardHome, AdGuardHomeConnectionError
import voluptuous as vol import voluptuous as vol
from homeassistant.components.hassio import HassioServiceInfo
from homeassistant.config_entries import ConfigFlow from homeassistant.config_entries import ConfigFlow
from homeassistant.const import ( from homeassistant.const import (
CONF_HOST, CONF_HOST,
@ -104,14 +105,14 @@ class AdGuardHomeFlowHandler(ConfigFlow, domain=DOMAIN):
}, },
) )
async def async_step_hassio(self, discovery_info: dict[str, Any]) -> FlowResult: async def async_step_hassio(self, discovery_info: HassioServiceInfo) -> FlowResult:
"""Prepare configuration for a Hass.io AdGuard Home add-on. """Prepare configuration for a Hass.io AdGuard Home add-on.
This flow is triggered by the discovery component. This flow is triggered by the discovery component.
""" """
await self._async_handle_discovery_without_unique_id() await self._async_handle_discovery_without_unique_id()
self._hassio_discovery = discovery_info self._hassio_discovery = discovery_info.config
return await self.async_step_hassio_confirm() return await self.async_step_hassio_confirm()
async def async_step_hassio_confirm( async def async_step_hassio_confirm(

View File

@ -12,6 +12,7 @@ import voluptuous as vol
from yarl import URL from yarl import URL
from homeassistant import config_entries, core, data_entry_flow from homeassistant import config_entries, core, data_entry_flow
from homeassistant.components.hassio import HassioServiceInfo
from homeassistant.data_entry_flow import FlowResult from homeassistant.data_entry_flow import FlowResult
from homeassistant.helpers import aiohttp_client, config_entry_oauth2_flow from homeassistant.helpers import aiohttp_client, config_entry_oauth2_flow
@ -94,12 +95,12 @@ class AlmondFlowHandler(config_entry_oauth2_flow.AbstractOAuth2FlowHandler):
data={"type": TYPE_LOCAL, "host": user_input["host"]}, data={"type": TYPE_LOCAL, "host": user_input["host"]},
) )
async def async_step_hassio(self, discovery_info): async def async_step_hassio(self, discovery_info: HassioServiceInfo) -> FlowResult:
"""Receive a Hass.io discovery.""" """Receive a Hass.io discovery."""
if self._async_current_entries(): if self._async_current_entries():
return self.async_abort(reason="single_instance_allowed") return self.async_abort(reason="single_instance_allowed")
self.hassio_discovery = discovery_info self.hassio_discovery = discovery_info.config
return await self.async_step_hassio_confirm() return await self.async_step_hassio_confirm()

View File

@ -20,6 +20,7 @@ import voluptuous as vol
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components import ssdp from homeassistant.components import ssdp
from homeassistant.components.deconz.gateway import DeconzGateway from homeassistant.components.deconz.gateway import DeconzGateway
from homeassistant.components.hassio import HassioServiceInfo
from homeassistant.config_entries import ConfigEntry, ConfigFlow, OptionsFlow from homeassistant.config_entries import ConfigEntry, ConfigFlow, OptionsFlow
from homeassistant.const import CONF_API_KEY, CONF_HOST, CONF_PORT from homeassistant.const import CONF_API_KEY, CONF_HOST, CONF_PORT
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
@ -233,25 +234,25 @@ class DeconzFlowHandler(ConfigFlow, domain=DOMAIN):
return await self.async_step_link() return await self.async_step_link()
async def async_step_hassio(self, discovery_info: dict[str, Any]) -> FlowResult: async def async_step_hassio(self, discovery_info: HassioServiceInfo) -> FlowResult:
"""Prepare configuration for a Hass.io deCONZ bridge. """Prepare configuration for a Hass.io deCONZ bridge.
This flow is triggered by the discovery component. This flow is triggered by the discovery component.
""" """
LOGGER.debug("deCONZ HASSIO discovery %s", pformat(discovery_info)) LOGGER.debug("deCONZ HASSIO discovery %s", pformat(discovery_info.config))
self.bridge_id = normalize_bridge_id(discovery_info[CONF_SERIAL]) self.bridge_id = normalize_bridge_id(discovery_info.config[CONF_SERIAL])
await self.async_set_unique_id(self.bridge_id) await self.async_set_unique_id(self.bridge_id)
self._abort_if_unique_id_configured( self._abort_if_unique_id_configured(
updates={ updates={
CONF_HOST: discovery_info[CONF_HOST], CONF_HOST: discovery_info.config[CONF_HOST],
CONF_PORT: discovery_info[CONF_PORT], CONF_PORT: discovery_info.config[CONF_PORT],
CONF_API_KEY: discovery_info[CONF_API_KEY], CONF_API_KEY: discovery_info.config[CONF_API_KEY],
} }
) )
self._hassio_discovery = discovery_info self._hassio_discovery = discovery_info.config
return await self.async_step_hassio_confirm() return await self.async_step_hassio_confirm()

View File

@ -57,7 +57,7 @@ from .const import (
DOMAIN, DOMAIN,
SupervisorEntityModel, SupervisorEntityModel,
) )
from .discovery import async_setup_discovery_view from .discovery import HassioServiceInfo, async_setup_discovery_view # noqa: F401
from .handler import HassIO, HassioAPIError, api_data from .handler import HassIO, HassioAPIError, api_data
from .http import HassIOView from .http import HassIOView
from .ingress import async_setup_ingress_view from .ingress import async_setup_ingress_view

View File

@ -2,7 +2,6 @@
from __future__ import annotations from __future__ import annotations
import asyncio import asyncio
from collections.abc import Mapping
from dataclasses import dataclass from dataclasses import dataclass
import logging import logging
from typing import Any from typing import Any
@ -15,7 +14,6 @@ from homeassistant.components.http import HomeAssistantView
from homeassistant.const import ATTR_NAME, ATTR_SERVICE, EVENT_HOMEASSISTANT_START from homeassistant.const import ATTR_NAME, ATTR_SERVICE, EVENT_HOMEASSISTANT_START
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.data_entry_flow import BaseServiceInfo from homeassistant.data_entry_flow import BaseServiceInfo
from homeassistant.helpers.frame import report
from .const import ATTR_ADDON, ATTR_CONFIG, ATTR_DISCOVERY, ATTR_UUID from .const import ATTR_ADDON, ATTR_CONFIG, ATTR_DISCOVERY, ATTR_UUID
from .handler import HassioAPIError from .handler import HassioAPIError
@ -27,26 +25,7 @@ _LOGGER = logging.getLogger(__name__)
class HassioServiceInfo(BaseServiceInfo): class HassioServiceInfo(BaseServiceInfo):
"""Prepared info from hassio entries.""" """Prepared info from hassio entries."""
config: Mapping[str, Any] config: dict[str, Any]
# Used to prevent log flooding. To be removed in 2022.6
_warning_logged: bool = False
def __getitem__(self, name: str) -> Any:
"""
Allow property access by name for compatibility reason.
Deprecated, and will be removed in version 2022.6.
"""
if not self._warning_logged:
report(
f"accessed discovery_info['{name}'] instead of discovery_info.config['{name}']; this will fail in version 2022.6",
exclude_integrations={"hassio"},
error_if_core=False,
level=logging.DEBUG,
)
self._warning_logged = True
return self.config[name]
@callback @callback
@ -121,7 +100,9 @@ class HassIODiscovery(HomeAssistantView):
# Use config flow # Use config flow
await self.hass.config_entries.flow.async_init( await self.hass.config_entries.flow.async_init(
service, context={"source": config_entries.SOURCE_HASSIO}, data=config_data service,
context={"source": config_entries.SOURCE_HASSIO},
data=HassioServiceInfo(config=config_data),
) )
async def async_process_del(self, data): async def async_process_del(self, data):

View File

@ -10,6 +10,7 @@ from motioneye_client.client import (
) )
import voluptuous as vol import voluptuous as vol
from homeassistant.components.hassio import HassioServiceInfo
from homeassistant.config_entries import ( from homeassistant.config_entries import (
SOURCE_REAUTH, SOURCE_REAUTH,
ConfigEntry, ConfigEntry,
@ -162,9 +163,9 @@ class MotionEyeConfigFlow(ConfigFlow, domain=DOMAIN):
"""Handle a reauthentication flow.""" """Handle a reauthentication flow."""
return await self.async_step_user(config_data) return await self.async_step_user(config_data)
async def async_step_hassio(self, discovery_info: dict[str, Any]) -> FlowResult: async def async_step_hassio(self, discovery_info: HassioServiceInfo) -> FlowResult:
"""Handle Supervisor discovery.""" """Handle Supervisor discovery."""
self._hassio_discovery = discovery_info self._hassio_discovery = discovery_info.config
await self._async_handle_discovery_without_unique_id() await self._async_handle_discovery_without_unique_id()
return await self.async_step_hassio_confirm() return await self.async_step_hassio_confirm()

View File

@ -5,6 +5,7 @@ import queue
import voluptuous as vol import voluptuous as vol
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components.hassio import HassioServiceInfo
from homeassistant.const import ( from homeassistant.const import (
CONF_DISCOVERY, CONF_DISCOVERY,
CONF_HOST, CONF_HOST,
@ -14,6 +15,7 @@ from homeassistant.const import (
CONF_PROTOCOL, CONF_PROTOCOL,
CONF_USERNAME, CONF_USERNAME,
) )
from homeassistant.data_entry_flow import FlowResult
from .const import ( from .const import (
ATTR_PAYLOAD, ATTR_PAYLOAD,
@ -93,11 +95,11 @@ class FlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
return self.async_create_entry(title="configuration.yaml", data={}) return self.async_create_entry(title="configuration.yaml", data={})
async def async_step_hassio(self, discovery_info): async def async_step_hassio(self, discovery_info: HassioServiceInfo) -> FlowResult:
"""Receive a Hass.io discovery.""" """Receive a Hass.io discovery."""
await self._async_handle_discovery_without_unique_id() await self._async_handle_discovery_without_unique_id()
self._hassio_discovery = discovery_info self._hassio_discovery = discovery_info.config
return await self.async_step_hassio_confirm() return await self.async_step_hassio_confirm()

View File

@ -4,8 +4,9 @@ import logging
import voluptuous as vol import voluptuous as vol
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components.hassio import HassioServiceInfo
from homeassistant.core import callback from homeassistant.core import callback
from homeassistant.data_entry_flow import AbortFlow from homeassistant.data_entry_flow import AbortFlow, FlowResult
from .const import CONF_INTEGRATION_CREATED_ADDON, CONF_USE_ADDON, DOMAIN from .const import CONF_INTEGRATION_CREATED_ADDON, CONF_USE_ADDON, DOMAIN
@ -48,7 +49,7 @@ class DomainConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
return await self.async_step_on_supervisor() return await self.async_step_on_supervisor()
async def async_step_hassio(self, discovery_info): async def async_step_hassio(self, discovery_info: HassioServiceInfo) -> FlowResult:
"""Receive configuration from add-on discovery info. """Receive configuration from add-on discovery info.
This flow is triggered by the OpenZWave add-on. This flow is triggered by the OpenZWave add-on.

View File

@ -9,6 +9,7 @@ from aiovlc.exceptions import AuthError, ConnectError
import voluptuous as vol import voluptuous as vol
from homeassistant import core, exceptions from homeassistant import core, exceptions
from homeassistant.components.hassio import HassioServiceInfo
from homeassistant.config_entries import ConfigEntry, ConfigFlow from homeassistant.config_entries import ConfigEntry, ConfigFlow
from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PASSWORD, CONF_PORT from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PASSWORD, CONF_PORT
from homeassistant.data_entry_flow import FlowResult from homeassistant.data_entry_flow import FlowResult
@ -151,13 +152,13 @@ class VLCTelnetConfigFlow(ConfigFlow, domain=DOMAIN):
errors=errors, errors=errors,
) )
async def async_step_hassio(self, discovery_info: dict[str, Any]) -> FlowResult: async def async_step_hassio(self, discovery_info: HassioServiceInfo) -> FlowResult:
"""Handle the discovery step via hassio.""" """Handle the discovery step via hassio."""
await self.async_set_unique_id("hassio") await self.async_set_unique_id("hassio")
self._abort_if_unique_id_configured(discovery_info) self._abort_if_unique_id_configured(discovery_info.config)
self.hassio_discovery = discovery_info self.hassio_discovery = discovery_info.config
self.context["title_placeholders"] = {"host": discovery_info[CONF_HOST]} self.context["title_placeholders"] = {"host": discovery_info.config[CONF_HOST]}
return await self.async_step_hassio_confirm() return await self.async_step_hassio_confirm()
async def async_step_hassio_confirm( async def async_step_hassio_confirm(

View File

@ -13,7 +13,7 @@ from zwave_js_server.version import VersionInfo, get_server_version
from homeassistant import config_entries, exceptions from homeassistant import config_entries, exceptions
from homeassistant.components import usb from homeassistant.components import usb
from homeassistant.components.hassio import is_hassio from homeassistant.components.hassio import HassioServiceInfo, is_hassio
from homeassistant.const import CONF_NAME, CONF_URL from homeassistant.const import CONF_NAME, CONF_URL
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.data_entry_flow import ( from homeassistant.data_entry_flow import (
@ -430,7 +430,7 @@ class ConfigFlow(BaseZwaveJSFlow, config_entries.ConfigFlow, domain=DOMAIN):
step_id="manual", data_schema=get_manual_schema(user_input), errors=errors step_id="manual", data_schema=get_manual_schema(user_input), errors=errors
) )
async def async_step_hassio(self, discovery_info: dict[str, Any]) -> FlowResult: async def async_step_hassio(self, discovery_info: HassioServiceInfo) -> FlowResult:
"""Receive configuration from add-on discovery info. """Receive configuration from add-on discovery info.
This flow is triggered by the Z-Wave JS add-on. This flow is triggered by the Z-Wave JS add-on.
@ -438,7 +438,9 @@ class ConfigFlow(BaseZwaveJSFlow, config_entries.ConfigFlow, domain=DOMAIN):
if self._async_in_progress(): if self._async_in_progress():
return self.async_abort(reason="already_in_progress") return self.async_abort(reason="already_in_progress")
self.ws_address = f"ws://{discovery_info['host']}:{discovery_info['port']}" self.ws_address = (
f"ws://{discovery_info.config['host']}:{discovery_info.config['port']}"
)
try: try:
version_info = await async_get_version_info(self.hass, self.ws_address) version_info = await async_get_version_info(self.hass, self.ws_address)
except CannotConnect: except CannotConnect:

View File

@ -34,6 +34,7 @@ import homeassistant.util.uuid as uuid_util
if TYPE_CHECKING: if TYPE_CHECKING:
from homeassistant.components.dhcp import DhcpServiceInfo from homeassistant.components.dhcp import DhcpServiceInfo
from homeassistant.components.hassio import HassioServiceInfo
from homeassistant.components.mqtt.discovery import MqttServiceInfo from homeassistant.components.mqtt.discovery import MqttServiceInfo
from homeassistant.components.ssdp import SsdpServiceInfo from homeassistant.components.ssdp import SsdpServiceInfo
from homeassistant.components.usb import UsbServiceInfo from homeassistant.components.usb import UsbServiceInfo
@ -1353,10 +1354,10 @@ class ConfigFlow(data_entry_flow.FlowHandler):
) )
async def async_step_hassio( async def async_step_hassio(
self, discovery_info: DiscoveryInfoType self, discovery_info: HassioServiceInfo
) -> data_entry_flow.FlowResult: ) -> data_entry_flow.FlowResult:
"""Handle a flow initialized by HASS IO discovery.""" """Handle a flow initialized by HASS IO discovery."""
return await self.async_step_discovery(discovery_info) return await self.async_step_discovery(discovery_info.config)
async def async_step_homekit( async def async_step_homekit(
self, discovery_info: ZeroconfServiceInfo self, discovery_info: ZeroconfServiceInfo

View File

@ -3,7 +3,7 @@ import aiohttp
from homeassistant import config_entries, data_entry_flow from homeassistant import config_entries, data_entry_flow
from homeassistant.components.adguard.const import DOMAIN from homeassistant.components.adguard.const import DOMAIN
from homeassistant.components.hassio.discovery import HassioServiceInfo from homeassistant.components.hassio import HassioServiceInfo
from homeassistant.config_entries import SOURCE_USER from homeassistant.config_entries import SOURCE_USER
from homeassistant.const import ( from homeassistant.const import (
CONF_HOST, CONF_HOST,

View File

@ -6,7 +6,7 @@ from unittest.mock import patch
from homeassistant import config_entries, data_entry_flow, setup from homeassistant import config_entries, data_entry_flow, setup
from homeassistant.components.almond import config_flow from homeassistant.components.almond import config_flow
from homeassistant.components.almond.const import DOMAIN from homeassistant.components.almond.const import DOMAIN
from homeassistant.components.hassio.discovery import HassioServiceInfo from homeassistant.components.hassio import HassioServiceInfo
from homeassistant.const import CONF_CLIENT_ID, CONF_CLIENT_SECRET from homeassistant.const import CONF_CLIENT_ID, CONF_CLIENT_SECRET
from homeassistant.helpers import config_entry_oauth2_flow from homeassistant.helpers import config_entry_oauth2_flow
@ -90,7 +90,7 @@ async def test_abort_if_existing_entry(hass):
assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT
assert result["reason"] == "single_instance_allowed" assert result["reason"] == "single_instance_allowed"
result = await flow.async_step_hassio({}) result = await flow.async_step_hassio(HassioServiceInfo(config={}))
assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT
assert result["reason"] == "single_instance_allowed" assert result["reason"] == "single_instance_allowed"

View File

@ -18,7 +18,7 @@ from homeassistant.components.deconz.const import (
CONF_MASTER_GATEWAY, CONF_MASTER_GATEWAY,
DOMAIN as DECONZ_DOMAIN, DOMAIN as DECONZ_DOMAIN,
) )
from homeassistant.components.hassio.discovery import HassioServiceInfo from homeassistant.components.hassio import HassioServiceInfo
from homeassistant.components.ssdp import ATTR_UPNP_MANUFACTURER_URL, ATTR_UPNP_SERIAL from homeassistant.components.ssdp import ATTR_UPNP_MANUFACTURER_URL, ATTR_UPNP_SERIAL
from homeassistant.config_entries import ( from homeassistant.config_entries import (
SOURCE_HASSIO, SOURCE_HASSIO,

View File

@ -2,7 +2,7 @@
from http import HTTPStatus from http import HTTPStatus
from unittest.mock import Mock, patch from unittest.mock import Mock, patch
from homeassistant.components.hassio.discovery import HassioServiceInfo from homeassistant.components.hassio import HassioServiceInfo
from homeassistant.components.hassio.handler import HassioAPIError from homeassistant.components.hassio.handler import HassioAPIError
from homeassistant.const import EVENT_HOMEASSISTANT_START from homeassistant.const import EVENT_HOMEASSISTANT_START
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
@ -49,7 +49,8 @@ async def test_hassio_discovery_startup(hass, aioclient_mock, hassio_client):
assert aioclient_mock.call_count == 2 assert aioclient_mock.call_count == 2
assert mock_mqtt.called assert mock_mqtt.called
mock_mqtt.assert_called_with( mock_mqtt.assert_called_with(
{ HassioServiceInfo(
config={
"broker": "mock-broker", "broker": "mock-broker",
"port": 1883, "port": 1883,
"username": "mock-user", "username": "mock-user",
@ -58,6 +59,7 @@ async def test_hassio_discovery_startup(hass, aioclient_mock, hassio_client):
"addon": "Mosquitto Test", "addon": "Mosquitto Test",
} }
) )
)
async def test_hassio_discovery_startup_done(hass, aioclient_mock, hassio_client): async def test_hassio_discovery_startup_done(hass, aioclient_mock, hassio_client):
@ -110,7 +112,8 @@ async def test_hassio_discovery_startup_done(hass, aioclient_mock, hassio_client
assert aioclient_mock.call_count == 2 assert aioclient_mock.call_count == 2
assert mock_mqtt.called assert mock_mqtt.called
mock_mqtt.assert_called_with( mock_mqtt.assert_called_with(
{ HassioServiceInfo(
config={
"broker": "mock-broker", "broker": "mock-broker",
"port": 1883, "port": 1883,
"username": "mock-user", "username": "mock-user",
@ -119,6 +122,7 @@ async def test_hassio_discovery_startup_done(hass, aioclient_mock, hassio_client
"addon": "Mosquitto Test", "addon": "Mosquitto Test",
} }
) )
)
async def test_hassio_discovery_webhook(hass, aioclient_mock, hassio_client): async def test_hassio_discovery_webhook(hass, aioclient_mock, hassio_client):
@ -160,23 +164,7 @@ async def test_hassio_discovery_webhook(hass, aioclient_mock, hassio_client):
assert aioclient_mock.call_count == 2 assert aioclient_mock.call_count == 2
assert mock_mqtt.called assert mock_mqtt.called
mock_mqtt.assert_called_with( mock_mqtt.assert_called_with(
{ HassioServiceInfo(
"broker": "mock-broker",
"port": 1883,
"username": "mock-user",
"password": "mock-pass",
"protocol": "3.1.1",
"addon": "Mosquitto Test",
}
)
async def test_service_info_compatibility(hass, caplog):
"""Test compatibility with old-style dict.
To be removed in 2022.6
"""
discovery_info = HassioServiceInfo(
config={ config={
"broker": "mock-broker", "broker": "mock-broker",
"port": 1883, "port": 1883,
@ -186,12 +174,4 @@ async def test_service_info_compatibility(hass, caplog):
"addon": "Mosquitto Test", "addon": "Mosquitto Test",
} }
) )
)
# Ensure first call get logged
assert discovery_info["broker"] == "mock-broker"
assert "Detected code that accessed discovery_info['broker']" in caplog.text
# Ensure second call doesn't get logged
caplog.clear()
assert discovery_info["broker"] == "mock-broker"
assert "Detected code that accessed discovery_info['broker']" not in caplog.text

View File

@ -8,7 +8,7 @@ from motioneye_client.client import (
) )
from homeassistant import config_entries, data_entry_flow from homeassistant import config_entries, data_entry_flow
from homeassistant.components.hassio.discovery import HassioServiceInfo from homeassistant.components.hassio import HassioServiceInfo
from homeassistant.components.motioneye.const import ( from homeassistant.components.motioneye.const import (
CONF_ADMIN_PASSWORD, CONF_ADMIN_PASSWORD,
CONF_ADMIN_USERNAME, CONF_ADMIN_USERNAME,

View File

@ -7,6 +7,7 @@ import voluptuous as vol
from homeassistant import config_entries, data_entry_flow from homeassistant import config_entries, data_entry_flow
from homeassistant.components import mqtt from homeassistant.components import mqtt
from homeassistant.components.hassio import HassioServiceInfo
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
@ -124,7 +125,9 @@ async def test_hassio_ignored(hass: HomeAssistant) -> None:
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
mqtt.DOMAIN, mqtt.DOMAIN,
data={"addon": "Mosquitto", "host": "mock-mosquitto", "port": "1883"}, data=HassioServiceInfo(
config={"addon": "Mosquitto", "host": "mock-mosquitto", "port": "1883"}
),
context={"source": config_entries.SOURCE_HASSIO}, context={"source": config_entries.SOURCE_HASSIO},
) )
assert result assert result
@ -140,14 +143,16 @@ async def test_hassio_confirm(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
"mqtt", "mqtt",
data={ data=HassioServiceInfo(
config={
"addon": "Mock Addon", "addon": "Mock Addon",
"host": "mock-broker", "host": "mock-broker",
"port": 1883, "port": 1883,
"username": "mock-user", "username": "mock-user",
"password": "mock-pass", "password": "mock-pass",
"protocol": "3.1.1", "protocol": "3.1.1",
}, }
),
context={"source": config_entries.SOURCE_HASSIO}, context={"source": config_entries.SOURCE_HASSIO},
) )
assert result["type"] == "form" assert result["type"] == "form"

View File

@ -4,7 +4,7 @@ from unittest.mock import patch
import pytest import pytest
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components.hassio.discovery import HassioServiceInfo from homeassistant.components.hassio import HassioServiceInfo
from homeassistant.components.hassio.handler import HassioAPIError from homeassistant.components.hassio.handler import HassioAPIError
from homeassistant.components.ozw.config_flow import TITLE from homeassistant.components.ozw.config_flow import TITLE
from homeassistant.components.ozw.const import DOMAIN from homeassistant.components.ozw.const import DOMAIN

View File

@ -8,6 +8,7 @@ from aiovlc.exceptions import AuthError, ConnectError
import pytest import pytest
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components.hassio import HassioServiceInfo
from homeassistant.components.vlc_telnet.const import DOMAIN from homeassistant.components.vlc_telnet.const import DOMAIN
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import ( from homeassistant.data_entry_flow import (
@ -278,13 +279,15 @@ async def test_hassio_flow(hass: HomeAssistant) -> None:
"homeassistant.components.vlc_telnet.async_setup_entry", "homeassistant.components.vlc_telnet.async_setup_entry",
return_value=True, return_value=True,
) as mock_setup_entry: ) as mock_setup_entry:
test_data = { test_data = HassioServiceInfo(
config={
"password": "test-password", "password": "test-password",
"host": "1.1.1.1", "host": "1.1.1.1",
"port": 8888, "port": 8888,
"name": "custom name", "name": "custom name",
"addon": "vlc", "addon": "vlc",
} }
)
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
@ -298,8 +301,8 @@ async def test_hassio_flow(hass: HomeAssistant) -> None:
result2 = await hass.config_entries.flow.async_configure(result["flow_id"], {}) result2 = await hass.config_entries.flow.async_configure(result["flow_id"], {})
assert result2["type"] == RESULT_TYPE_CREATE_ENTRY assert result2["type"] == RESULT_TYPE_CREATE_ENTRY
assert result2["title"] == test_data["name"] assert result2["title"] == test_data.config["name"]
assert result2["data"] == test_data assert result2["data"] == test_data.config
assert len(mock_setup_entry.mock_calls) == 1 assert len(mock_setup_entry.mock_calls) == 1
@ -320,7 +323,7 @@ async def test_hassio_already_configured(hass: HomeAssistant) -> None:
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_HASSIO}, context={"source": config_entries.SOURCE_HASSIO},
data=entry_data, data=HassioServiceInfo(config=entry_data),
) )
await hass.async_block_till_done() await hass.async_block_till_done()
@ -354,13 +357,15 @@ async def test_hassio_errors(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_HASSIO}, context={"source": config_entries.SOURCE_HASSIO},
data={ data=HassioServiceInfo(
config={
"password": "test-password", "password": "test-password",
"host": "1.1.1.1", "host": "1.1.1.1",
"port": 8888, "port": 8888,
"name": "custom name", "name": "custom name",
"addon": "vlc", "addon": "vlc",
}, }
),
) )
await hass.async_block_till_done() await hass.async_block_till_done()

View File

@ -8,20 +8,18 @@ from zwave_js_server.version import VersionInfo
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components import usb from homeassistant.components import usb
from homeassistant.components.hassio.discovery import HassioServiceInfo from homeassistant.components.hassio import HassioServiceInfo
from homeassistant.components.hassio.handler import HassioAPIError from homeassistant.components.hassio.handler import HassioAPIError
from homeassistant.components.zwave_js.config_flow import SERVER_VERSION_TIMEOUT, TITLE from homeassistant.components.zwave_js.config_flow import SERVER_VERSION_TIMEOUT, TITLE
from homeassistant.components.zwave_js.const import DOMAIN from homeassistant.components.zwave_js.const import DOMAIN
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
ADDON_DISCOVERY_INFO = HassioServiceInfo( ADDON_DISCOVERY_INFO = {
config={
"addon": "Z-Wave JS", "addon": "Z-Wave JS",
"host": "host1", "host": "host1",
"port": 3001, "port": 3001,
} }
)
USB_DISCOVERY_INFO = usb.UsbServiceInfo( USB_DISCOVERY_INFO = usb.UsbServiceInfo(
@ -285,7 +283,7 @@ async def test_supervisor_discovery(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_HASSIO}, context={"source": config_entries.SOURCE_HASSIO},
data=ADDON_DISCOVERY_INFO, data=HassioServiceInfo(config=ADDON_DISCOVERY_INFO),
) )
with patch( with patch(
@ -325,7 +323,7 @@ async def test_supervisor_discovery_cannot_connect(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_HASSIO}, context={"source": config_entries.SOURCE_HASSIO},
data=ADDON_DISCOVERY_INFO, data=HassioServiceInfo(config=ADDON_DISCOVERY_INFO),
) )
assert result["type"] == "abort" assert result["type"] == "abort"
@ -347,7 +345,7 @@ async def test_clean_discovery_on_user_create(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_HASSIO}, context={"source": config_entries.SOURCE_HASSIO},
data=ADDON_DISCOVERY_INFO, data=HassioServiceInfo(config=ADDON_DISCOVERY_INFO),
) )
assert result["type"] == "form" assert result["type"] == "form"
@ -410,7 +408,7 @@ async def test_abort_discovery_with_existing_entry(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_HASSIO}, context={"source": config_entries.SOURCE_HASSIO},
data=ADDON_DISCOVERY_INFO, data=HassioServiceInfo(config=ADDON_DISCOVERY_INFO),
) )
assert result["type"] == "abort" assert result["type"] == "abort"
@ -434,7 +432,7 @@ async def test_abort_hassio_discovery_with_existing_flow(
result2 = await hass.config_entries.flow.async_init( result2 = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_HASSIO}, context={"source": config_entries.SOURCE_HASSIO},
data=ADDON_DISCOVERY_INFO, data=HassioServiceInfo(config=ADDON_DISCOVERY_INFO),
) )
assert result2["type"] == "abort" assert result2["type"] == "abort"
@ -629,7 +627,7 @@ async def test_discovery_addon_not_running(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_HASSIO}, context={"source": config_entries.SOURCE_HASSIO},
data=ADDON_DISCOVERY_INFO, data=HassioServiceInfo(config=ADDON_DISCOVERY_INFO),
) )
assert result["step_id"] == "hassio_confirm" assert result["step_id"] == "hassio_confirm"
@ -711,7 +709,7 @@ async def test_discovery_addon_not_installed(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_HASSIO}, context={"source": config_entries.SOURCE_HASSIO},
data=ADDON_DISCOVERY_INFO, data=HassioServiceInfo(config=ADDON_DISCOVERY_INFO),
) )
assert result["step_id"] == "hassio_confirm" assert result["step_id"] == "hassio_confirm"
@ -792,7 +790,7 @@ async def test_abort_usb_discovery_with_existing_flow(hass, supervisor, addon_op
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_HASSIO}, context={"source": config_entries.SOURCE_HASSIO},
data=ADDON_DISCOVERY_INFO, data=HassioServiceInfo(config=ADDON_DISCOVERY_INFO),
) )
assert result["type"] == "form" assert result["type"] == "form"

View File

@ -7,6 +7,7 @@ from unittest.mock import AsyncMock, Mock, patch
import pytest import pytest
from homeassistant import config_entries, data_entry_flow, loader from homeassistant import config_entries, data_entry_flow, loader
from homeassistant.components.hassio import HassioServiceInfo
from homeassistant.const import EVENT_HOMEASSISTANT_STARTED, EVENT_HOMEASSISTANT_STOP from homeassistant.const import EVENT_HOMEASSISTANT_STARTED, EVENT_HOMEASSISTANT_STOP
from homeassistant.core import CoreState, callback from homeassistant.core import CoreState, callback
from homeassistant.data_entry_flow import RESULT_TYPE_ABORT, BaseServiceInfo from homeassistant.data_entry_flow import RESULT_TYPE_ABORT, BaseServiceInfo
@ -2356,7 +2357,7 @@ async def test_async_setup_update_entry(hass):
(config_entries.SOURCE_HOMEKIT, BaseServiceInfo()), (config_entries.SOURCE_HOMEKIT, BaseServiceInfo()),
(config_entries.SOURCE_DHCP, BaseServiceInfo()), (config_entries.SOURCE_DHCP, BaseServiceInfo()),
(config_entries.SOURCE_ZEROCONF, BaseServiceInfo()), (config_entries.SOURCE_ZEROCONF, BaseServiceInfo()),
(config_entries.SOURCE_HASSIO, {}), (config_entries.SOURCE_HASSIO, HassioServiceInfo(config={})),
), ),
) )
async def test_flow_with_default_discovery(hass, manager, discovery_source): async def test_flow_with_default_discovery(hass, manager, discovery_source):